1.介绍
mydumper与myloader是github上的一个开源工具,用于mysql数据库的备份与恢复。
相比于mysql自带的备份与恢复工具,mydumper和myloader的优势在于使用的是多线程进行备份与恢复,所以它的效率更高。
mydumper:对指定的库表进行备份
myloader:利用mydumper备份的文件进行恢复
2.用法
用法参考官方文档
mydumper文档地址:
https://github.com/mydumper/mydumper/blob/master/docs/mydumper_usage.rst
myloader文档地址:https://github.com/mydumper/mydumper/blob/master/docs/myloader_usage.rst
这里列举一些常用的选项
mydumper选项
选项 | 描述 |
---|---|
-u -p -h -P | 与mysql一致,用于指定要备份的mysql的用户名、密码、主机和端口 |
-B | 要备份的库 |
-T | 要备份的表,多个用逗号分隔,如果没有指定-T,则是备份整个库 |
-t | 备份时使用的线程数,默认为4,根据cpu核数决定;多线程可同时对多个表进行备份 |
-o | 备份文件的输出目录 |
-c | 压缩导出的备份文件,默认使用gzip压缩 |
-v | 是一个数字,表示备份时日志的输出级别,0不输出提示;1输出错误信息;2输出警告和错误信息;3输出所有信息 |
-F | 块大小,单位MB,备份时根据此信息将一个表拆分为多个备份文件。假设现在有一个1TB大小的表,块大小设置为1024MB(1GB),那么会生成约1024个该表的备份文件,每个1GB,如果开启了压缩(-c),则每个文件可能只有几百MB |
-k | 不使用共享读锁,这样备份时不会阻塞业务,但可能导致备份数据不一致 |
myloader选项
基本选项与mydumper一致,如-u -p -h -P指定mysql信息,-v指定日志级别等
选项 | 描述 | |
---|---|---|
-r | 指定执行insert语句时一次插入的记录条数。因为使用的是inert into ... values(),()... 如果一次性插入过多数据,可能导致sql过大,mysql不能处理,与max_allowed_packet 有关 | |
-q | 每个事务的查询数,默认1000。我猜测恢复时可能开启了多个事务来插入数据,假设-r设为1000,-q也设为1000,则一个事务会插入十万条数据 | |
-d | 备份文件所在的目录,即mydumper使用-o指定的文件输出位置 | |
-o | 恢复时如果表已经存在了,则会删除表再恢复 |
3.实际使用
一般,我们进行备份恢复时,因为库表较大,通常会让程序在后台运行,即配合nohup使用。
3.1执行情况监控
命令执行后,任务就在后台开始执行了,可以使用以下命令查看情况
-
jobs
查看后台进行的任务,可判断任务是否执行完 -
du -h
查看目录大小,我们可以进入备份文件所在目录的父目录,查看备份文件目录的大小 -
ps -ef | grep mydumper
查看mydumper进程是否存在 -
top
查看mydumper进程的执行信息,可以通过cpu使用率判断当前有几个线程在备份,如400则表示有4个线程在进行备份操作 -
vi
或vim
最有效的监控方式还是查看日志文件,通过日志文件的是否有警告和错误来进行决策,一般搜索critical和warn关键字来判断备份或恢复的过程中是否出现问题。
3.2备份整个库
nohup mydumper -u zhuzi -p '123456' -P 3306 -h 192.168.86.111 -B db01 -o /data/backup/db01/ -c -t 8 -v 3 > /data/log/db01-export-2024-04-13.log 2>&1 &
我这里备份的是db01整个库,将备份文件输出到/data/backup/db01目录下,使用了8个线程,开启了压缩和打印全部日志信息,并将日志信息重定向到了/data/log/db01-export-2024-04-13.log文件中
3.3备份指定表
nohup mydumper -u zhuzi -p '123456' -P 3306 -h 192.168.86.111 -B db02 -T t1,t2,t3 -o /data/backup/db02/ -c -t 8 -v 3 > /data/log/db02-export-2024-04-13.log 2>&1 &
针对db02库下的t1、t2和t3三个表进行备份
3.4备份并排除某些表
在mydumper中,没有什么exclude选项,而是通过正则表达式来进行匹配的
nohup mydumper -u zhuzi -p '123456' -P 3306 -h 192.168.86.111 --regex '^(?=(?:(db01\.)))(?!(?:(db01\.t1$|db01\.t2$)))' -o /data/backup/db01/ -c -t 8 -v 3 > /data/log/db01-export-2024-04-13.log 2>&1 &
通过–regex指定匹配库表的正则表达式,使用后就不需要使用-B和-T来指定库表了
这里备份db01库下除了t1和t2之外的所有表
3.5恢复
nohup myloader -u zhuzi -p '123456' -P 3306 -h 192.168.86.111 -B db01 -d /data/backup/db01/ -t 6 -q 1 -o -v 3 > /data/log/db01-import-2024-04-13.log 2>&1 &
这里-q指定为1,即一个事务只执行一个插入操作(效率低,稳妥起见),-o则覆盖已存在的表
恢复时,指定好要恢复的库和备份文件的位置即可,他完全是根据你的备份文件来恢复的,没有过滤库表的功能,因此,如果此时只想恢复某个表,但备份文件是整个库或还有其他表的信息,则需要针对该表重新备份。
4.备份恢复的一些注意事项
- 恢复过程中,如果日志显示表已存在了,则需要添加-o参数覆盖表
- 备份往往比恢复要快很多,毕竟一个是查询,一个是插入。稳妥起见,把线程数、查询数和一次插入数进行合理设置,如果某个大表恢复了一大半,结果mysql连接断开了,那真是…
- 对于迁移数据到分布式数据库,计算节点通常设置了一些策略,如表必须有主键,那么恢复时,如果表没有主键,则会报错。恢复过程中出现了问题,需要注意是否是计算节点的配置导致的
- 注意磁盘大小,备份时,可以使用-c压缩文件,所以磁盘空间要求低;而恢复时,则要求磁盘空间比数据文件要大