Xtrabackup安装与测试
一、二进制包方式安装Xtrabackup
1.1.查看libgcrypt版本
需要根据libgcrypt版本选择对应的Xtrabackup版本。
[root@234 bin]# rpm -qa|grep libgcrypt
libgcrypt-1.4.5-12.el6_8.x86_64 #可以看到libgcrypt版本为1.4.5,则Xtrabackup二进制包需要下载相应的版本。
1.2.下载二进制包
cd /usr/local/src
wget https://www.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.16/binary/tarball/percona-xtrabackup-2.4.16-Linux-x86_64.libgcrypt145.tar.gz
1.3.解压二进制包
cd /usr/local/src
tar -zxvf percona-xtrabackup-2.4.16-Linux-x86_64.libgcrypt145.tar.gz
二、xtrabackup全量备份测试
2.1.innobackupex 备份数据库
使用innobackupex命令备份备份文件。可以备份全库,也可以指定库。需要创建备份用户,包括操作系统用户和数据库用户并授予足够权限。此处为方便起见,均使用超级用户。
innobackupex --defaults-file=/home/mysql/I3306/my3306.cnf --user=root --port=3306 --password="xxx" --host=127.0.0.1 --parallel=2 --throttle=200 /home/yanmingzhun/xtrabackup
innobackup常用选项参数:
--defaults-file=/etc/my.cnf #指定my.cnf配置文件路径,必须是第一个选项
--user=root #执行备份操作的MySQL用户(非系统用户),该用户需要有MySQL的相关权限
--password=dbapassword #MySQL用户的密码
--databases: #指定要备份的数据库,如果要指定多个数据库以空格隔开,如"db1 db2",在指定某数据库时也可以只指定其中的某张表,需要开启innodb_file_per_table = 1选项
--no-timestamp #innobackupex默认会在备份的时候根据时间戳建立一个目录,使用这个选项就不会创建时间戳目录了
--compress #压缩备份数据,可以达到好几十倍的压缩率.恢复个的时候在apply-log之前多一个--decompress解压步骤
--decrypy=AES256 #备份加密
--encrypt-key="XXXX" #加密密码
--remove-original #解密,之后再用innobackup apply-log和--copy-back
备份文件文件说明:
(1) backup-my.cnf —— 备份命令用到的配置选项信息;
(2) ibdata1 —— 备份的表空间文件;
(3) xtrabackup_binary —— 备份中用到的xtrabackup的可执行文件;
(4) xtrabackup_binlog_info —— MySQL服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置;
(5) xtrabackup_logfile —— 备份的重做日志文件。
(6) xtrabackup_checkpoints —— 备份类型(full/incremental)、备份状态(backuped/prepared)和LSN范围信息;
2.2.在全备目录上重放已提交的事务 --apply-log
innobackupex --apply-log /home/yanmingzhun/xtrabackup/2019-11-05_11-44-30/
查看xtrabackup_checkpoints 内容
[root@234]# cat xtrabackup_checkpoints
backup_type = full-backuped #备份类型为全备
from_lsn = 0
to_lsn = 1409505849
last_lsn = 1409505858
compact = 0
recover_binlog_info = 0
flushed_lsn = 1409505858
innobackupex --apply-log /home/yanmingzhun/xtrabackup/2019-11-07_11-26-31
[root@234]# cat xtrabackup_checkpoints
backup_type = full-prepared #backup_type变为full-prepared
from_lsn = 0
to_lsn = 1409505849
last_lsn = 1409505858
compact = 0
recover_binlog_info = 0
flushed_lsn = 1409505858 #innobackupex期间没有产生新的lsn,所以apply-log后flushed_lsn 无变化(flushed_lsn=last_lsn)。
2.3.用全备的数据文件来恢复数据 --copy-back
恢复数据前需要关闭相应MySQL实例,并清空datadir。
innobackupex --defaults-file=/home/mysql/I3306/my3306.cnf --user=root --port=3306 --password="XXX" --host=127.0.0.1 --copy-back /home/yanmingzhun/xtrabackup/2019-11-11_09-53-13/
2.4备份加密与解密
#创建加密密码和密码本
openssl rand -base64 24 #得到一串加密码
echo -n "pxT5aEDWzasNZpxT5aEDWza" > /data/backup/key
#使用密码本进行加密和解密
innobackupex --defaults-file=/home/mysql/I3306/my3306.cnf --user=root --port=3306 --password="XXX" --host=127.0.0.1 --encrypy=AES256 --encrypt-key-file=/home/yanmingzhun/xtrabackup/key.txt --parallel=2 --throttle=200 /home/yanmingzhun/xtrabackup
innobackupex --defaults-file=/home/mysql/I3306/my3306.cnf --user=root --port=3306 --password="XXX" --host=127.0.0.1 --decrypy=AES256 --decrypt-key-file=/home/yanmingzhun/xtrabackup/key.txt /home/yanmingzhun/xtrabackup/2019-11-21_10-25-49
innobackupex --apply-log /home/yanmingzhun/xtrabackup/2019-11-21_10-25-49
--encrypy=AES256 #加密方式
--encrypt-key-file= #密码本路径
--decrypy=AES256 #加密方式
--decrypt-key-file #密码本路径
二、xtrabackup全量备份测试
2.1增量备份
2.1.1 以全备目录为基础做增量备份
innobackupex --defaults-file=/home/mysql/my3306.cnf --user=root --port=3306 --password="xxx" --host=127.0.0.1 --incremental /home/yanmingzhun/xtrabackup/incremental --incremental-basedir=/home/yanmingzhun/xtrabackup/2019-11-11_12-17-23/ --parallel=2 --throttle=200
参数说明:
--incremental #指定增量备份1的目录
--incremental-basedir = #basedir 指定此次增量起点目录
2.1.2 再次增量备份
以全备目录或最近一次增量备份为基础再次做增量备份。以在增量备份1目录的基础上做增量备份2为例 :
innobackupex --defaults-file=/home/mysql/my3306.cnf --user=root --port=3306 --password="xxx" --host=127.0.0.1 --incremental /home/yanmingzhun/xtrabackup/incremental --incremental-basedir=/home/yanmingzhun/xtrabackup/incremental/2019-11-11_16-53-33/ --parallel=2 --throttle=200
#查看xtrabackup_checkpoints文件,发现backup_type为full-backuped(全备)和incremental(增量备份)
[root@234 xtrabackup]# cat 2019-11-11_12-17-23/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 1564287506
last_lsn = 1564287515
compact = 0
recover_binlog_info = 0
flushed_lsn = 1564043346
[root@234 incremental]# cat 2019-11-19_10-32-43/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 1564287506
to_lsn = 1827986271
last_lsn = 1827986280
compact = 0
recover_binlog_info = 0
flushed_lsn = 1827986280
2.2 重放已提交的事务
#回放全备已提交事务到全备文件
innobackupex --defaults-file=/home/mysql/my3306.cnf --user=root --port=3306 --password="xxx" --host=127.0.0.1 --apply-log --redo-only /home/yanmingzhun/xtrabackup/2019-11-11_12-17-23
•Prepare:innobackupex --apply-log [option] BACKUP-DIR
•选项说明:
--apply-log:一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。此选项作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态( 最后一次时使用,中间不用)
--use-memory:和--apply-log选项一起使用,当prepare 备份时,做crash recovery分配的内存大小
--export:表示开启可导出单独的表之后再导入其他Mysql中
--redo-only:此选项在向prepare base full backup合并增量备份时候使用,但不对最后一个增量备份使用(中间使用,最后一次不用)。因为中间的增量备份 日志中未提交的事务可能在下一个备份中提交,回滚以未提交事务会导致之后备份中对该事物的提交无法完成。
#依次回放增量备份已提交事务
innobackupex --defaults-file=/home/mysql/my3306.cnf --user=root --port=3306 --password="xxx" --host=127.0.0.1 --incremental --apply-log --redo-only /home/yanmingzhun/xtrabackup/2019-11-11_12-17-23/ --incremental-basedir=/home/yanmingzhun/xtrabackup/incremental/2019-11-19_10-32-43/ --use-memory=1G
innobackupex --defaults-file=/home/mysql/my3306.cnf --user=root --port=3306 --password="xxx" --host=127.0.0.1 --incremental --apply-log --redo-only /home/yanmingzhun/xtrabackup/2019-11-11_12-17-23/ --incremental-basedir=/home/yanmingzhun/xtrabackup/incremental/2019-11-19_16-49-25/ --use-memory=1G
innobackupex --defaults-file=/home/mysql/my3306.cnf --user=root --port=3306 --password="xxx" --host=127.0.0.1 --incremental --apply-log /home/yanmingzhun/xtrabackup/2019-11-11_12-17-23/ --incremental-basedir=/home/yanmingzhun/xtrabackup/incremental/2019-11-19_17-01-53/ --use-memory=1G
2.3 用重放完成的备份恢复数据库
关闭实例,清空datadir,用重放完成的备份恢复数据库。
innobackupex --defaults-file=/home/mysql/my3306.cnf --user=root --port=3306 --password="xxx" --host=127.0.0.1 --force-non-empty-directories --copy-back /home/yanmingzhun/xtrabackup/2019-11-07_10-59-10
#应用apply-log后,应用事务日志redo_log和undo_log,并生成iblogfile{0|1|2}
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#错误提示:xtrabackup: This target seems not to have correct metadata
#原因:仅指定了增量备份路径--incremental-basedir=/home/yanmingzhun/xtrabackup/incremental/2019-11-19_10-32-43/ ,未指定全备路径
三、小结
**选择xtrabackup下载版本需根据libgcrypt版本,否则使用时会报错。
**备份恢复流程为:先备份,然后使用--apply-log应用事务、最后用--copy-back参数进行恢复。
**apply-log:一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。此选项作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态( 最后一次时使用,中间不用)
**redo-only:此选项在向prepare base full backup合并增量备份时候使用,但不对最后一个增量备份使用(中间使用,最后一次不用)。因为中间的增量备份 日志中未提交的事务可能在下一个备份中提交,回滚以未提交事务会导致之后备份中对该事物的提交无法完成。
**xtrabackup全备后进行的DDL操作不会不记录到增量备份中,因为DDL语句不支持事务。因此,每次执行DDL完后,应重新进行全量备份,并在最新的全量备份的基础上进行增量备份。