问题描述
本文将简单介绍如何使用 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