问题描述

本文将介绍如何使用 XtraBackup 工具进行 MySQL 数据库实例备份,以及如何使用该备份数据进行恢复。

注意事项
1)、这里“备份实例”指备份整个数据库实例,并非“单个数据库的全量备份”;
2)、在备份中将包含 mysql、sys、perfomance_schema 数据库以及由用户创建的数据库;

创建数据库的备份

第一步、执行备份命令

#!/bin/sh

xtrabackup --backup --user=root --password --target-dir=/data/backups/

备份时间取决于数据库大小;并且可以取消,这并不会影响数据库。

关于备份命令
命令行使用xtrabackup --backup选项进行备份。
命令行使用xtrabackup --target-dir指定备份目录(不存在,则自动创建)。
如果备份目录已经存在且不为空,并且会产生错误(不会覆盖现有文件)。
如果 InnoDB 数据或日志文件在不同目录中,需要在命令行选项指定其所子目录。

注意事项:
日志复制线程会检查事务日志,以确定是否存在需要读取的日志记录。但是如果在日志记录被读取之前已经被写入,就会产生错误。

使用备份恢复数据

准备工作(前提条件)

1)需要将 MySQL 停机;
2)数据库 datadir 目录必须为空;

第一步、进行“预备”操作

什么是“预备”(Prepare)?
在备份完成后,生成的文件不能马上用于恢复。因为备份的数据不是在特定时间点生成的:在备份过程中,数据是在不同时间点复制过来的。所以这些备份不能马上用于恢复,需要先处理。

执行预备命令
执行如下命令来处理备份数据:

#!/bin/sh

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

在 xtrabackup 中,内置修改版 InnoDB 引擎,用于处理备份文件。因此预备动作可以在任何主机中执行。

关于工具版本
在备份数据与预备数据时,建议使用相同版本 xtrabackup 工具。虽然不同版本也是可以的(只要都支持特定数据库版本),为了减少不必要的麻烦,依旧建议使用相同版本进行操作。

附加说明
不建议中断该过程,因为中断会破坏数据完整性。

另外如果该全量备份用于增量备份,需要使用xtrabackup --apply-log-only选项。否则无法用于增量备份,参考「Incremental Backups (XtraBackup)」部分。

第二步、进行数据恢复

本质上只是数据库文件的复制:

#!/bin/sh

# 下面的三种方法都是可以的
xtrabackup --copy-back --target-dir=/data/backups/

xtrabackup --move-back --target-dir=/data/backups/

rsync -avz /data/backups/ "path/to/datadir"

第三步、修改文件权限

在恢复数据文件之后,需要修改数据文件权限,否则MySQL可能无法正常启动:

#!/bin/sh

chown -R mysql:mysql /var/lib/mysql

第四步、后续操作

启动数据库服务,检查日志等操作,根据需要进行操作。

相关文章

「MySQL」- 使用 mysqldump 进行数据备份与恢复(迁移)
「XtraBackup」- 备份数据的“预备”(Prepare)操作
「MySQL」- 恢复数据到特定时间点

参考文献

Percona XtraBackup 2.4 Documentation/The Backup Cycle - Full Backups