完整恢复
准备备份
使用 xtrabackup --backup 选项进行备份后,首先需要准备好备份才能还原。xtrabackup --prepare步骤可以使文件在单个时刻完美地保持一致。
如果打算将备份作为进一步增量备份的基础,则在准备备份时应使用 xtrabackup --apply-log-only选项,否则将无法对其应用增量备份。 有关更多详细信息,请参见有关准备增量备份的文档。
xtrabackup --prepare --target-dir=/home/data/backups/full/
恢复备份
必须先准备好备份,然后才能还原它。 恢复备份之前,datadir 必须为空。同样需要注意的是,必须先关闭MySQL服务器,然后才能执行还原操作。 您无法还原到正在运行的mysqld实例的 datadir (导入部分备份时除外)。
关闭MySQL服务
service mysql stop
清空datadir目录
rm -rf /xxx/xxx
开始还原数据
xtrabackup --copy-back --target-dir=/home/data/backups/full/
您需要将文件的所有权更改为mysql,因为它们将由创建备份的用户拥有
chown -R mysql:mysql /home/mysql-5.7.26/
启动MySQL服务
service mysql start
恢复单个表
在5.6之前的服务器版本中,即使使用innodb_file_per_table,也无法通过复制文件在服务器之间复制表。 但是,使用Percona XtraBackup,您可以从任何InnoDB数据库导出单个表,然后将它们导入到具有XtraDB或MySQL 5.6的MySQL的Percona Server中。 (源不必是XtraDB或MySQL 5.6,但目的地必须是。)这仅适用于单个.ibd文件,并且不能导出其自身.ibd文件中未包含的表。
让我们看看如何导出和导入下表:
CREATE TABLE export_test (a int(11) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=latin1;
如果您运行的Percona Server for MySQL版本早于5.5.10-20.1,则应使用变量innodb_expand_import代替innodb_import_table_from_xtrabackup.
导出表
该表应该已经以innodb_file_per_table模式创建,因此像往常一样使用xtrabackup —backup进行备份后,.ibd文件应该存在于目标目录中:
find /data/backups/mysql/ -name export_test.*#输出如下/data/backups/mysql/test/export_test.ibd
准备备份时,请在命令中添加额外的参数xtrabackup —export。 这是一个例子:
xtrabackup --prepare --export --target-dir=/data/backups/mysql/
如果您要还原加密的 encrypted InnoDB tablespace 表,则还需要指定密钥环文件:
xtrabackup --prepare --export --target-dir=/tmp/table \--keyring-file-data=/var/lib/mysql-keyring/keyring
现在,您应该在目标目录中看到一个.exp文件:
find /data/backups/mysql/ -name export_test.*#输出如下/data/backups/mysql/test/export_test.exp/data/backups/mysql/test/export_test.ibd/data/backups/mysql/test/export_test.cfg
这三个文件都是将表导入到运行Percona Server for MySQL(带有XtraDB或MySQL 5.7)的服务器所需的全部文件。 如果服务器使用InnoDB表空间加密,则将为加密表列出其他.cfp文件。
MySQL使用.cfg文件,其中包含特殊格式的InnoDB字典转储。 这种格式不同于XtraDB中出于相同目的使用的.exp格式。 严格来说,将表空间导入MySQL 5.7或Percona Server for MySQL 5.7不需要.cfg文件。 即使一个表空间是从另一台服务器导入的,它也将被成功导入,但是,如果在同一目录中存在相应的.cfg文件,则InnoDB会进行模式验证。
导入表
在启用了XtraDB和innodb_import_table_from_xtrabackup选项的运行Percona Server for MySQL的目标服务器上,或在MySQL 5.6上,创建具有相同结构的表,然后执行以下步骤:
- 执行ALTER TABLE test.export_test DISCARD TABLESPACE;
- 如果看到以下消息,则必须启用innodb_file_per_table并再次创建该表:ERROR 1030 (HY000): Got error- 1 from storage engine
- 将导出的文件复制到目标服务器的数据目录的test/子目录中
- 执行chown -R mysql:mysql /home/mysql-5.7.26/data/ 设置mysql数据目录权限
- 执行ALTER TABLE test.export_test IMPORT TABLESPACE;
现在应该导入该表,并且您应该可以从中进行SELECT并查看导入的数据。
在您对导入的表运行ANALYZE TABLE之前,导入的表空间的持久统计信息将为空。 它们将为空,因为它们存储在系统表mysql.innodb_table_stats和mysql.innodb_index_stats中,并且在导入期间不会由服务器进行更新。 这是由于上游bug#72368.。
