MyDumper实战分享

一、前言

说起MySQL的逻辑备份,一般大家用的最多的是mysqldump,MySQL官方提供的逻辑导出的工具,简单易用,可以产生一致性备份。但是mysqldump只能单线程导出,导出速度有限。为了提升逻辑备份速度,MySQL官方推出了mysqlpump,支持多线程导出,一定程度上提升了导出速度。但是,mysqlpump只支持表级别的并行导出,并且对于导入的场景无法多线程并行,速度提升有限。mydumper/myloader是由MySQL、Facebook等公司开发的开源mysql数据导出导入工具,多线程导出的并行度不再局限于表,导入时同样也支持多线程,大大提升了数据导出和导入的速度。作为进阶的MySQL DBA,不能只会用mysqldump了,mydumper也应该熟练掌握,本文将分享mydumper的实战技巧。

二、下载安装

mydumper采用C语言编写,可以基于源码编译安装。此外,官方也提供了rpm包安装。

mydumper源码编译安装:
1. 源码包下载
https://github.com/mydumper/mydumper/tags

2. 依赖安装
yum install -y cmake gcc gcc-c++ git make
yum install -y glib2-devel openssl-devel pcre-devel zlib-devel libzstd-devel
yum install -y mysql-devel

3. 编译安装
cmake .
make && make install

4. 编译好后缺少库文件
ln -s /usr/local/mysql/lib/libmysqlclient.so.21.2.31 /usr/lib/libmysqlclient.so.21
ln -s /usr/local/mysql/lib/private/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s /usr/local/mysql/lib/private/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1

5.安装成功
#mydumper -V
mydumper v0.15.1-3, built against MySQL 8.0.31 with SSL support

三、常用参数

mydumper常用参数
-B 指定数据库 
-G 导出trigger  
-E 导出event  
-R 导出routine
-m 只导出数据,不导出建库建表语句
-d 仅仅导出建表结构和建库语句  
-c 压缩(gzip-x 正则,比如备份多个指定的库:-x 'test|mysql',比如指定某些库不参与备份:-x '^(?!(sys|mysql))'   
-T 指定表,如-T test.t1  
-t 并发线程数,默认4 
-r 定义行数,按此行数对表进行分块并行导出,该选项会使-F失效
-F 定义将表导出文件进行分块的大小,默认单位是 MB 
-l 设置长查询的阈值,单位s,默认60s  
-K 超过-l设定的时间阈值,则kill阻塞备份进程的会话  
--less-locking 减少对InnoDB表的加锁时间
-k, --no-locks 不执行临时的只读锁,会导致备份不一致  
--trx-consistency-only 代表本次备份只对事务表做一致性保证  
--skip-tz-utc 不加的话,会在dump的时候加上SET TIME_ZONE='+00:00',对于timestamp字段需要加上该选项  
myloader常用参数
-e 导入的时候会记录binlog  
-t 并发线程数,默认也是4 
-o 导入时如果表已存在则drop掉

四、数据迁移实战

以下是mydumper/myloader在几个常用数据迁移场景的命令,可以直接复制使用。mydumper默认按表导出sql文件,也可以直接拿导出的sql文件到数据库中使用source命令导入。

1. 全实例导出与导入
mydumper -h $host -u $user -p $password -G -E -R -o /backup/dumpfile --less-locking   
myloader -h $host -u $user -p $password -e -d /backup/dumpfile 

2. 单库导出与导入
mydumper -h $host -u $user -p $password -B test2 -o /backup/shemafile --less-locking  
myloader -h $host -u $user -p $password -e -d /backup/schemafile

3. 指定表导出与导入
mydumper -h $host -u $user -p $password -T test.sbtest1 -o /backup/tablefile --less-locking
myloader -h $host -u $user -p $password -e -d /backup/tablefile

4. 只导表结构,不导数据
mydumper -h $host -u $user -p $password -B test2 -d -o /backup/ddlfile --less-locking
myloader -h $host -u $user -p $password -e -d /backup/ddlfile

5. 只导数据,不导表结构
mydumper -h $host -u $user -p $password -T test.sbtest1 -m -o /backup/datafile --less-locking
myloader -h $host -u $user -p $password -e -d /backup/datafile

6. 单表分块并行导出,并发度8,按一千万行对表分块并行导出
mydumper -h $host -u $user -p $password -T test2.sbtest1 -r 10000000 -t 8 -o /backup/tablefile --less-locking
myloader -h $host -u $user -p $password -e -d /backup/tablefile

五、其他注意事项

以下是我在使用和研究这个工具中总结的几点注意事项:

1. 实际应用中线上环境大部分都是主从或mgr架构,在主库导入时需要加上-e参数,否则默认是不会记录binlog,主库导入的数据也就不会同步到备库;
2. -t参数可以设置并发的线程数,默认是4。需要注意的是,不加-r或-F参数的情况下,也是按表进行并行导出导入。使用-r或-F参数可以将单表进行分块并行导出导入;
3. 导出时可以加上-c参数对导出结果进行压缩,默认是gizp压缩方式,但会消耗一定的压缩时间;
4. 实际使用中建议加上--less-locking参数,这将把innodb表和非innodb表的导出分开,非innodb表导完后先unlock tables再导innodb表,由于实际使用中几乎很少非innodb表,
这将大大减少全局读锁FTWRL的锁定时间;
5. mydumper提供了-k参数不加FTWRL锁,会导致备份不一致。但实际上导出的时候会把会话的隔离级别设置为REPEATABLE READ,所以理论上对于innodb表的导出仍然是一致性的;
6. 线上环境建议到备库操作,毕竟FTWRL对业务可能产生较大的影响;

posted @ 2024-03-30 10:57  海布里_MySQL  阅读(38)  评论(0编辑  收藏  举报