「XtraBackup」- 备份数据的“预备”(Prepare)操作

  CREATED BY JENKINSBOT

问题描述

使用 XtraBackup 产生的备份数据无法直接使用
在数据备份(–backup)后,由于数据文件复制的时间点不同,因此数据不一致而无法使用。另外 InnoDB 会将这些数据文件视为损坏,将拒绝启动。

如何才能使备份数据正常使用,以用于数据库恢复
需要对数据进行“预备”(Prepare)操作,使数据文件完全一致,然后才能用于数据恢复及在 InnoDB 中运行。

环境描述

软件版本:Xtrabackup 2.2

附加说明

在预备操作时发生了什么?
在预备时,XtraBackup 将启动内嵌的修改版 InnoDB 引擎,以处理复制的备份文件,是数据文件保持一致。

执行预备操作的位置
可以在任意服务器中进行预备操作。

配置文件问题
在备份过程中,会在备份目录生成 backup-my.cnf 文件,保存 InnoDB 配置信息。

在预备操作时,需要该配置文件,会被自动加载。错误的配置文件会导致错误的恢复。

软件版本问题
(1)旧版 XtraBackup 备份的数据,可以使用新版 XtraBackup 进行预备操作,但是反过来不行。
(2)另外新版 XtraBackup 可能移除对旧版数据库的支持,也无法用于数据预备操作。比如 XtraBackup 2.2 不再支持 MySQL 5.0,需要使用 XtraBackup 2.1 进行预备操作。

总的来说,保证版本相同就不会有太大问题。

预备命令使用方法

第一次执行

预备操作非常简单,无需关注底层细节:

#!/bin/sh

xtrabackup --prepare --target-dir=/data/backups/mysql/

在预备操作完成并成功后,将显示如下输出:

101107 16:40:15  InnoDB: Shutdown completed; log sequence number <LSN>

第二次执行

可以在备份数据上再次预备:

#!/bin/sh

xtrabackup --prepare --target-dir=/data/backups/mysql/

此时将生成 InnnoDB 日志文件(否则在 MySQL 启动时自动生成,将耗费些时间):

xtrabackup: This target seems to be already prepared.
xtrabackup: notice: xtrabackup_logfile was already used to '--prepare'.
101107 16:54:10  InnoDB: Log file ./ib_logfile0 did not exist: new to be created
InnoDB: Setting log file ./ib_logfile0 size to <SIZE> MB
InnoDB: Database physically writes the file full: wait...
101107 16:54:10  InnoDB: Log file ./ib_logfile1 did not exist: new to be created
InnoDB: Setting log file ./ib_logfile1 size to <SIZE> MB
InnoDB: Database physically writes the file full: wait...
101107 16:54:15  InnoDB: Shutdown completed; log sequence number 1284108

第三次执行

从第三次预备开始,将不会再修改数据文件,即后续预备操作将毫无意义。

从第三次预备开始,命令的输出如下:

xtrabackup: This target seems to be already prepared.
xtrabackup: notice: xtrabackup_logfile was already used to '--prepare'.

注意事项

请勿中断预备操作,否则会导致备份文件损坏,并且无法用于数据恢复。

本文基于 XtraBackup 2.2 版本,而在 XtraBackup 2.4 中,将自动生成 InnoDB 日志文件。

在增量备份中的预备操作

在增量备份中,需要使用 –apply-log-only 进行预备操作,否则无法在备份数据上进行增量备份。

参考文献

Percona XtraBackup 2.2 Documentation/Preparing the backup