1. 安装
yum install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL # 官网下载地址https://www.percona.com/downloads/ wget https://www.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.4/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm yum install percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm
2. 说明
- 物理备份(可以理解为拷贝数据文件)
- 对于Misam表,进行自动锁表拷贝
- 对于INnodb表,进行热备(备份数据文件+备份在备份过程中产生的数据变化)
- 拷贝数据文件
- 拷贝redo和undo:为了实现热备
XtraBackup中主要包含两个工具:
xtrabackup:是用于热备innodb,xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构;
innobackupex:是将xtrabackup进行封装的perl脚本,提供了备份myisam表的能力。
PS:XtraBackup 8.0版本与Mysql8.0配套,并移除innobackupex命令
官方文档:https://www.percona.com/doc/percona-xtrabackup/8.0/backup_scenarios/full_backup.html
3. 常用选项
-H, –host=name 指定连接的主机
-u, –user=name 指定mysql用户名
-p, –password[=name] 指定连接的mysql用户密码
-P, –port=# 指定端口
–databases=name 指定数据库
–compress[=name] 压缩备份,支持的算法是“quicklz”和“lz4”。 默认算法是’quicklz’
–compress-threads=# 用于并行数据压缩的线程数。默认值为1
–decompress 解压缩
–remove-original 删除压缩文件,解压后压缩文件和数据文件共存,若不想保存压缩文件,添加此命令删除
–incremental 创建增量备份
–incremental-basedir=name 该参数在backup的时候使用,指定包含完全备份的目录,在创建增量备份时,此目录包含作为增量备份的基本数据集的完全备份
–incremental-dir=name 该参数在prepare的时候使用,指定包含增量备份的目录,在准备增量备份时,增量备份与完全备份在此目录中组合,以创建新的完全备份。
–prepare 对备份进行预处理操作。一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。
–apply-log-only 不回滚未提交事务,apply-log-only这个参数在准备增量备份的时候要用,且在最后的一份备份文件准备时不需要设置。解释详见 https://blog.csdn.net/ActionTech/article/details/101695649
–copy-back 恢复备份目录
–apply-log-only should be used when merging all incrementals except the last one. That’s why the previous line doesn’t contain the –apply-log-only option. Even if the –apply-log-only was used on the last step, backup would still be consistent but in that case server would perform the rollback phase.
4. 备份、恢复
- xtrabackup全备
xtrabackup --backup --user=root --password=1234 --compress --compress-threads=4 --target-dir=/backup/full/01 # 压缩 --compress # 压缩后体积确实小很多,但解压慢! # 加速压缩 --compress-threads # --defaults-file=/etc/my.cnf # --databases=test 指定库表 # --socket=/var/lib/mysql/mysql.sock
目录结构:
[root@JJB ~]# ll /backup/full/01 # 以下文件后缀带.qp是压缩格式 total 3156 -rw-r----- 1 root root 458 Apr 17 01:11 backup-my.cnf.qp # 备份命令用到的配置选项信息; -rw-r----- 1 root root 184 Apr 17 01:11 binlog.000023.qp -rw-r----- 1 root root 93 Apr 17 01:11 binlog.index.qp -rw-r----- 1 root root 1096 Apr 17 01:11 ib_buffer_pool.qp -rw-r----- 1 root root 167018 Apr 17 01:11 ibdata1.qp # 备份的表空间文件; drwxr-x--- 2 root root 23 Apr 17 01:11 jjb drwxr-x--- 2 root root 161 Apr 17 01:11 mysql -rw-r----- 1 root root 2327749 Apr 17 01:11 mysql.ibd.qp drwxr-x--- 2 root root 8192 Apr 17 01:11 performance_schema drwxr-x--- 2 root root 31 Apr 17 01:11 sys -rw-r----- 1 root root 332458 Apr 17 01:11 undo_001.qp -rw-r----- 1 root root 344355 Apr 17 01:11 undo_002.qp -rw-r----- 1 root root 105 Apr 17 01:11 xtrabackup_binlog_info.qp # mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置 -rw-r----- 1 root root 102 Apr 17 01:11 xtrabackup_checkpoints # 备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息 -rw-r----- 1 root root 490 Apr 17 01:11 xtrabackup_info.qp # 主要备份信息 -rw-r----- 1 root root 467 Apr 17 01:11 xtrabackup_logfile.qp # 备份的重做日志文件 -rw-r----- 1 root root 130 Apr 17 01:11 xtrabackup_tablespaces.qp [root@localhost ~]#
- xtrabackup全备恢复
# 关闭数据库 systemctl stop mysqld.service # 备份binlog文件 mv /var/lib/mysql/binlog.00000* /binlog # 可以只备份恢复需要用到的binlog日志,可在备份信息中查看此次全备到了哪个位置 # cat xtrabackup_binlog_info # mysql-bin.000001 1294 # 清空数据目录 rm -rf /var/lib/mysql/* # 解压缩备份文件,备份时未压缩的省略此步骤 xtrabackup --decompress --target-dir=/backup/full/01 # 准备备份 xtrabackup --prepare --target-dir=/backup/full/01 # 恢复完整备份 xtrabackup --copy-back --target-dir=/backup/full/01 # 授权数据库目录文件 chown -R mysql:mysql /var/lib/mysql # 启动mysql systemctl start mysqld
- binlog恢复
# 查看xtrabackup全备恢复到binlog的位置; cat xtrabackup_binlog_info # mysql-bin.000001 1294 # 查找binlog中下一个位置信息 mysqlbinlog /binlog/mysql-bin.000001 | less # at 1294 #200714 13:52:43 server id 1 end_log_pos 1359 CRC32 0x45f9b8f5 Anonymous_GTID last_committed=7 sequence_number=8 rbr_only=no SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/; # at 1359 #200714 13:52:56 server id 1 end_log_pos 1450 CRC32 0xb86b41f8 Query thread_id=10 exec_time=0 error_code=0 SET TIMESTAMP=1594783238/*!*/; create database test5 /*!*/; # at 1450 #200714 13:53:08 server id 1 end_log_pos 1515 CRC32 0x874fbff0 Anonymous_GTID last_committed=8 sequence_number=9 rbr_only=no SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/; # 恢复mysql-bin.000001 中未备份的数据 mysqlbinlog --no-defaults --start-position='1359' /binlog/mysql-bin.000001 | mysql -u root -p # 从1294下一个1359开始恢复,包含1359 # 恢复整个mysql-bin.000002 此步骤在mysql-bin.000001后面有新的binlog产生的情况下操作 mysqlbinlog --no-defaults /binlog/mysql-bin.000002 | mysql -u root -p # 恢复mysql-bin.000003到指定位置,同理根据需要恢复 mysqlbinlog --no-defaults --stop-position='546' /binlog/mysql-bin.000003 | mysql -u root -p # 恢复到546之前的一个数据,不包含546 # 恢复完成
- 使用binlog的其他恢复方法
show binlog events 命令详解:https://blog.csdn.net/weixin_44377973/article/details/107122020 # 生成新的binlog日志文件 mysql> FLUSH LOGS; # 查看binlog日志内容 [root@localhost mysql]# mysqlbinlog --no-defaults mysql-bin.000002 # 基于位置的恢复 # 恢复到指定的地方 [root@localhost mysql]# mysqlbinlog --no-defaults --stop-position='521' mysql-bin.000002 | mysql -u root -p #恢复到521之前的一个数据,不包含521 # 从指定的位置向后开始恢复 [root@localhost mysql]# mysqlbinlog --no-defaults --start-position='521' mysql-bin.000002 | mysql -u root -p #从521之后开始恢复,包含521 # 恢复指定范围内的数据 [root@localhost mysql]# mysqlbinlog --no-defaults --start-position='521' --stop-position='729' mysql-bin.000002 | mysql -u root -p 注释: –no-defaults:不读取任何选项文件,其后需要直接跟日志文件或开始停止位置 # 基于时间点恢复 # 恢复到指定的时间 [root@localhost mysql]# mysqlbinlog --no-defaults --stop-datetime='2022-03-08 21:01:55' mysql-bin.000002 | mysql -u root -p # 从指定的时间开始恢复 [root@localhost mysql]# mysqlbinlog --no-defaults --start-datetime='2022-03-08 21:01:53' mysql-bin.000002 | mysql -u root -p # 恢复指定时间范围内的数据 [root@localhost mysql]# mysqlbinlog --no-defaults --start-datetime='2022-03-08 21:01:53' --stop-datetime='2022-03-08 21:01:55' mysql-bin.000002 | mysql -u root -p
- xtrabackup增量备份、恢复
# 官方文档 https://docs.percona.com/percona-xtrabackup/8.0/backup_scenarios/incremental_backup.html
# 曾备前需要有一份正常的全备
xtrabackup --backup --user=root --password=1234 --compress --compress-threads=4 --target-dir=/data/backups/base
# 查看全备信息 xtrabackup_checkpoints
backup_type = full-backuped ##备份类型为全量备份
from_lsn = 0 # lsn从0开始
to_lsn = 1626007 #lsn到1626007 结束
last_lsn = 1626007
compact = 0
recover_binlog_info = 1
# 基于前一份全备的增备
xtrabackup --backup --user=root --password=1234 --compress --compress-threads=4 --target-dir=/data/backups/inc1 --incremental-basedir=/data/backups/base
# 查看增备inc1信息
backup_type = incremental #备份类型为增量备份
from_lsn = 1626007 #lsn从1626007 开始
to_lsn = 4124244 #lsn到啊4124244 结束
last_lsn = 4124244
compact = 0
recover_binlog_info = 1
# 基于前一个增备再次创建曾备
xtrabackup --backup --user=root --password=1234 --compress --compress-threads=4 --target-dir=/data/backups/inc2 --incremental-basedir=/data/backups/inc1
# 查看增备inc2信息
backup_type = incremental
from_lsn = 4124244
to_lsn = 6938371
last_lsn = 7110572 # In this case you can see that there is a difference between the to_lsn (last checkpoint LSN) and last_lsn (last copied LSN), this means that there was some traffic on the server during the backup process.
compact = 0
recover_binlog_info = 1
# 准备恢复
# 注意!准备增备恢复和全备不一样,在准备增量备份时,必须跳过未提交事务的回滚,因为在备份时未提交的事务可能正在进行中,而且很可能会在下一次增量备份中提交。您应该使用——apply-log-only选项
# If you do not use the --apply-log-only option to prevent the rollback phase, then your incremental backups will be useless. After transactions have been rolled back, further incremental backups cannot be applied.
# 已有如下备份目录
/data/backups/base
/data/backups/inc1
/data/backups/inc2
# 解压缩备份文件,备份时未压缩的省略此步骤
xtrabackup --decompress --target-dir=/data/backups/base
xtrabackup --decompress --target-dir=/data/backups/inc1
xtrabackup --decompress --target-dir=/data/backups/inc2
# 准备全量备份
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
# Warning!
Percona XtraBackup does not support using the same incremental backup directory to prepare two copies of backup. Do not run --prepare with the same incremental backup directory (the value of –incremental-dir) more than once.
# 将第二个增量备份文件加载至全量备份文件中,如果这是最后一个增备,不需要使用apply-log-only
xtrabackup --prepare --target-dir=/data/backups/base --incremental-dir=/data/backups/inc2
# 此时,准备好的完全备份已经包含了所有增量备份,可以按全备恢复即可
xtrabackup --copy-back --target-dir=/data/backups/base
# 授权数据库目录文件
chown -R mysql:mysql /var/lib/mysql
# 启动mysql
systemctl start mysqld