MySQL通过xtrabackup增量全量备份
安装xbk( XtraBackup8.0开始不支持MySQL8.0之前的版本)
https://www.percona.com/downloads/Percona-XtraBackup-LATEST/
dnf install percona-xtrabackup-80-8.0.14-1.el8.x86_64.rpm -y
xbk备份的核心功能
1、针对非innodb引擎表进行锁表备份,copy所有的非inndob的表文件
2、针对innodb引擎表会立即触发CKPT,copy所有inndob表的相关文件(ibdata1,idb,frm),并且将备份过程中产生新的数据变化中的部分redo一起备份。
3、在恢复时,xbk会调用innodb引擎的csr过程,会将数据和redo的lsn追平,然后进行一致性恢复
xbk全量增量备份脚本
#!/bin/bash
BaseDir="/backup/mysql-3306"
SqlHost="localhost"
SqlUser="root"
SqlPass="123456"
SqlFile="/opt/app/mysql-3306/etc/my.cnf"
SqlSocket="/opt/app/mysql-3306/socket/mysql.sock"
LoginCmd="--defaults-file=${SqlFile} --host=${SqlHost} --user=${SqlUser} --password=${SqlPass} --socket=${SqlSocket}"
year=`date +%Y`
week_number=`date +%U`
date_of_week=`date +%u`
week_dir=${BaseDir}/${year}/${week_number}
date_dir=${week_dir}/${date_of_week}
[ -d ${week_dir} ] || mkdir -p ${week_dir}
[ -d ${date_dir} ] || mkdir -p ${date_dir}
if [ ${date_of_week} -eq 1 ];then
xtrabackup ${LoginCmd} --backup --target-dir=${date_dir}
else
let yesterday=$date_of_week-1
[ -d ${week_dir}/$yesterday ] || { echo Not exist yesterday backup data !!!;exit 1; }
xtrabackup ${LoginCmd} --backup --target-dir=${date_dir} --incremental-basedir=${week_dir}/$yesterday
fi
xbk恢复数据
1、先恢复全量备份
xtrabackup --prepare --apply-log-only --target-dir=${week_dir}/1
2、将每个增量备份恢复到全量备份中,先把周二的数据恢复到全量备份中,以此类推.假如这里回复周一到周五的数据
xtrabackup --prepare --apply-log-only --target-dir=${week_dir}/1 --incremental-dir=${week_dir}/2
xtrabackup --prepare --apply-log-only --target-dir=${week_dir}/1 --incremental-dir=${week_dir}/3
xtrabackup --prepare --apply-log-only --target-dir=${week_dir}/1 --incremental-dir=${week_dir}/4
xtrabackup --prepare --target-dir=${week_dir}/1 --incremental-dir=${week_dir}/5
3、数据恢复到MySQL
xtrabackup --copy-back --target-dir=${week_dir}/1
4、授权MySQL数据库目录
chown -R mysql.mysql /database/mysql-3306/data
MySQL忽然崩了恢复
1、先通过上面的 'xbk恢复数据',完成上面的步骤后,找到最后一个增量备份节点,找到binlog的最后计入位置.找到节点中的xtrabackup_binlog_info,如下:
[root@test 5]
mysql-bin.000005 196 703e19ab-12a6-11eb-ba43-000c29f7a041:1-2004
2、那么恢复binlog的起始位置就是703e19ab-12a6-11eb-ba43-000c29f7a041:2005-最后
3、终点的binlog位置找到数据库存放目录下的最大序号binlog日志
4、把binlog数据导出到sql,如下:
[root@test ]
5、然后在MySQL系统中导入,记得关闭binlog记录,请查看MySQL的binlog恢复文件