本实践案例中,以2台机器来演示备份与还原过程,其中2台机器安装的mysql(8.0.26)、xtrabackup(8.0.26-18)版本均相同。备份数据从机器1(192.168.100.6)上增量备份,备份后传输到机器2(192.168.100.7)中进行恢复。
增量备份前,需要先创建用于备份的用户,并给其授权,保证可以顺利备份。
xtrabackup具体使用方法,参照官方文档:https://www.percona.com/doc/percona-xtrabackup/8.0/index.html
--创建用户
CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY '你的密码';
--授权
GRANT BACKUP_ADMIN,PROCESS,RELOAD,LOCK TABLES,REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost';
-- 查询权限
GRANT SELECT ON *.* TO 'bkpuser'@'localhost';
FLUSH PRIVILEGES;
-- 查看
SHOW GRANTS FOR 'bkpuser'@'localhost';
您可以在每次完整备份之间执行多次增量备份,例如每周一次完整备份和每天一次增量备份,或者每天一次完整备份和每小时一次增量备份。增量备份之所以有效,是因为每个InnoDB页面都包含一个日志序列号或LSN。LSN是整个数据库的系统版本号。每个页面的LSN显示它最近的更改时间。
增量备份实际上并不将数据文件与先前备份的数据文件进行比较,增量备份只需读取页面并将其LSN与上次备份的LSN进行比较。但是,您仍然需要完整备份来恢复增量更改;如果没有完整备份作为基础,增量备份就毫无用处。
xtrabackup --user=bkpuser --password=123456 --backup --target-dir=/megalith/backup/full/
增量备份是在全备的基础上进行的,如果有多次增量备份的话,后续的增量备份的基础目录(–incremental-basedir)是上一次增量备份的目标目录(–target-dir),也就是说后续增量备份都是在上一次增量备份的基础上进行的。
#增量备份1,在全备的基础上
xtrabackup --user=bkpuser --password=123456 --backup --incremental-basedir=/megalith/backup/full --target-dir=/megalith/backup/inc1
#增量备份2,在第一次增备的基础上
xtrabackup --user=bkpuser --password=123456 --backup --incremental-basedir=/megalith/backup/inc1 --target-dir=/megalith/backup/inc2
数据备份后,建议异机备份,将备份数据保存在另外机器磁盘中,防止本机数据出问题后数据丢失。在此案例中,直接通过scp命令,将全备和增备后的数据传递到机器2/megalith目录下。
Xtrabackup 是热备份,所以在备份的同时数据库也在进行读写操作。所以Xtrabackup备份的数据文件在Preparing之前时间点不一致,因为Xtrabackup 在不同的时间点复制了他们,后复制的文件可能与先复制的文件在数据关联关系上存在不一致。
为了保证还原数据库的一致性,在还原之前必须进行Preparing操作。依次从完整备份开始,直到最后一个增量备份,进行Preparing操作(除了最后一个增备,所有的备份恢复都应该设置 apply-log-only 参数(only 指的就是只回放 redo log 阶段,跳过 undo 阶段),即使–apply-log-only在最后一步使用了,备份仍然是一致的,但在这种情况下,服务器将执行回滚阶段)。完成后的数据库可以用于恢复备份。
#全备prepare
xtrabackup --prepare --apply-log-only --target-dir=/megalith/backup/full
#增备1 prepare ,--target-dir 指向全备目录
xtrabackup --prepare --apply-log-only --target-dir=/megalith/backup/full --incremental-dir=/megalith/backup/inc1
#增备2 prepare,--target-dir 指向全备目录。最后一个增备可以不用加apply-log-only,加不加效果一样
xtrabackup --prepare --apply-log-only --target-dir=/megalith/backup/full --incremental-dir=/megalith/backup/inc2
#停止mysql服务,备份原数据(防止恢复失败)
systemctl stop mysqld;
#根据自己机器实际情况,进行数据备份与清空操作
cp -r /megalith/mysql /megalith/mysql_bk
rm -rf /megalith/mysql/*
#拷回数据,将prepare后的备份数据,拷贝到mysql数据目录下
xtrabackup --copy-back --datadir=/megalith/mysql --target-dir=/megalith/backup/full
数据拷回后,默认拥有者和使用者都是root,而mysql相关数据文件必须是mysql:mysql才可以启动
#授权
chown -R mysql:mysql /megalith/mysql
#启动服务
systemctl start mysqld;
完成以上操作步骤后,备份数据就还原了。可以与备份前的数据进行对比,检查数据恢复情况。