暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL 备份恢复(三)

JiekeXu之路 2019-04-19
946

前面两篇已经介绍了 MySQL 备份相关的原理与方法,要是还没有来得及看的可以戳此查看MySQL 备份恢复(二),那么今天就接着上一篇的内容继续谈谈备份恢复相关内容之 mydumper 的使用。

 

mydumper 最突出的特性就是可采用多线程并行备份,极大提高了数据导出的速度。其特征之一是在处理过程中需要对列表加以锁定,所以备份时尽量不要选择工作时间,避免引起 DML 阻塞。若是主从架构的话,从库一般处于只读状态,则可以直接在从库上执行备份操作,不会有 DML 堵塞了。


mydumper 特  性

 

多线程备份

因为是多线程逻辑备份,备份后会生成多个备份文件

备份时对 MyISAM 表施加 FTWRL(FLUSH TABLES WITHREAD LOCK),会阻塞 DML 语句

保证备份数据的一致性

支持文件压缩

支持导出 binlog

支持多线程恢复

支持以守护进程模式工作,定时快照和连续二进制日志

支持将备份文件切块


mydumper 备份机制与流程


mydumper  备份也是属于逻辑备份,在进行数据备份时,mydumper  的主逻辑由一个主线程和多个备份子线程共同完成,默认情况下为四个子线程。


其主线程的主要流程为:


1、connect database : 连接数据库;

2、FLUSH TABLES WITH READ LOCK(FTWRL) : 将脏页刷新到磁盘并获得只读锁;

3、START TRANSACTION !40108 WITH CONSISTENT SNAPSHOT : 开启事务并获取一致性快照;

4、SHOW MASTER STATUS :获得 binlog 位点信息;

5、create thread and connect database : 创建子线程并连接数据库;

6、为子线程分配任务并 push 到队列 queue 中;

7、在子线程处理完所有非 InnoDB 表之后,UNLOCK TABLES FTWRL 释放锁;

8、thread.join()  等待子线程结束;

 

备份子线程的主要流程是:

1、connect database 连接数据库;

2、将 session 的隔离级别设置为 Repeatable Read;

3、START TRANSACTION !40108 WITH CONSISTENT SNAPSHOT 开启事务并获取一致性快照;

4、从队列中 pop 任务并执行;

5、在所有非 InnoDB 表执行完之后,将事件通知给主线程。

 

mydumper工作流程图



mydumper 安  装


查看 mydumper 源码,是基于 c  语言编写的,使用 glibc 库,则 mydumper安装所依赖的软件包有 glibc, zlib, pcre, pcre-devel, gcc, gcc-c++, cmake, make, mysql 客户端库文件。



配置好 yum 源,安装依赖包(这里已经配置好本地 yum 源了)


    yum install glib2-devel mysql-devel zlib-devel pcre-devel openssl-devel cmake

    下载 mydumper 源码包,https://launchpad.net/mydumper/+download

    然后编译安装即可。

      tar -zxvf mydumper-0.6.2.tar.gz
      cd mydumper-0.6.2/
      cmake .
      make
      make install


      查看帮助信息

        [root@JiekeXu mydumper-0.6.2]# mydumper --help 
        [root@JiekeXu mydumper-0.6.2]# myloader --help


        使用 --help 便可以查看帮助信息,每个参数基本上都有解释,可以看下图英文介绍。



        mydumper 重要参数说明:

         

          -B, --database                要备份的数据库,不指定则备份所有库
          -T, --tables-list 需要备份的表,名字用逗号隔开
          -o, --outputdir 备份文件输出的目录
          -m, --no-schemas 不备份表结构,只备份数据
          -d, --no-data 备份表结构,不备份数据
          -G, --triggers Dumptriggers备份触发器
          -c, --compress 压缩输出文件
          -e, --build-empty-files 如果表数据是空,还是产生一个空文件(默认无数据则只有表结构文件)
          -x, --regex 使用正则表达式匹配’db.table’
          –less-locking 减少对InnoDB表的锁施加时间
          -h, --host 连接的主机名
          -u, --user 用来备份的用户名
          -p, --password 用户密码
          -P, --port 连接端口
          -S, --socket 使用socket通信时的socket文件
          -t, --threads 开启的备份线程数,默认是4
          -C, --compress-protocol 压缩与mysql通信的数据
          -V, --version 显示版本号

           

          myloader 重要参数说明:


            -d, --directory                   备份文件的文件夹
            -o, --overwrite-tables 如果要恢复的表存在,则先drop掉该表,使用该参数,需要备份时候要备份表结构
            -B, --database 需要还原的数据库
            -e, --enable-binlog 启用还原数据的二进制日志
            -h, --host 主机
            -u, --user 还原的用户
            -p, --password 密码
            -P, --port 端口
            -S, --socket socket文件
            -t, --threads 还原所使用的线程数,默认是4
            -C, --compress-protocol 压缩协议
            -q, --queries-per-transaction 每次事物执行的查询数量,默认是1000
            -V, --version                     显示版本

             

            mydumper 实操备份恢复


            备份全库,命令如下:

              mydumper –u root –p root –o tmp/backup/mydumper/

               

              下面画重点了啊,得仔细看了,备份的目录要先建立好,用户名和密码后均有空格。还有备份后大多都是 .sql 文件记录了数据库的数据信息,schema.sql 文件记录了表结构信息而有个叫 metdata  文件里却记录的是当前文件的  binlog 号和 position  号,用于后期搭建 slave 库

               


              备份指定的数据库 testdb 如下:

               

                mydumper -u root -p root -B testdb -o tmp/backup/mydumper/


                  [root@JiekeXumydumper]# ll
                  total12
                  -rw-r–r--1 root root 132 Apr 19 20:26 metadata
                  -rw-r–r--1 root root 223 Apr 19 20:26 testdb.t-schema.sql
                  -rw-r–r--1 root root 176 Apr 19 20:26 testdb.t.sql

                   

                  还原指定的数据库 testdb 如下:

                   

                    myloader –u root –p root –B testdb –d tmp/backup/mydumper/



                    备份 testdb库下的t 表

                     

                      mydumper -u root -p root -B testdb –T t -o tmp/backup/mydumper/


                      #备份多个表用逗号分隔
                      mydumper -u root -p root -B testdb –T t,t1,t2 -o tmp/backup/mydumper/


                      还原 testdb 库下的 t 表

                       

                        myloader -u root -p root -B testdb –o t -d/tmp/backup/mydumper/

                         

                        备份 testdb 库下的表 t 的表结构

                         

                          mydumper -u root -p root -B testdb –T t –d  -o /tmp/backup/mydumper/

                           

                          备份 testdb 库下的表 t 并压缩

                           

                            mydumper -u root -p root -B testdb –T t –c  -o /tmp/backup/mydumper/

                             

                            注意:建议备份恢复的时候加参数-v 3,显示详细的日志。

                             

                            那么,今天也就讲到这里了,还有很多场景案例也许没有涉及到,但限于篇幅等有机会在说吧,XtraBackup 等备份工具等下次在介绍,保持关注就可以了!

                             

                            参考资料:


                            https://cloud.tencent.com/developer/article/1149245

                            https://www.cnblogs.com/linuxnote/p/3817698.html

                            相关文章:
                            MySQL 备份恢复(一)
                            MySQL 备份恢复(二)
                            MySQL 备份恢复(三)
                            MySQL 备份恢复(四)

                            最后修改时间:2020-11-02 16:48:36
                            文章转载自JiekeXu之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                            评论