「XtraBackup」- 部分备份与数据恢复

  CREATED BY JENKINSBOT

问题描述

本文将简单介绍如何使用 XtraBackup 进行“部分备份” —— 备份特定表(或者数据库),并从使用备份进行数据恢复。

前提条件

备份的表必须在独立的表空间中,因此服务器要启用innodb_file_per_table选项。

恢复部分备份需要导入表(ALTER TABLE m.n IMPORT TABLESPACE),而不是使用传统的--copy-back选项。虽然在某些场景下直接复制表文件也可以生效,但是可能会导致数据不一致的情况,不建议如此操作。

如何创建备份?

第一步、创建备份

有三种方法指定要备份的部分数据:(1)正则表达式;(2)在文件中枚举表;(3)提供数据库列表;

正则表达式
提供给该选项的正则表达式将用于匹配“全限定表名”,包括库名,以databasename.tablename形式:

#!/bin/sh

innobackupex --user=root --password="your password" --include='^mydb[.]mytable' /path/to/backup

该命令将创建以时间戳命名目录,并将innobackupex创建的文件保存在其中,但是只有正则表达式匹配的数据文件。

注意,该选项会被专递给xtrabackup --tables选项,并且该选项将匹配每个数据库的每个表。即使数据库是空的,也会为他们创建对应目录。

在文件中枚举表
通过文件指定需要备份的表明,每张表一行,以databasename.tablename形式:

#!/bin/sh

echo "mydatabase.mytable" > /tmp/tables.txt
innobackupex --tables-file=/tmp/tables.txt /path/to/backup

该命令将创建以时间戳命名的目录,但是只包含文件中列出的数据库文件。

注意,该选项会被专递给xtrabackup --tables-file选项,与–tables选项不同,只会为文件中列出的数据库创建目录。

提供数据库列表
提供给该选项的参数,可以是空格分隔的数据库或表名列表,也可以是在文件中的项(每行一个):

#!/bin/sh

innobackupex --databases="mydatabase.mytable mysql" /path/to/backup

该命令将创建以时间戳命名目录,但是只包含文件中列出的数据库文件。

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

在备份被用于恢复之前,需要进行“预备”操作,使用--export选项:

#!/bin/sh

innobackupex --apply-log --export /path/to/partial/backup/xxxx-xx-xx_xx-xx-xx/

执行上述命令后,会为每个具有自己表空间的InnoDB表创建.exp文件。此时在备份目录中,每张表会对应三个文件(.exp,.ibd,.cfg),在将表导入 Percona Server with XtraDB 或 MySQL 5.6 时使用。

注意事项:在MySQL中,需要使用.cfg文件,该文件包含InnoDB目录转储。在XtraDB中,需要使用.exp文件,目的相同,但格式与.cfg不同。严格来讲,导入表空间时,并非必须.cfg文件。即使来自其他服务器的表空间也能够导入成功,但是如果对应的.cfg文件存在,则InnoDB将进行验证。

附加说明:
为了创建.exp文件,可以在已经准备的备份上使用innobackupex --apply-log --export命令。
可能会输出表不存在的警告,因为InnoDB引擎使用.frm文件恢复数据目录。innobackupex将使用xtrabackup移除丢失的表。

数据恢复

在MySQL 5.6之前,即使启用 innodb_file_per_table 参数,也无法通过复制文件在服务器间实现表复制。但使用 XtraBackup 工具,可以从从任何 InnoDB 数据库导出单独表,然后将它们导入 Percona Server with XtraDB 或者 MySQL 5.6 (源数据库无需为XtraDB 或 MySQL 5.6,但目标服务器必须满足)。如果要使用该方法,表必须有单独的.ibd文件,否则不能使用该方法。

注意事项:在恢复数据之前,确保已经对备份数据进行“预备”操作。

第一步、创建新表

在目的数据库中,创建相同表:

CREATE TABLE mytable (...) ENGINE=InnoDB;

第二步、丢弃表空间

然后,将新表的表空间丢弃:

ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;

第三步、复制表文件

对于MySQl数据库,将.ibd与.cfg文件复制到数据目录:

#!/bin/sh

cp "/<path>/<to>/mydatabase/mytable.ibd" "/<path>/<to>/<data>/mydatabase/mytable.ibdz"
cp "/<path>/<to>/mydatabase/mytable.cfg" "/<path>/<to>/<data>/mydatabase/mytable.cfg"

# 注意修改权限:
chown mysql:mysql "/<path>/<to>/<data>/mydatabase/mytable.ibd"
chown mysql:mysql "/<path>/<to>/<data>/mydatabase/mytable.cfg"

第四步、导入表空间

最后导入表空间即可:

ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;

注意该步骤可能比较耗时。

第五步、验证数据库

连接数据,验证数据一致性。

参考文献

Partial Backups
Restoring Individual Tables