Xtrabackup MySQL备份与恢复

XVo80o

1.Xtrabackup介绍

MySQL冷备、mysqldump、MySQL热拷贝都无法实现对数据库进行增量备份。在实际生产环境中增量备份是非常实用的,如果数据大于50G或100G,存储空间足够的情况下,可以每天进行完整备份,如果每天产生的数据量较大,需要定制数据备份策略。例如每周日使用完整备份,周一到周六使用增量备份。而Percona-Xtrabackup就是为了实现增量备份而出现的一款主流备份工具,xtrabackup有2个工具,分别是xtrabackup、innobackupex。

Percona-xtrabackup是 Percona公司开发的一个用于MySQL数据库物理热备的备份工具,支持MySQL、Percona server和MariaDB,开源免费,是目前较为受欢迎的主流备份工具。xtrabackup只能备份innoDB和xtraDB两种数据引擎的表,而不能备份MyISAM数据表。

2.Xtrabackup优点

  1. 备份速度快,物理备份可靠
  2. 备份过程不会打断正在执行的事务(无需锁表)
  3. 能够基于压缩等功能节约磁盘空间和流量
  4. 自动备份校验
  5. 还原速度快
  6. 可以流传将备份传输到另外一台机器上
  7. 在不增加服务器负载的情况备份数据

3.Xtrabackup备份原理

Xtrabackup备份流程图:
79dRg1

  1. innobackupex启动后,会先fork一个进程,用于启动xtrabackup,然后等待xtrabackup备份ibd数据文件;
  2. xtrabackup在备份innoDB数据时,有2种线程:redo拷贝线程和ibd数据拷贝线程。xtrabackup进程开始执行后,会启动一个redo拷贝的线程,用于从最新的checkpoint点开始顺序拷贝redo.log;再启动ibd数据拷贝线程,进行拷贝ibd数据。这里是先启动redo拷贝线程的。在此阶段,innobackupex处于等待状态(等待文件被创建)
  3. xtrabackup拷贝完成ibd数据文件后,会通知innobackupex(通过创建文件),同时xtrabackup进入等待状态(redo线程依旧在拷贝redo.log)
  4. innobackupex收到xtrabackup通知后哦,执行FLUSH TABLES WITH READ LOCK(FTWRL),取得一致性位点,然后开始备份非InnoDB文件(如frm、MYD、MYI、CSV、opt、par等格式的文件),在拷贝非InnoDB文件的过程当中,数据库处于全局只读状态。
  5. 当innobackup拷贝完所有的非InnoDB文件后,会通知xtrabackup,通知完成后,进入等待状态;
  6. xtrabackup收到innobackupex备份完成的通知后,会停止redo拷贝线程,然后通知innobackupex,redo.log文件拷贝完成;
  7. innobackupex收到redo.log备份完成后,就进行解锁操作,执行:UNLOCK TABLES;
  8. 最后innobackupex和xtrabackup进程各自释放资源,写备份元数据信息等,innobackupex等xtrabackup子进程结束后退出。

4.准备工作

4.1 安装数据恢复工具Percona XtraBackup

  1. MySQL 5.6、MySQL 5.7版本需要安装 Percona XtraBackup 2.4,安装指导请参见官方文档**Percona XtraBackup 2.4**

  2. MySQL 8.0版本需要安装 Percona XtraBackup 8.0,安装指导请参见官方文档**Percona XtraBackup 8.0**

  3. Percona XtraBackup下载地址

4.3 安装并行压缩软件

由于项目原因,备份文件都是100G以上,而默认tar打包和系统默认的压缩工具是单线程的。服务器多核CPU完全利用不起来,瓶颈在CPU的处理上面。于是使用了pigz这个可以利用多核的并行压缩工具。效果显著,如果你也需要频繁压缩大量的数据,可以尝试一下这个软件。

yum install pigz

4.4 常用选项

常用选项:

  1. --host 指定主机
  2. --user 指定用户名
  3. --password 指定密码
  4. --port 指定端口
  5. --databases 指定数据库
  6. --incremental 创建增量备份
  7. --incremental-basedir 指定包含完全备份的目录
  8. --incremental-dir 指定包含增量备份的目录
  9. --apply-log 对备份进行预处理操作 - 一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。 - 因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。
  10. --redo-only 不回滚未提交事务
  11. --copy-back 恢复备份目录
  12. --remove-original 在Percona XtraBackup 2.4.6以上版本支持,当指定将删除此选项.qp,.xbcrypt并.qp.xbcrypt解密和解压后的文件

使用innobackupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAMMERGECSVARCHIVE表的相关文件,

同时还会备份触发器和数据库配置信息相关的文件,这些文件会被保存到一个以时间命名的目录当中。在备份的同时,innobackupex还会在备份目录中创建如下文件:

  • xtrabackup_checkpoints – 备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息:每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN,LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的。
  • xtrabackup_binlog_info – mysql服务器当前正在使用的二进制日志文件及备份这一刻位置二进制日志时间的位置。
  • xtrabackup_binlog_pos_innodb – 二进制日志文件及用于InnoDB或XtraDB表的二进制日志文件的当前position
  • xtrabackup_binary – 备份中用到的xtrabackup的可执行文件;
  • backup-my.cnf – 备份命令用到的配置选项信息:在使用innobackupex进行备份时,还可以使用--no-timestamp选项来阻止命令自动创建一个以时间命名的目录:如此一来,innobackupex命令将会创建一个BACKUP-DIR目录来存储备份数据。

如果要使用一个最小权限的用户进行备份,则可基于如下命令创建此类用户:

mysql> CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY '123456';  #创建用户
mysql> REVOKE ALL PRIVILEGES,GRANT OPTION FROM 'bkpuser';  #回收此用户所有权限
mysql> GRANT RELOAD,LOCK TABLES,RELICATION CLIENT ON *.* TO 'bkpuser'@'localhost';  #授权刷新、锁定表、用户查看服务器状态
mysql> FLUSH PRIVILEGES;  #刷新授权表

注意:备份时需启动MySQL,恢复时需关闭MySQL,清空mysql数据目录且不能重新初始化,恢复数据后应该立即进行一次完全备份

5.xtrabackup全量备份与恢复

5.1 全量备份

5.1.1 备份命令

innobackupex --defaults-file=/etc/my.cnf --host=127.0.0.1 --user=root --password='123456' --compress --parallel=4 --compress-threads=4 /home/data/mysql_backup

命令解释:

  • --defaults-file该选项指定了从哪个文件读取MySQL配置,必须放在命令行第一个选项的位置;
  • --host 该选项表示备份数据库的地址;
  • --compress 该选项表示压缩innodb数据文件的备份;
  • --compress-threads 该选项表示并行压缩worker线程的数量;

执行完成后会在备份目录/home/data/mysql_backup下生成一个以时间戳命名的文件夹。

[root@iZwz9d0xkblxm672qgl0huZ mysql_backup]# ll
total 6204920
drwxr-x--- 15 root root       4096 Jul  7 16:42 2021-07-07_15-12-44
[root@iZwz9d0xkblxm672qgl0huZ mysql_backup]# ll 2021-07-07_15-12-44
total 1997588
drwxr-x--- 2 root root      36864 Jul  7 16:42 analticdb
-rw-r----- 1 root root        413 Jul  7 16:42 backup-my.cnf.qp
drwxr-x--- 2 root root       4096 Jul  7 16:42 data_business
drwxr-x--- 2 root root       4096 Jul  7 16:42 data_business_test
drwxr-x--- 2 root root      16384 Jul  7 16:42 data_market
drwxr-x--- 2 root root       4096 Jul  7 16:42 data_market_temp
-rw-r----- 1 root root     517456 Jul  7 16:42 ib_buffer_pool.qp
-rw-r----- 1 root root 2044853153 Jul  7 15:17 ibdata1.qp
drwxr-x--- 2 root root      20480 Jul  7 16:42 jxe_ods
drwxr-x--- 2 root root       4096 Jul  7 16:42 lost+found
drwxr-x--- 2 root root       4096 Jul  7 16:42 mysql
drwxr-x--- 2 root root       4096 Jul  7 16:42 performance_schema
drwxr-x--- 2 root root       4096 Jul  7 16:42 report
drwxr-x--- 2 root root      20480 Jul  7 16:42 test
drwxr-x--- 2 root root       4096 Jul  7 16:42 test2
drwxr-x--- 2 root root       4096 Jul  7 16:42 tmp
-rw-r----- 1 root root        163 Jul  7 16:42 xtrabackup_binlog_info.qp
-rw-r----- 1 root root        127 Jul  7 16:42 xtrabackup_checkpoints
-rw-r----- 1 root root        625 Jul  7 16:42 xtrabackup_info.qp
-rw-r----- 1 root root        508 Jul  7 16:42 xtrabackup_logfile.qp

5.1.2 打包压缩

为了减小备份后的文件体积以及方便文件传输,对备份目录进行tar.gz打包压缩;

tar --use-compress-program=pigz -cpvf 2021-07-07_15-12-44.tar.gz ./2021-07-07_15-12-44

5.2 全量备份恢复

5.2.1 复制备份文件复制到测试端机器

[root@iZwz9d0xkblxm672qgl0huZ mysql_backup]# rsync -P 2021-07-07_15-12-44.tar.gz root@192.168.1.101:/home/data/backup/2021-07-07_15-12-44.tar.gz

5.2.2 解压备份文件(以下操作都在恢复测试端机器)

cd /home/data/backup/
# 解包
tar  --use-compress-program=pigz -xvf test1.tar.gz -C /home/data/backup/2021-07-07_15-12-44
# 使用innobackupex解压,需要安装qpress
innobackupex --decompress --remove-original /home/data/backup/2021-07-07_15-12-44

5.2.3 恢复操作

恢复解压好的备份文件

# 对备份进行预处理操作
## MySQL 5.6/5.7
innobackupex --defaults-file=/home/mysql/data/backup-my.cnf --apply-log /home/data/backup/2021-07-07_15-12-44
## MySQL 8.0
xtrabackup --prepare --target-dir=/home/data/backup/2021-07-07_15-12-44
# 恢复备份目录
xtrabackup --datadir=/var/lib/mysql --copy-back --target-dir=/home/data/backup/2021-07-07_15-12-44
  • 恢复时请耐心等待,若系统返回如下类似结果,则说明备份文件已成功恢复到自建数据库。
    Ag2zPS
  • 若系统返回如下报错,可以用rm -rf /var/lib/mysql命令清空文件夹内文件,然后用chown -R mysql:mysql /var/lib/mysql修改权限。
    BuLOod

6.增量备份

增量备份前必须要有一个全量备份的数据,然后针对全量备份的和当前实际数据进行差异对比,并备份差异数据。

6.1 参数说明

  • --incremental 增量备份的文件夹
  • --incremental-basedir 针对哪个做增量备份

在备份的文件夹中,有几个文件值得注意:

  • xtrabackup_binlog_info记录了binlogposition,若开启了GTID,也会将GTID取出。在用于备份+binlog恢复或建立slave的场景里十分有用。
  • xtrabackup_checkpoints记录了此次备份的类型和lsn号的起始值,是否压缩等。
  • xtrabackup_info则记录了备份工具的信息,时间,备份对象(是针对全实例还是某库表),是否是增量,binlog位置等。

6.2 增量备份命令参考

innobackupex --defaults-file=/etc/my.cnf --host=127.0.0.1 --user=root --password='123456' --compress --parallel=4 --compress-threads=4 --incremental-basedir=/home/data/mysql_backup/2021-08-28_11-54-01 --incremental /home/data/mysql_backup

命令执行完成后,备份目录出现如下目录:

[root@iZwz97622ueir7veynmfqpZ mysql_backup]# ls -lh
total 18G
drwx------ 18 root root 4.0K Aug 28 12:00 2021-08-28_11-54-01
drwx------ 18 root root 4.0K Aug 28 14:10 2021-08-28_14-03-47

7.增量备份的恢复

7.1 复制备份文件复制到测试端机器

增量备份、全量备份的文件都需要复制到相同目录下

[root@iZwz9d0xkblxm672qgl0huZ mysql_backup]# rsync -P 2021-08-28_14-03-47 root@192.168.1.101:/home/data/backup/2021-08-28_14-03-47

[root@iZwz9d0xkblxm672qgl0huZ mysql_backup]# rsync -P 2021-08-28_11-54-01root@192.168.1.101:/home/data/backup/2021-08-28_11-54-01

7.2 解压备份文件(以下操作都在恢复测试端机器)

cd /home/data/backup/
# 使用innobackupex解压,需要安装qpress
innobackupex --decompress --remove-original /home/data/backup/2021-08-28_14-03-47 
innobackupex --decompress --remove-original /home/data/backup/2021-08-28_11-54-01

7.3 恢复操作

# 对备份进行预处理操作
## MySQL 5.6/5.7
innobackupex --defaults-file=/home/mysql/data/backup-my.cnf --apply-log /home/data/backup/2021-08-28_11-54-01
## MySQL 8.0
xtrabackup --prepare --target-dir=/home/data/backup/2021-08-28_11-54-01
# 恢复备份目录
xtrabackup --datadir=/var/lib/mysql --copy-back --target-dir=/home/data/backup/2021-08-28_11-54-01

恢复时请耐心等待,若系统返回如下类似结果,则说明备份文件已成功恢复到自建数据库。
j02NFh

若系统返回如下报错,可以用rm -rf /var/lib/mysql命令清空文件夹内文件,然后用chown -R mysql:mysql /var/lib/mysql修改权限。
Pvcf0M