一、安装(mysql 8.0版本请下载对应的8.0版本)

wget https://www.percona.com/downloads/Percona-XtraBackup-LATEST/Percona-XtraBackup-8.0.10/binary/redhat/7/x86_64/Percona-XtraBackup-8.0-10-r94f9645-el7-x86_64-bundle.tar

tar -xvf Percona-XtraBackup-8.0-6-rc0a2d91-el7-x86_64-bundle.tar

yum install percona-xtrabackup-80-8.0.6-1.el7.x86_64.rpm

安装完成只有xtrabackup命令


二、命令及参数介绍

常用选项:  (innobackupex)

  --host     指定主机

  --user     指定用户名

  --password    指定密码

  --port     指定端口

  --backup  备份

  --compress  开启压缩

  --parallel 并行

  --databases     指定数据库

  --incremental    创建增量备份

  --incremental-basedir   指定包含完全备份的目录

  --incremental-dir      指定包含增量备份的目录    

  --prepare        对备份进行预处理操作              

    一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。

   “准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。

  --apply-log-only     该参数的意思是只应用xtrabackup日志中已提交的事务数据,不回滚还未提交的数据,用在增量备份中

  --copy-back     恢复备份目录


准备工作,由于使用--backup备份数据文件时时间点时不一致的(备份增量redo日志线程会实时监听增量数据),因为程序在不同的时间点复制,并且再复制过程中可能会被更改,

如果使用innodb直接尝试启动这些数据文件,innodb将检测损坏并停止运行,所以需要使用--prepare将将备份文件进行崩溃恢复,来使用这些复制文件

--prepare增量备份恢复时与全量备份不同,在全量备份时执行--prepare为了保证数据库一致,针对数据文件从日志文件重放已提交的事务,以及回滚未提交的事务。

在增量时,必须跳过未提交事务的回滚,因为备份时未提交的事务可能正在进行中,很可能在下一次增量备份中提交,所以需要使用--apply-log-only选项来防止回滚阶段。


创建备份用户及授权

create user 'xtrabk'@'localhost' identified by 'xtrabk';

grant reload,lock tables,replication client,backup_admin,process on *.*  to 'xtrabk'@'localhost';

grant select on *.* to 'xtrabk'@'localhost' ;

flush privileges;


三、备份及恢复案例

全库备份及恢复

1、备库全库

xtrabackup --defaults-file=/u01/mysql3308/my.cnf    --user=xtrabk --password=xtrabk  --socket=/u01/mysql3308/data/mysql.sock --backup --target-dir=/u01/mysql3308/backup/full/

2、恢复准备

恢复前,停止数据库,清理data 目录,binglog目录

准备:应用redo,类似于之前的apply

xtrabackup --defaults-file=/u01/mysql3308/my.cnf -S /u01/mysql3308/data/mysql.sock -uroot -proot --prepare --target-dir=/u01/mysql3308/backup/20230206_full

3、全库恢复

xtrabackup --defaults-file=/u01/mysql3308/my.cnf -S /u01/mysql3308/data/mysql.sock -uroot -proot --copy-back --target-dir=/u01/mysql3308/backup/20230206_full

恢复完成后,更改data、binlog目录权限


增量备份及恢复

1、先进行全量备份

xtrabackup --defaults-file=/u01/mysql3308/my.cnf -uroot -proot -S /u01/mysql3308/data/mysql.sock --backup --target-dir=/u01/mysql3308/backup/20230206_full01

2、指明基于上一次全备份做增量备份

xtrabackup --defaults-file=/u01/mysql3308/my.cnf  --socket=/u01/mysql3308/data/mysql.sock --user=root --password=root --backup --target-dir=/u01/mysql3308/backup/20230206_full01/incremental --incremental-basedir=/u01/mysql3308/backup/20230206_full01

3、指明基于上一个增量备份路径做增量备份

xtrabackup --defaults-file=/u01/mysql3308/my.cnf  --socket=/u01/mysql3308/data/mysql.sock --user=root --password=root --backup --target-dir=/u01/mysql3308/backup/20230206_full01/incremental01 --incremental-basedir=/u01/mysql3308/backup/20230206_full01/incremental

4、使用全备份和增量恢复

4.1、针对全量做准备

xtrabackup --defaults-file=/u01/mysql3308/my.cnf --prepare --apply-log-only --target-dir=/u01/mysql3308/backup/20230206_full01

4.2、针对增量做准备

xtrabackup --defaults-file=/u01/mysql3308/my.cnf --prepare --apply-log-only --target-dir=/u01/mysql3308/backup/20230206_full01 --incremental-dir=/u01/mysql3308/backup/incremental

xtrabackup --defaults-file=/u01/mysql3308/my.cnf --prepare --apply-log-only --target-dir=/u01/mysql3308/backup/20230206_full01 --incremental-dir=/u01/mysql3308/backup/incremental01

如果存在多次增量备份的话,就多次执行

4.3、对合并后的全量备份做回滚

xtrabackup --defaults-file=/u01/mysql3308/my.cnf  --prepare --target-dir=/u01/mysql3308/backup/20230206_full01

4.4、执行恢复操作

xtrabackup --defaults-file=/u01/mysql3308/my.cnf  --copy-back --target-dir=/u01/mysql3308/backup/20230206_full01


四、其他常用命令

压缩备份

xtrabackup --backup --compress --compress-threads=4 --target-dir=/u01/mysql3308/backup/


解压并恢复

xtrabackup --decompress --target-dir=/u01/mysql3308/backup/

xtrabackup --prepare    --target-dir=/u01/mysql3308/backup/

xtrabackup  --copy-back --target-dir=/u01/mysql3308/backup/


加密备份

# 将key写在文件里面

echo -n "GCHFLrDFVx6UAsRb88uLVbAVWbK+Yzfs" > /u01/mysql3308/backup//keyfile

xtrabackup  --backup  --encrypt=AES256 --encrypt-key-file=/u01/mysql3308/backup/keyfile  --target-dir=/u01/mysql3308/backup/

加密后的备份文件,后缀都带上了.xbcrypt后缀名


解密并恢复

xtrabackup --parallel=4  --decrypt=AES256 --encrypt-key="GCHFLrDFVx6UAsRb88uLVbAVWbK+Yzfs" --target-dir=/u01/mysql3308/backup/

xtrabackup --prepare --target-dir=/u01/mysql3308/backup/

xtrabackup --copy-back --target-dir=/u01/mysql3308/backup/