mydumper原理和使用

来源:互联网 发布:unity3d游戏开发教程 编辑:程序博客网 时间:2024/04/30 13:46
mydumper是针对MySQL数据库备份的一个轻量级第三方的开源工具,备份方式为逻辑备份。它利用Innodb引擎的MVCC功能实现多线程并发获取一致性数据,能够实现记录级并发,备份速度比mysqldump快10倍。本文主要描述该工具的工作原理和常用命令。

工具对比

下面是一些常用备份工具的对比。



特点

mydumper是一个高性能多线程备份和恢复工具,能够实现记录级的多线程一致性备份。

1:轻量级C语言写的
2:执行速度比mysqldump快10倍
3:事务性和非事务性表一致的快照(适用于0.2.2以上版本)
4:快速的文件压缩
5:支持导出binlog
6:多线程恢复(适用于0.2.1以上版本)
7:以守护进程的工作方式,定时快照和连续二进制日志(适用于0.5.0以上版本)
8:开源 (GNU GPLv3)

工作原理

安装完mydumper之后,会生成2个工具:mydumper和myloader,mydumper用于导出数据,myloader用于导入数据。

mydumper原理



在mydumper进行备份的时候,由一个主线程以及多个备份线程完成。

其主线程的流程是:
<1>连接数据库
<2>FLUSH TABLES WITH READ LOCK 将脏页刷新到磁盘并获得只读锁
<3>START TRANSACTION /!40108 WITH CONSISTENT SNAPSHOT / 开启事物并获取一致性快照
<4>SHOW MASTER STATUS 获得binlog信息
<5>创建子线程并连接数据库
<6>为子线程分配任务并push到队列中
<7>UNLOCK TABLES / FTWRL / 释放锁
子线程的主要流程是:
<1>连接数据库
<2>SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE
<3>START TRANSACTION /!40108 WITH CONSISTENT SNAPSHOT /
<4>从队列中pop任务并执行


myloader原理





备份恢复命令


【版本是0.9.1】

 
导出
mydumper -h 192.168.100.83 -P 3306 -u root -p '123456' --rows=100000 -e -B sbtest -t 8 -o /tmp/bak_3306                      #导出单库所有表
mydumper -h 192.168.100.83 -P 3306 -u root -p '123456' --rows=100000 -e -B sbtest -T sbtest1,sbtest2 -t 8 -o /tmp/bak_3306   #导出单库几个表
mydumper -h 192.168.100.83 -P 3306 -u root -p '123456' --rows=100000 -e -t 8 -o /tmp/bak_3306                                #导出所有库
mydumper -h 192.168.100.83 -P 3306 -u root -p '123456' --rows=100000 -e --regex 'db1|db2' -t 8 -o /tmp/bak_3306              #导出指定库
mydumper -h 192.168.100.83 -P 3306 -u root -p '123456' --rows=100000 -e --regex '^(?!(mysql|test))' -t 8 -o /tmp/bak_3306    #导出除mysql、test之外的所有库
-r, --rows                  试图用行块来分割表,导出的每个文件多少行,该参数关闭--chunk-filesize
-F, ----chunk-filesize      试图用块来分割表,会生成一个一个的100M大小的sql备份文件
-e, --build-empty-files     即使表没有数据,也产生一个空文件
-B, --database              指定要还原的数据库
-x, --regex                 正则表达式
-T, --tables-list           需要备份的表,用逗号分隔
-t, --threads               备份执行的线程数,默认4个线程
-o, --outputdir             备份文件输出目录
-D, --daemon                启用守护进程模式

导入
myloader -h 192.168.100.83 -P 3306 -u root -p '123456' -d /tmp/bak_3306 -o -t 8 -e 
-d, --directory               备份文件所在的目录
-o, --overwrite-tables        如果表存在则先删除,使用该参数,需要备份时候要备份表结构,不然还原会找不到表
-t, --threads                 使用的线程数量,默认4个线程
-e, --enable-binlog           启用二进制日志恢复数据,如果不加此参数不会记录binlog

远程导入导出

mydumper -h 192.168.100.83 -P 3306 -u root -p '123456' --rows=100000 -e --regex 'db1|db2' -o /tmp/bak_3306 -t 8 ; myloader -h 127.0.0.1 -P 3308 -u root -p '123456' -d /tmp/bak_3306 -o -t 8 -e


注意事项


<1>为了能够得到一致性的数据,各种备份工具,包括xtrabackup和mydumper,都需要有个短暂给源实例加读锁的过程,正常情况下短暂,但也会有例外,如源实例中存在数据量较大的MyISAM表时,持锁时间会变长。建议在业务低峰期进行。

<2>不是线程开的越多越好,受限于磁盘的IO能力,在使用前做好相关测试评估。
<3>如果在从库恢复,注意导出导入时加上参数-e,否则不会记录binlog,会导致主从数据不一致。
<4>对于单表备份恢复,注意加上参数-r或者-F

<5>在数据导入时,可以将innodb_flush_log_at_trx_commit设置为0来最大限度提高导入性能,在完成数据导入后再将对应的参数调整为原值。


利用mydumper创建主从复制


1、在主库导出数据

mydumper -h 192.168.100.83 -P 3306 -u root -p '123456' --rows=100000 -e -t 8 -o /tmp/bak_3306
2、导入数据
scp -r bak_3306/ 192.168.20.84:/tmp/
myloader -h 192.168.100.84 -P 3306 -u root -p '123456' -d /tmp/bak_3306 -o -t 8 -e
3、查看二进制日志和pos
[root@84 bak_3306]# cat metadata 
Started dump at: 2017-04-14 15:05:52
SHOW MASTER STATUS:
        Log: mysql-bin-83-3306.000021
        Pos: 12679211
        GTID:
SHOW SLAVE STATUS:
        Host: 192.168.20.100
        Log: mysql-bin-83-3306.000014
        Pos: 120
        GTID:
Finished dump at: 2017-04-14 15:05:57
4、配置复制
change master to master_host='192.168.100.83',master_user='slave',master_password='slave123',master_log_file='mysql-bin-83-3306.000021',master_log_pos=12679211;   

start slave;


参考文章

http://baiyangtx.net/2016/09/04/mydumper-principle/
http://www.yunweipai.com/archives/9771.html
http://www.cnblogs.com/zhoujinyi/p/3423641.html


0 0