前言
mydumper和Percona XtraBackup都是mysql备份还原的工具
这是常用的mysql备份方式对比
最近在整关于mysql备份还原的方案,自己简单测试了mydumper和Percona XtraBackup,关于他们的原理,这里不展开赘述。
测试
两个库 testdb1, testdb2。 testdb1库: 两张表 user1, user2 (各50万条数据) testdb2: 两张表user3, user4(各50万条)
测试 同时备份testdb1全库, testdb2.user4表,测试时间
测试结果
下面是对比结果
| 方案 | 链接 | 可选多个数据库/表 | 支持压缩 | 增量备份 | 压缩备份时间 | 还原时间 | 还原方式 | 备份文件是否可读 |
|---|---|---|---|---|---|---|---|---|
| mydumper | github.com/mydumper/my… | 可一句执行 | y | n | 0.934s | 5.176s | 覆盖 | y |
| Percona XtraBackup | docs.percona.com/percona-xtr… | 可一句执行 | y | y | 3.810s | 无 | 覆盖 | n |
使用
mydumper
备份
命令
# 此命令没有备份到数据库testdb1
mydumper -u root -h 192.168.44.140 -P 33060 -p 123456 -B testdb1 -T testdb2.user4 -o /root/backup
# 备份库testdb1,但是排除user1表
mydumper -u root -h 192.168.44.140 -P 33060 -p 123456 --regex '^(?=(?:(testdb1\.)))(?!(?:(testdb1\.user1$)))' -o /root/backup
# 备份库testdb1, 和testdb2.user4
mydumper -u root -h 192.168.44.140 -P 33060 -p 123456 --regex '^(?=(?:(testdb1\.|testdb2\.user4$)))' -o /root/backup
# 备份库testdb1, 和testdb2.user4 压缩
mydumper -u root -h 192.168.44.140 -P 33060 -p 123456 --regex '^(?=(?:(testdb1\.|testdb2\.user4$)))' -o /root/backup -c
# docker容器运行
docker run \
-v /root/backup:/data \
mydumper/mydumper:latest \
mydumper -u root -h 192.168.44.140 -P 33060 -p 123456 --regex '^(?=(?:(testdb1\.|testdb2\.user4$)))' -o data -c
参数介绍
Usage:
mydumper [OPTION...] multi-threaded MySQL dumping
Help Options:
-?, --help Show help options
Application Options:
-B, --database 需要备份的数据库,一个数据库一条命令备份,要不就是备份所有数据库,包括mysql。
-T, --tables-list 需要备份的表,用逗号分隔。
-o, --outputdir 备份文件目录
-s, --statement-size 生成插入语句的字节数,默认1000000,这个参数不能太小,不然会报 Row bigger than statement_size for tools.t_serverinfo
-r, --rows 试图用行块来分割表,该参数关闭--chunk-filesize
-F, --chunk-filesize 行块分割表的文件大小,单位是MB
-c, --compress 压缩输出文件
-e, --build-empty-files 即使表没有数据,也产生一个空文件
-x, --regex 正则表达式匹配,如'db.table'
-i, --ignore-engines 忽略的存储引擎,用逗号分隔
-m, --no-schemas 不导出表结构
-d, --no-data 不导出表数据
-G, --triggers 导出触发器
-E, --events 导出事件
-R, --routines 导出存储过程
-k, --no-locks 不执行共享读锁 警告:这将导致不一致的备份
--less-locking 减到最小的锁在innodb表上.
-l, --long-query-guard 设置长查询时间,默认60秒,超过该时间则会报错:There are queries in PROCESSLIST running longer than 60s, aborting dump
-K, --kill-long-queries kill掉长时间执行的查询,备份报错:Lock wait timeout exceeded; try restarting transaction
-D, --daemon 启用守护进程模式
-I, --snapshot-interval dump快照间隔时间,默认60s,需要在daemon模式下
-L, --logfile 使用日志文件,默认标准输出到终端
--tz-utc 备份的时候允许备份Timestamp,这样会导致不同时区的备份还原会出问题,默认关闭,参数:--skip-tz-utc to disable.
--skip-tz-utc
--use-savepoints 使用savepoints来减少采集metadata所造成的锁时间,需要SUPER权限
--success-on-1146 Not increment error count and Warning instead of Critical in case of table doesn't exist
--lock-all-tables 锁全表,代替FLUSH TABLE WITH READ LOCK
-U, --updated-since Use Update_time to dump only tables updated in the last U days
--trx-consistency-only Transactional consistency only
-h, --host The host to connect to
-u, --user Username with privileges to run the dump
-p, --password User password
-P, --port TCP/IP port to connect to
-S, --socket UNIX domain socket file to use for connection
-t, --threads 备份执行的线程数,默认4个线程
-C, --compress-protocol 在mysql连接上使用压缩协议
-V, --version Show the program version and exit
-v, --verbose 更多输出, 0 = silent, 1 = errors, 2 = warnings, 3 = info, default 2
还原
命令
# 恢复
myloader -u root -h 192.168.44.140 -P 33060 -p 123456 -d /root/backup -o
# docker 命令
docker run \
-v /root/backup:/data \
mydumper/mydumper:latest \
myloader -u root -h 192.168.44.140 -P 33060 -p 123456 -d /data -o
参数介绍
Usage:
myloader [OPTION...] multi-threaded MySQL loader
Help Options:
-?, --help Show help options
Application Options:
-d, --directory 备份文件所在的目录
-q, --queries-per-transaction 每个事务的query数量, 默认1000
-o, --overwrite-tables 如果表存在则先删除,使用该参数,需要备份时候要备份表结构,不然还原会找不到表
-B, --database 指定需要还原的数据库
-s, --source-db 还原的数据库
-e, --enable-binlog 启用二进制日志恢复数据
-h, --host The host to connect to
-u, --user Username with privileges to run the dump
-p, --password User password
-P, --port TCP/IP port to connect to
-S, --socket UNIX domain socket file to use for connection
-t, --threads 使用的线程数量,默认4
-C, --compress-protocol 连接上使用压缩协议
-V, --version Show the program version and exit
-v, --verbose 更多输出, 0 = silent, 1 = errors, 2 = warnings, 3 = info, default 2
Percona XtraBackup
备份
备份是从数据库文件中读取的, 不像mydumper是查询,mysql容器挂载的目录需要指定--datadir docker 备份还原介绍 Docker---数据卷容器(volumes-from容器间传递共享) Back up, restore, or migrate data volumes
# 二进制文件备份
xtrabackup --backup --target-dir=/root/backup2 \
--datadir=/data/radondb-mysql-leader \
--databases="testdb1 testdb2.user4" \
--host=192.168.44.140 \
--port=33060 \
--user=root \
--password=123456
# 压缩备份
xtrabackup --backup --target-dir=/root/backup2 \
--datadir=/data/radondb-mysql-leader \
--databases="testdb1 testdb2.user4" \
--host=192.168.44.140 \
--port=33060 \
--user=root \
--password=123456 \
--compress
# docker容器备份
docker run \
-v /root/backup2:/data \
--volumes-from 059ef7d70347 \ # mysql容器名或者hash
percona/percona-xtrabackup:2.4.29 \
xtrabackup --backup --target-dir=/data \
--databases="testdb1 testdb2.user4" \
--host=192.168.44.140 \
--port=33060 \
--user=root \
--password=123456 \
--compress
还原
简而言之就是复制文件到数据库的数据目录
文件校验和
# 打包备份文件
tar -czvf backup.tar.gz /root/backup
# 生成校验和, 避免网络传输出现损坏
sha256sum backup.tar.gz > backup.sha256
# 校验
sha256sum -c backup.sha256
# 解包
tar -xzvf backup.tar.gz /root/backup
# 还原
myloader -u root -h 192.168.44.140 -P 33060 -p 123456 -d /root/backup