Percona XtraBackup是基于MySQL的服务器的开源热备份实用程序,在备份过程中不会锁定数据库。
它可以从MySQL 5.1 [1],5.5、5.6和5.7服务器以及带有XtraDB的MySQL的Percona服务器上的InnoDBXtraDBMyISAM表中 备份数据。
有关其许多高级功能的高级概述,包括功能比较,请参见关于Percona XtraBackup
无论是24x7高负载服务器还是低事务量环境,Percona XtraBackup都旨在使备份成为无缝过程,而不会破坏生产环境中服务器的性能。有商业支持合同
重要的
Percona XtraBackup 2.4不支持对在MySQL 8.0,用于MySQL 8.0的Percona ServerPercona XtraDB Cluster 8.0中创建的数据库进行备份。

前置要求

在安装有MySQL的服务器中安装Percona XtraBackup

1.完整备份

将数据备份到【/home/data/backups/full/】目录中

  1. xtrabackup --user=root --password=123456 --backup --target-dir=/home/data/backups/full/

1.2.准备备份

使用 xtrabackup --backup 选项进行备份后,首先需要准备好备份才能还原。xtrabackup --prepare步骤可以使文件在单个时刻完美地保持一致。如果打算将备份作为进一步增量备份的基础,则在准备备份时应使用 xtrabackup --apply-log-only选项,否则将无法对其应用增量备份。 有关更多详细信息,请参见有关准备增量备份的文档。

  1. xtrabackup --prepare --target-dir=/home/data/backups/full/

1.3.恢复备份

必须先准备好备份,然后才能还原它。恢复备份之前,datadir 必须为空。同样需要注意的是,必须先关闭MySQL服务器,然后才能执行还原操作。您无法还原到正在运行的mysqld实例的 datadir (导入部分备份时除外)。

可以使用 scp 命令将备份的数据移动到其他MySQL服务器中进行恢复

  1. scp -r /home/data/backups/full/ root@192.168.28.150:/home/data/backups/full/

1.3.1.关闭MySQL服务

  1. service mysql stop

1.3.2.清空datadir目录

  1. rm -rf /xxx/xxx

1.3.3.开始还原数据

  1. xtrabackup --copy-back --target-dir=/home/data/backups/full/

1.3.4.更改数据目录权限

您需要将文件的所有权更改为mysql,因为它们将由创建备份的用户拥有

  1. chown -R mysql:mysql /home/mysql-5.7.26/

1.3.5.启动MySQL服务

  1. service mysql start

2.增量备份

要进行增量备份,必须要先进行完整备份

2.1.基于完整备份进行增量备份,使用如下命令

  1. xtrabackup --user=root --password=123456 --backup --target-dir=/home/data/backups/increment/inc1 --incremental-basedir=/home/data/backups/increment/full

现在可以将此增量目录用作另一个增量备份的基础

  1. xtrabackup --user=root --password=123456 --backup --target-dir=/home/data/backups/increment/inc2 --incremental-basedir=/home/data/backups/increment/inc1

2.2.观察增量备份情况

查看基础备份xtrabackup_checkpoints文件

  1. cat full/xtrabackup_checkpoints
  2. #例如展示如下内容
  3. backup_type = full-backuped
  4. from_lsn = 0
  5. to_lsn = 2527770
  6. last_lsn = 2527779
  7. compact = 0
  8. recover_binlog_info = 0

查看增量备份xtrabackup_checkpoints文件
from_lsn 是备份的起始LSN,对于增量备份,它必须与先前/基本备份的 to_lsn (如果它是最后一个检查点)相同。

  1. cat inc1/xtrabackup_checkpoints
  2. #例如展示如下内容
  3. backup_type = incremental
  4. from_lsn = 2527770
  5. to_lsn = 2528044
  6. last_lsn = 2528053
  7. compact = 0
  8. recover_binlog_info = 0

在这种情况下,您可以看到to_lsn (最后一个检查点LSN)和last_lsn (最后一个复制的LSN)之间存在差异,这意味着在备份过程中服务器上有一些流量。

2.3.准备增量备份

增量备份的xtrabackup —prepare步骤与完全备份不同。 在完全备份中,执行两种类型的操作以使数据库保持一致:已提交的事务相对于数据文件从日志文件中重放,未提交的事务被回滚。 在准备增量备份时,您必须跳过未提交事务的回滚,因为在备份时未提交的事务可能正在进行中,并且很可能会在下一次增量备份中提交。
您应该使用 xtrabackup —apply-log-only 选项来防止回滚阶段。

如果不使用xtrabackup —apply-log-only选项来防止回滚阶段,则增量备份将无用。 事务回滚后,无法再应用增量备份。

2.3.1.要准备基本备份,您需要像往常一样运行 xtrabackup —prepare ,但是要防止回滚阶段

  1. xtrabackup --prepare --apply-log-only --target-dir=/home/data/backups/increment/full

2.3.2.要将第一个增量备份应用于完整备份,请运行以下命令

  1. xtrabackup --prepare --apply-log-only --target-dir=/home/data/backups/increment/full --incremental-dir=/home/data/backups/increment/inc1

3.3.准备第二个增量备份是一个类似的过程:将增量应用到(已修改的)基本备份,您将及时将其数据前滚到第二个增量备份的点

  1. xtrabackup --prepare --target-dir=/home/data/backups/increment/full --incremental-dir=/home/data/backups/increment/inc2

说明:合并除最后一个以外的所有增量时,应使用xtrabackup —apply-log-only。
这就是为什么上一行不包含xtrabackup —apply-log-only选项的原因。
即使在最后一步使用了xtrabackup —apply-log-only,备份仍将保持一致,但在这种情况下,服务器将执行回滚阶段。

2.4.恢复备份

一旦准备好,增量备份就与完整备份相同,并且可以用相同的方式还原它们,请参考恢复备份

3.部分备份

⚠警告
如果在备份过程中删除了任何匹配或列出的表,则xtrabackup将失败。
不要复制回准备好的备份。还原部分备份应通过导入表而不是使用该—copy-back选项来完成。不建议在运行部分备份之后运行增量备份。
尽管在某些情况下可以通过复制回文件来完成还原,但这在许多情况下可能导致数据库不一致,因此不建议这样做。

3.1使用xtrabackup—tables

第一种方法涉及xtrabackup —tables选项。 该选项的值是一个正则表达式,它与标准的表名(包括数据库名)匹配,格式为databasename.tablename.

要仅备份某个数据库数据库中的所有表,可以使用以下命令:

  1. xtrabackup --user=root --password=123456 --backup --target-dir=/home/data/backups/tables/ --tables="^ngcc_db[.].*"

要仅备份某个数据库中的一个表,可以使用以下命令:

  1. xtrabackup --user=root --password=123456 --backup --target-dir=/home/data/backups/table/ --tables="^ngcc_db[.]voicemail_user"

3.2.使用xtrabackup—tables-file

xtrabackup —tables-file指定一个文件,该文件可以包含多个表名,文件中每行一个表名。 仅备份文件中命名的表。 名称完全匹配,区分大小写,没有模式或正则表达式匹配。 表名必须完全合格,格式为databasename.tablename。

  1. echo "mydatabase.mytable" > /tmp/tables.txt
  2. xtrabackup --user=root --password=123456 --backup --target-dir=/home/data/backups/fileTable/ --tables-file=/tmp/tables.txt

3.3.使用xtrabackup —databasesxtrabackup —databases-file

xtrabackup —databases接受以空格分隔的数据库和表列表,以格式databasename[.tablename].进行备份。 除了此列表之外,请确保指定mysql,sys, 和performance_schema数据库。 使用xtrabackup —copy-back.还原数据库时,这些数据库是必需的。

使用--databases备份,可以使用以下命令

  1. xtrabackup --user=root --password=123456 --backup --databases="ngcc_db.voicemail_user ngcc_test" --target-dir=/home/data/backups/partial/

使用--databases-file备份,可以使用以下命令

  1. echo "mydatabase.mytable" > /tmp/databases.txt
  2. xtrabackup --user=root --password=123456 --backup --databases-file=/tmp/databases.txt --target-dir=/home/data/backups/fileDatabase/

xtrabackup —databases-file指定一个文件,该文件可以以databasename[.tablename]格式包含多个数据库和表,该文件中每行一个元素名称。 名称完全匹配,区分大小写,没有模式或正则表达式匹配。

如果在准备步骤中处理的表是在备份开始后创建的,则即使未在参数中明确列出这些表,也可以将它们添加到备份中。

3.4.部分恢复/恢复单个表

在5.6之前的服务器版本中,即使使用innodb_file_per_table,也无法通过复制文件在服务器之间复制表。 但是,使用Percona XtraBackup,您可以从任何InnoDB数据库导出单个表,然后将它们导入到具有XtraDB或MySQL 5.6的MySQL的Percona Server中。 (源不必是XtraDB或MySQL 5.6,但目的地必须是。)这仅适用于单个.ibd文件,并且不能导出其自身.ibd文件中未包含的表。

3.4.1.导出表

该表应该已经以innodb_file_per_table模式创建,因此像往常一样使用xtrabackup —backup进行备份后,.ibd文件应该存在于目标目录中:

  1. find /home/data/backups/fileTable/ -name voicemail_user.*
  2. #输出如下
  3. /home/data/backups/fileTable/voicemail_user.ibd

3.4.2.准备备份,请在命令中添加额外的参数xtrabackup —export

  1. xtrabackup --prepare --export --target-dir=/home/data/backups/fileTable/

现在,您应该在目标目录中看到一个.exp文件:

  1. find /home/data/backups/fileTable/ -name voicemail_user.*
  2. #输出如下
  3. /home/data/backups/fileTable/voicemail_user.exp
  4. /home/data/backups/fileTable/voicemail_user.ibd
  5. /home/data/backups/fileTable/voicemail_user.cfg

这三个文件都是将表导入到运行Percona Server for MySQL(带有XtraDB或MySQL 5.7)的服务器所需的全部文件。 如果服务器使用InnoDB表空间加密,则将为加密表列出其他.cfp文件。

3.4.3.导入表

在启用了XtraDB和innodb_import_table_from_xtrabackup选项的运行Percona Server for MySQL的目标服务器上,或在MySQL 5.6上,创建具有相同结构的表,然后执行以下步骤:

1.在MySQL中执行如下语句

  1. ALTER TABLE ngcc_db.voicemail_user DISCARD TABLESPACE;

如果看到以下消息,则必须启用innodb_file_per_table并再次创建该表

  1. ERROR 1030 (HY000): Got error- 1 from storage engine

2.将导出的文件复制到目标服务器的数据目录的ngcc_db/子目录中

  1. cp /home/data/backups/fileTable/ngcc_db/voicemail_user.ibd /home/mysql-5.7.26/data/ngcc_db
  2. cp /home/data/backups/fileTable/ngcc_db/voicemail_user.exp /home/mysql-5.7.26/data/ngcc_db
  3. cp /home/data/backups/fileTable/ngcc_db/voicemail_user.cfg /home/mysql-5.7.26/data/ngcc_db

3.设置mysql数据目录权限

  1. chown -R mysql:mysql /home/mysql-5.7.26/data/

4.在MySQL中执行表空间导入

  1. ALTER TABLE ngcc_db.voicemail_user IMPORT TABLESPACE;

现在应该导入该表,并且您应该可以从中进行SELECT并查看导入的数据。

在您对导入的表运行ANALYZE TABLE之前,导入的表空间的持久统计信息将为空。 它们将为空,因为它们存储在系统表mysql.innodb_table_stats和mysql.innodb_index_stats中,并且在导入期间不会由服务器进行更新。 这是由于上游bug#72368.。

3.4.部分恢复/恢复单个数据库

3.4.1.准备备份

使用 xtrabackup --backup 选项进行备份后,首先需要准备好备份才能还原。xtrabackup --prepare步骤可以使文件在单个时刻完美地保持一致。

  1. xtrabackup --prepare --target-dir=/home/data/backups/full/

3.4.2.恢复备份

请确保mysql,sys, 和performance_schema数据库都在备份中,使用xtrabackup —copy-back.还原数据库时,这些数据库是必需的。
恢复单个数据库和完整备份的恢复操作一致请参考恢复备份