XtraBackup使用

安装

yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

yum install -y percona-xtrabackup-24

备份

增量备份

--incremental           # 创建增量备份
--incremental-basedir # 指定基于某次备份的基础上,再进行增量的目录
--incremental-dir # 指定包含增量备份的目录

# 以下命令省略公共参数 --defaults-file=/etc/my.cnf --user=root --password=admin -S /tmp/mysql.sock --no-timestamp
# 先创建一个全量备份
[root@localhost ~]# innobackupex /backup/base
# 查看xtrabackup_checkpoints,发现from_lsn = 0,to_lsn = 2755643
[root@localhost ~]# cat /backup/base/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 2755643
last_lsn = 2755652
compact = 0
recover_binlog_info = 0
flushed_lsn = 2755652

# 再创建第一个增量
[root@localhost ~]# innobackupex --incremental --incremental-basedir=/backup/base /backup/incr1
# 查看xtrabackup_checkpoints,发现from_lsn = 2755643,to_lsn = 3557727,from_lsn是上一次全量备份base的to_lsn
[root@localhost ~]# cat /backup/incr1/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 2755643
to_lsn = 3557727
last_lsn = 3557736
compact = 0
recover_binlog_info = 0
flushed_lsn = 3557736

# 然后创建第二个增量
[root@localhost ~]# innobackupex --incremental --incremental-basedir=/backup/incr1 /backup/incr2
# 查看xtrabackup_checkpoints,发现from_lsn = 3557727,to_lsn = 3590358,from_lsn是上一次增量备份incr1的to_lsn
[root@localhost ~]# cat /backup/incr1/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 3557727
to_lsn = 3590358
last_lsn = 3590367
compact = 0
recover_binlog_info = 0
flushed_lsn = 3590367

压缩

--compress              # 开启压缩
--compress-threads # 指定完成压缩操作的线程数
--compress-chunk-size # 指定完成压缩操作时,线程可用的缓存大小

加密

--encrypt               # 启用线程
--encrypt-key # 加密key
--encrypt-key-file # 加密密钥文件,不能与--encrypt-key同时使用
--encrypt-threads # 完成加密操作的线程数
--encrypt-chunk-size # 指定完成加密操作时,线程可用的缓存大小

Stream

# 流式备份的格式,backup完成之后以指定格式到STDOUT,目前只支持tar和xbstream。
--stream=xbstream

备份数据

# 将备份内容写入一个xbstream文件中,可以与压缩、加密一起使用
innobackupex --defaults-file=/usr/local/mysql/etc/my.cnf \
--user=root --password=admin --port=3306 --socket=/tmp/mysql.sock \
--compress --compress-threads=4 \
--encrypt=AES256 --encrypt-key=Ue2Wp6dIDWszpI76HQ1u57exyjAdHpRO --encrypt-threads=4 \
--parallel=4 --no-timestamp /data/mysql_backup > /data/mysql_backup/backup.xbstream

恢复

恢复数据相比备份,需要分步骤进行。如果你在备份时,设置了压缩、加密等条件时。

Stream

# 读取.xbstream格式文件内容
xbstream -x < /data/mysql_backup/backup.xbstream -C /data/mysql_backup/

解压

# 解压所有.qp格式的文件。解压后,.qp格式的文件需要手动删除
# find /data/mysql_backup/ -iname "*.qp" -exec rm {}\;
--decompress

innobackupex --decompress /data/mysql_backup/

解密

# 解密所有.xbcrypt格式的文件,需要指定--encrypt-key或者--encrypt-key-file。解密后,.xbcrypt格式的文件需要手动删除
# find /data/mysql_backup/ -iname "*.xbcrypt" -exec rm {}\;
--decrypt

innobackupex --decrypt=AES256 --encrypt-key=Ue2Wp6dIDWszpI76HQ1u57exyjAdHpRO /data/mysql_backup/

全量备份恢复数据

# 首先,对备份进行预处理操作(一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。)
innobackupex --apply-log /data/mysql_backup

# 然后,恢复备份目录(其通过复制所有数据相关的文件至mysql配置中的datadir目录中来执行恢复过程)
# 数据恢复,需要mysql数据目录为空,如果非空,恢复命令将报错
innobackupex --copy-back /data/mysql_backup
# 当数据恢复至DATADIR目录以后,还需要确保所有的数据文件的属主和属组均为正确的用户,如mysql,否则,在启动mysqld之前还需要事先修改数据文件的属主和属组
chown -R mysql:mysql /data/mysql/mysql_data

增量备份恢复数据

# 假设有如下几个备份
# base 是全量备份
# incr1 基于base的一次增量
# incr2 基于incr1的一次增量

# 首先redo全量备份
innobackupex --apply-log --redo-only base/
# 然后基于base,恢复incr1
innobackupex --apply-log --redo-only base/ --incremental-dir=incr1/
# 然后基于base,恢复incr2
innobackupex --apply-log --redo-only base/ --incremental-dir=incr2/
# 最后再恢复全量备份base
innobackupex --apply-log base/
# 数据恢复,需要mysql数据目录为空,如果非空,恢复命令将报错
innobackupex --copy-back base/
# 因为--copy-back恢复产生的文件的用户为root,需要把mysql数据库目录下的文件用户都修改为mysql,mysql的服务器才能正常启动
chown -R mysql:mysql /data/mysql/mysql_data