了解最新公司动态及行业资讯
上一篇介绍了逻辑备份工具mysqldump,本文将通过应用更为普遍的物理备份工具xtrabackup来演示数据备份及恢复的第二篇内容。
去percona官网下载对应版本的安装包
https://www.percona.com/downloads , 因为每个版本对应的数据库版本不同,因此需要根据数据库的版本选择对应的xtrabackup的安装包.当前测试使用的数据库为MySQL5.7 因此下载2.4版本https://www.percona.com/downloads/Percona-XtraBackup-2.4/LATEST/
另外,2.4.10及以后版本中,对libgcrypt进行了区分,因此也需要查询自己服务器的libgcrypt版本,然后选择对应的安装包
查看libgcrypt方法:
[root@testdb ~]# yum list installed|grep libgcrypt libgcrypt.x86_64 1.5.3-14.el7 @anaconda然后下载对应包
/* 二进制包 */ wget https://www.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.18/binary/tarball/percona-xtrabackup-2.4.18-Linux-x86_64.libgcrypt153.tar.gz /* rpm包 */ wget https://www.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.18/binary/redhat/7/x86_64/Percona-XtraBackup-2.4.18-r29b4ca5-el7-x86_64-bundle.tar二进制包解压后即可使用,rpm包下载解压后 rpm -ivh 安装即可。操作均很简单,此处略过
xtrabackup通常使用 innobackupex命令, 可以使用 innobackupex --help 命令查看参数及说明。
其中常用参数及说明如下:
备份的账号建议单独创建,并授予相关权限
后续会以此为基础进行增量备份
/* 创建备份结果的目录, 此步骤也可以省略 */ mkdir all_backup /* 开始全量备份 */ /root/xtrabackup/bin/innobackupex --defaults-file=/app/data/mysql3306/etc/my.cnf --socket=/app/data/mysql3306/tmp/mysql.sock --port=3306 --user=backup --password=Backup@123.com --no-timestamp all_backup备份的结果存放在指定的目录 all_backup里,内容如下:
注: 如果没有添加阻塞DDL操作的参数,备份过程中如有DDL操作,备份将终止。因此建议日常备份放在从库中进行。
有时为了考虑磁盘空间问题,会在备份的时候直接压缩用以节约磁盘空间或解决磁盘空间不足以存放全量非压缩文件的问题。
/* gzip方式压缩 */ /root/xtrabackup/bin/innobackupex --defaults-file=/app/data/mysql3306/etc/my.cnf --socket=/tmp/mysql.sock --port=3306 --user=backup --password=Backup@123.com --stream=tar /tmp |gzip >all_backup.tar.gz中间过程省略
备份后的结果是一个压缩文件,经过对比,压缩后数据约为非压缩情况下的20%,压缩比还是比较高的。
不过,压缩备份的方式速度相对较慢,且消耗CPU,该影响因素需要大家考虑到,视情况选择是否压缩。
注意: 如果有单表过大 而/tmp路径空间不足的情况备份过程中可能会报错,因此可以指定其他空间较大的目录
gzip的压缩方式备份可能会有bug(案例可以自行寻找),出现如下错误:
xtrabackup: error: The transaction log file is corrupted. xtrabackup: error: The log was not applied to the intended LSN!因此可以采用xbstream方式进行备份,备份命令如下:
/root/xtrabackup/bin/innobackupex --defaults-file=/app/data/mysql3306/etc/my.cnf --socket=/tmp/mysql.sock --port=3306 --user=backup --password=Backup@123.com /app/backup --tmpdir=/app/backup --stream=xbstream|gzip - > all_backup.xbstream.gzxbstream压缩备份的过程和tar一致,就不再解释了。
远程备份与本地备份的相比 需要额外的配置远程主机的免密登录权限
/* 在备份所在用户的主机下配置连接目标主机的免密 */ ssh-keygen ssh-copy-id -i user@target_ip之后就可以将类似于本地备份的模式 将备份结果发送到远程机器
/root/xtrabackup/bin/innobackupex --defaults-file=/app/data/mysql3306/etc/my.cnf --socket=/tmp/mysql.sock --port=3306 --user=backup --password=Backup@123.com --stream=tar /tmp --no-timestamp | ssh user@target_ip "cat - > /app/backup/remote_backup.tar"备份过程中可以在目标机器看到对应的备份文件,完成后如下
注:
远程备份的目录需要有写入权限另外,和备份备份一样,如果存在大表或超大事务运行时不建议使用/tmp目录可以先根据2.1的本地全备的基础上进行增量备份,首次增量备份脚本如下:
/root/xtrabackup/bin/innobackupex --defaults-file=/app/data/mysql3306/etc/my.cnf --socket=/tmp/mysql.sock --port=3306 --user=backup --password=Backup@123.com --incremental /app/backup/ --incremental-basedir=/app/backup/all_backup此时,备份的结果放在/app/backup目录下,由于没指定no-timestamp参数,备份的结果存在在已三期时间命名的目录下:
备份的过程和全量备份很相似,但是备份结果是不一样的
结果如下
注: 增量备份仅能应用于InnoDB或XtraDB表等事务表,对于MyISAM表而言,执行增量备份时依旧进行全量备份
第二次增量备份是在第一次增量备份的基础上进行,因此incremental-basedir参数内容指定为上一次增量备份的目录即可
/root/xtrabackup/bin/innobackupex --defaults-file=/app/data/mysql3306/etc/my.cnf --socket=/tmp/mysql.sock --port=3306 --user=backup --password=Backup@123.com --incremental /app/backup/ --incremental-basedir=/app/backup/2020-03-25_14-47-37完成后生成一个新的目录
备份后的文件不能直接用作恢复,还需要先使用apply-log 做前滚和回滚
/root/xtrabackup/bin/innobackupex --defaults-file=./backup-my.cnf --apply-log /app/backup/all_backup注: 回放日志的时候 defaults-file 选择备份目录里的即可
本次恢复至一个新实例中(如果恢复至现有的实例需要先关闭目标实例,删除数据目录及相关日志存储的目录。不建议直接恢复至现有实例 ,除非实际需要)
然后拷贝至新实例中
/root/xtrabackup/bin/innobackupex --defaults-file=/app/data/mysql3307/etc/my.cnf --copy-back /app/backup/all_backup修改目标实例相关目录的权限
chown -R mysql:mysql /app/data/mysql3307启动新实例即可
/usr/local/mysql5.7/bin/mysqld_safe --defaults-file=/app/data/mysql3307/etc/my.cnf &恢复完毕
如果是基于第一次增量备份的恢复,操作如下
/* 使用合并增量备份的方式进行回放日志,先进行全量备份的合并 */ /root/xtrabackup/bin/innobackupex --apply-log --redo-only /app/backup/all_backup /* 再合并第一次增量备份 */ /root/xtrabackup/bin/innobackupex --apply-log --redo-only /app/backup/all_backup --incremental-dir=/app/backup/2020-03-25_14-47-37如果基于多次增量备份的恢复,则在全量备份及第一次增量备份的基础上继续合并后续的备份即可
/* 基于第二次增量备份的合并 */ /root/xtrabackup/bin/innobackupex --apply-log --redo-only /app/backup/all_backup --incremental-dir=/app/backup/2020-03-25_15-06-28之后的操作和全量备份的恢复一样即可。
基于xtrabackup2.4版本备份MySQL5.7数据库的主要方法及过程常用情况均已演示,结尾处再总结一下xtrabackup的主要优点:
物理备份,备份速度快热备份、无需停机恢复速度快自动会对备份文件进行验证本文只介绍了常用操作,还是有很多情况未做介绍,比如rds上的数据备份及还原等,请各位小伙伴自行探索,也可以与我讨论。关注我的公众号“数据库干货铺”及时解锁新文章,感谢。