Xtrabackup 实操
网上太多错误文章,再看了官网,薅掉了几根头发之后,终于理清思路。为了自己和小伙伴们不踩坑,由此记录模拟实操,话不多说,开干!
Xtrabackup 作为mysql备份工具,在单机情况下需要停止mysql,来恢复数据。在主从等以及集群模式下,可以实现不停主库(不锁表)进行热备。
一、环境
mysql: 8.0.36
主:10.128.0.3
从:10.128.0.4
二、全量数据恢复
实操模拟准备:
1.创建一个目录用于存放备份文件:/home/admin/backup/
mkdir /home/admin/backup/ -p
2.创建数据库并向数据库的表中添加两条新数据
create database xtra;
use xtra;
create table test1(id int);
insert into test1 values(1),(2),(3);
create table test2(id int);
insert into test2 values(1),(2),(3);
3.全量备份:xtrabackup --backup -u用户名 -p --target-dir=保存路径
xtrabackup --backup -uroot -p`cat /root/mysql` --target-dir=/home/admin/backup/
4.准备基本备份并停止数据库
xtrabackup --prepare --target-dir=/home/admin/backup/
systemctl stop mysqld
5.这时,再删除数据目录(database=/var/lib/mysql/data)
rm -rf /var/lib/mysql/data /var/lib/mysql/log
6.恢复数据库并重启数据库
xtrabackup --copy-back --target-dir=/home/admin/backup/
chown -R mysql.mysql /var/lib/mysql
systemctl start mysqld
7.查看数据库
use xtra
show tables;
三、增量备份恢复
实操模拟准备:
优先全量备份
xtrabackup --backup -uroot -p`cat /root/mysql` --target-dir=/home/admin/backup/
1.向数据库的表中添加两条新数据
use xtra;
create table test3(id int);
insert into test3 values(1),(2),(3);
create table test4(id int);
insert into test4 values(4),(5),(6);
2.第一次增量备份
xtrabackup --backup -uroot -p`cat /root/mysql` --target-dir=/home/admin/backup_1 --incremental-basedir=/home/admin/backup
or
xtrabackup --defaults-file=/etc/my.cnf --backup -uroot -p`cat /root/mysql` --target-dir=/home/admin/backup_1 --incremental-basedir=/home/admin/backup
3.向数据库的表中添加两条新数据
use xtra;
create table test5(id int);
insert into test5 values(1),(2),(3);
create table test6(id int);
insert into test6 values(4),(5),(6);
4.第二次增量备份
xtrabackup --backup -uroot -p`cat /root/mysql` --target-dir=/home/admin/backup_2 --incremental-basedir=/home/admin/backup_1
or
xtrabackup --defaults-file=/etc/my.cnf --backup -uroot -p`cat /root/mysql` --target-dir=/home/admin/backup_2 --incremental-basedir=/home/admin/backup_1
5.停止数据库
systemctl stop mysqld
6.这时,再删除数据目录(database=/var/lib/mysql/data)
rm -rf /var/lib/mysql/data /var/lib/mysql/log
7.全量备份准备
xtrabackup --prepare --apply-log-only --target-dir=/home/admin/backup
or
xtrabackup --defaults-file=/etc/my.cnf --prepare --apply-log-only --target-dir=/home/admin/backup
8.将增量备份合并到完全备份(若有多个增量备份,就执行多次)# 注意,增量备份--apply-log-only是防止数据回滚,最后一次的备份数据,是不需要添加--apply-log-only,否则会报错 ‘This target seems to be already prepared with --apply-log-only’
# 第一次合并
xtrabackup --prepare --apply-log-only --target-dir=/home/admin/backup --incremental-dir=/home/admin/backup_1
or
xtrabackup --defaults-file=/etc/my.cnf --prepare --apply-log-only --target-dir=/home/admin/backup/ --incremental-dir=/home/admin/backup_1
# 第二次合并
xtrabackup --prepare --target-dir=/home/admin/backup_1 --incremental-dir=/home/admin/backup_2
or
xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/home/admin/backup_1 --incremental-dir=/home/admin/backup_2
9.恢复数据库
xtrabackup --copy-back --target-dir=/home/admin/backup/
or
xtrabackup --defaults-file=/etc/my.cnf --copy-back --target-dir=/home/admin/backup/
chown -R mysql.mysql /var/lib/mysql
systemctl start mysqld
10.查看数据库
use xtra
show tables;
11.数据恢复操作
mysql -uroot -p`cat /root/mysql`
use xtra
show tables;
drop table test3;
drop table test4;
rm -rf /home/admin/*
12.官方注解 https://docs.percona.com/percona-xtrabackup/8.0/prepare-incremental-backup.html
增量备份的步骤--prepare与完整备份不同。在完整备份中,将执行两种类型的操作来使数据库保持一致:已提交的事务从日志文件中针对数据文件重播,未提交的事务将回滚。在准备增量备份时,您必须跳过未提交事务的回滚,因为备份时未提交的事务可能正在进行中,并且很可能会在下一次增量备份中提交。您应该使用该 --apply-log-only选项来阻止回滚阶段。
如果您不使用 --apply-log-only 阻止回滚阶段的选项,那么您的增量备份将毫无用处。 事务回滚后,无法应用进一步的增量备份。
从您创建的完整备份开始,您可以准备它,然后将增量差异应用于它。回想一下,您有以下备份:
xtrabackup --backup -uroot -p`cat /root/mysql` --target-dir=/data/backups/base
xtrabackup --backup -uroot -p`cat /root/mysql` --target-dir=/data/backups/inc1 --incremental-basedir=/data/backups/base
xtrabackup --backup -uroot -p`cat /root/mysql` --target-dir=/data/backups/inc2 --incremental-basedir=/data/backups/inc1
/data/backups/base
/data/backups/inc1
/data/backups/inc2
为了准备基础备份,您需要--prepare照常运行,但要阻止回滚阶段:
xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base
xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base --incremental-dir=/data/backups/inc1
xtrabackup --prepare --target-dir=/data/backups/base --incremental-dir=/data/backups/inc2
恢复数据库
xtrabackup --defaults-file=/etc/my.cnf --copy-back --target-dir=/data/backups/base
chown -R mysql.mysql /var/lib/mysql
systemctl start mysqld
四、差异备份
实操模拟准备:
优先全量备份
xtrabackup --backup -uroot -p`cat /root/mysql` --target-dir=/home/admin/backup/
1.向数据库的表中添加两条新数据
use xtra;
create table test3(id int);
insert into test3 values(1),(2),(3);
create table test4(id int);
insert into test4 values(4),(5),(6);
2.第一次增量备份
xtrabackup --backup -uroot -p`cat /root/mysql` --target-dir=/home/admin/backup_1 --incremental-basedir=/home/admin/backup
3.向数据库的表中添加两条新数据
use xtra;
create table test5(id int);
insert into test5 values(1),(2),(3);
create table test6(id int);
insert into test6 values(4),(5),(6);
4.第二次增量备份
xtrabackup --backup -uroot -p`cat /root/mysql` --target-dir=/home/admin/backup_2 --incremental-basedir=/home/admin/backup
5.停止数据库
systemctl stop mysqld
6.这时,再删除数据目录(database=/var/lib/mysql/data)
rm -rf /var/lib/mysql/data /var/lib/mysql/log
7.全量备份准备
xtrabackup --prepare --apply-log-only --target-dir=/home/admin/backup
6.将增量备份合并到完全备份(若有多个增量备份,就执行多次)# 注意,增量备份--apply-log-only只有
# 第一次全备恢复
xtrabackup --prepare --apply-log-only --target-dir=/home/admin/backup
# 差异备份
xtrabackup --prepare --target-dir=/home/admin/backup --incremental-dir=/home/admin/backup_2
7.恢复数据库
xtrabackup --defaults-file=/etc/my.cnf --copy-back --target-dir=/home/admin/backup/
chown -R mysql.mysql /var/lib/mysql
systemctl start mysqld
8.查看数据库
use xtra
show tables;
五、主从恢复
其实就是把主库备份传输到从库,从而根据实际情况,执行增量备份恢复,或者差异备份恢复。可以使用rsync或者通过scp,把传输的文件copy过去,进而执行恢复命令。
# 10.128.0.3
xtrabackup --backup -uroot -p`cat /root/mysql` --target-dir=/home/admin/backup/
scp -pr /home/admin/backup 10.128.0.4:/tmp
# 10.128.0.4
systemctl stop mysqld
rm -rf /var/lib/mysql/data/* /var/lib/mysql/log/*
xtrabackup --prepare --target-dir=/tmp/backup/
# 恢复数据库并重启数据库
xtrabackup --copy-back --target-dir=/tmp/backup/
chown -R mysql.mysql /var/lib/mysql
# 启动数据库
systemctl start mysqld
# 注意:恢复之后,主从mysql密码一致。