4.3.4 制作部分备份

笔记

为了方便创建部分备份,MySQL Enterprise Backup 从 3.10 版本开始引入了两个新的部分备份选项:--include-tables--exclude-tables. 新选项旨在替换 、 、 和 的旧选项--include, 这些选项与新选项不兼容,将在即将发布的版本中弃用。在下面的讨论中,我们假设新选项用于部分备份。出于参考目的,我们在使用旧选项进行部分备份中的本节末尾包含了有关旧选项的信息 。 --databases--databases-list-file--only-innodb-with-frm

默认情况下,数据目录中数据库子目录下的所有文件都包含在备份中,因此备份包括来自所有 MySQL 存储引擎、任何第三方存储引擎的数据,甚至包括该目录中的任何非数据库文件。本节介绍可用于有选择地备份或排除数据的选项。

有多种方法可以使用 MySQL Enterprise Backup 创建不同类型的部分备份:

  • 按名称包括或排除特定表。这使用--include-tablesor --exclude-tables选项。

    --include-tables根据使用or --exclude-tables选项 指定的正则表达式检查每个表 。如果正则表达式与表的完全限定名称匹配(以 的形式 db_name.table_name),则该表包含或排除备份。使用的正则表达式语法是 POSIX 1003.2 标准中指定的扩展形式。选项已实现RE2 正则表达式库。

  • 包括部分或全部 InnoDB 表,但不包括其他表类型。这使用该 --only-innodb选项。

  • 忽略存在于 MySQL 数据目录中但实际上不属于 MySQL 实例的文件。这使用该--only-known-file-types 选项。

  • 通过使用上述选项的组合实现多种选择效果。

  • 使用可传输表空间 (TTS) 备份选择的 InnoDB 表 。这使用 --use-tts--include-tables--exclude-tables(或两者)选项。

有关所有涉及的选项的语法详细信息,请参阅 第 14.8 节,“部分备份和还原选项”

重要的

通常,部分备份比完整备份更难恢复,因为备份数据可能不包括构成完整 MySQL 实例所必需的相互关联的部分。特别是,InnoDB 表具有内部 ID 和其他数据值,它们只能恢复到同一实例,而不能恢复到不同的 MySQL 服务器。始终全面测试任何部分备份的恢复过程,以了解相关过程和限制。

重要的

因为 InnoDB 系统表空间包含实例中所有数据库的有关 InnoDB 表的元数据,所以在包含其他数据库的服务器上恢复部分备份可能会导致系统丢失对其他数据库中那些 InnoDB 表的跟踪。始终在没有任何其他要保留的 InnoDB 表的情况下在新的 MySQL 服务器实例上恢复部分备份。

以下是部分备份的一些命令示例。

将名称以emp开头的所有表包括 到备份中:

$ mysqlbackup \
 --host=localhost --user=mysqluser --protocol=TCP --port=3306 \
 --backup-dir=$MEB_BACKUPS_DIR/backupdir \ --include-tables="\.emp" \
 backup

备份除 mysqlperformance_schema 数据库中的表之外的所有表:

$ mysqlbackup \
 --host=localhost --user=mysqluser --protocol=TCP --port=3306 \
 --backup-dir=$MEB_BACKUPS_DIR/backupdir \
 --exclude-tables="^(mysql|performance_schema)\." \
 backup

备份sales 数据库中的所有表,但排除名称为 hardware ”的表

$ mysqlbackup \
 --host=localhost --user=mysqluser --protocol=TCP --port=3306 \
 --backup-dir=$MEB_BACKUPS_DIR/backupdir \
 --include-tables="^sales\." --exclude-tables="^sales\.hardware$" \
 backup

备份sales reps 数据库中的所有表,但不包括名称为 euro-asia的表(自 3.12.1 版以来,部分备份选项支持空格或破折号等特殊字符):

$ mysqlbackup \
 --host=localhost --user=mysqluser --protocol=TCP --port=3306 \
 --backup-dir=$MEB_BACKUPS_DIR/backupdir \
 --include-tables="^sales reps\." --exclude-tables="^sales reps\.euro-asia" \
 backup

备份所有 InnoDB 表,但不.frm 备份文件:

$ mysqlbackup --defaults-file=/home/dbadmin/.my.cnf --only-innodb backup

您还可以使用适当的命令选项进行 压缩单映像和其他类型的选择性备份。

下一步:

  • 记下完整备份和增量备份末尾消息中的 LSN 值,例如, 。您在执行此完整备份后发生的更改的增量备份时指定此值。 mysqlbackup: Was able to parse the log up to lsn LSN_number

  • 将日志应用于未压缩的备份文件,以便随时可以恢复完整备份。您可以先将备份数据移动到不同的服务器,以避免在数据库服务器上执行此操作的 CPU 和 I/O 开销。

  • 应用日志后,定期 进行增量备份,这比像这样的完整备份更快、更小。

使用旧版选项进行部分备份

重要的

本小节中的信息仅适用于使用、 、 和 的遗留选项--include, 这些选项将在下一期中弃用。对于创建部分备份,强烈建议 改用和 的新选项。请注意,您不能在单个命令中组合旧的和新的部分备份选项。 --databases--databases-list-file--only-innodb-with-frm--include-tables--exclude-tables

MySQL Enterprise Backup 可以使用传统的部分备份选项进行不同类型的部分备份:

有关所有这些选项的语法详细信息,请参阅 旧版部分备份选项

笔记

通常,部分备份比完整备份更难恢复,因为备份数据可能不包括构成完整 MySQL 实例所必需的相互关联的部分。特别是,InnoDB 表具有内部 ID 和其他数据值,它们只能恢复到同一实例,而不能恢复到不同的 MySQL 服务器。始终全面测试任何部分备份的恢复过程,以了解相关过程和限制。

通过它的--include选项, mysqlbackup可以进行备份,其中包括一些 InnoDB 表,但不包括其他表:

  • 带有--include选项的部分备份总是包含 InnoDB 系统表空间和其中的所有表。

  • 对于存储在系统表空间之外的 InnoDB 表,部分备份仅包括那些名称与 --include选项指定的正则表达式匹配的表。

此操作需要将被遗漏的表存储在单独的 table_name.ibd 文件中。要将 InnoDB 表放在系统表空间之外,请在 innodb_file_per_table启用 MySQL 配置选项时创建它。每个.ibd 文件只保存一个表的数据和索引。

innodb_file_per_table关闭时 创建的那些 InnoDB 表 照常存储在 InnoDB系统表空间中,并且不能被排除在备份之外。

对于具有每个表数据文件的每个表,将根据 选项db_name.table_name指定的正则表达式检查 表单的字符串。--include如果正则表达式匹配完整的字符串 db_name.table_name,则该表将包含在备份中。使用的正则表达式语法是POSIX 1003.2 标准中指定的扩展形式。在类 Unix 系统上,适当地引用正则表达式以防止解释 shell 元字符。此功能已通过 RE2 正则表达式库实现。

生成的备份目录包含备份日志文件和 InnoDB 数据文件的副本。

重要提示:虽然 mysqlbackup支持进行部分备份,但从部分备份恢复数据库时要小心。 mysqlbackup还复制 .frm未包含在备份中的那些表的文件,除非您使用例如--databases 选项进行部分备份。如果将mysqlbackup与该 --include选项一起使用,则在恢复数据库之前,从备份数据中删除 .frm未包含在备份中的任何表的文件。

重要提示:因为 InnoDB 系统表空间包含实例中所有数据库的有关 InnoDB 表的元数据,所以在包含其他数据库的服务器上恢复部分备份可能会导致系统丢失对其他数据库中的那些 InnoDB 表的跟踪。始终在没有任何其他要保留的 InnoDB 表的情况下在新的 MySQL 服务器实例上恢复部分备份。

--only-innodb--only-innodb-with-frm选项仅备份 InnoDB 表,跳过其他存储引擎的表 。您还可以将它们与 --include选项一起使用,以选择性地备份 InnoDB 表,同时排除由其他存储引擎创建的所有其他文件。

示例 4.1 对 InnoDB 表进行未压缩的部分备份

在此示例中,我们配置了 MySQL,以便某些 InnoDB 表具有自己的表空间。我们进行了部分备份,仅包括test 数据库中名称以 . 开头的 InnoDB 表ib。数据库的数据库目录的内容test 如下所示。该目录包含数据库中每个.frm表(、、、、、、、、和alex1alex2alex3MySQL 描述 文件(文件) 。在这 10 个表中,有六个 ( , , , , , blobt3ibstest0ibstest09ibtest11a, ibtest11bibtest11cibtest11dalex1alex2alex3blobt3ibstest0ibstest09) 存储在每个表的数据文件 ( .ibdfiles ) 中。

$ ls /sqldata/mts/test
alex1.frm  alex2.ibd  blobt3.frm    ibstest0.ibd  ibtest11a.frm  ibtest11d.frm
alex1.ibd  alex3.frm  blobt3.ibd    ibtest09.frm  ibtest11b.frm
alex2.frm  alex3.ibd  ibstest0.frm  ibtest09.ibd  ibtest11c.frm

我们使用以下 选项运行mysqlbackup--include

# Back up some InnoDB tables but not any .frm files.
$ mysqlbackup --defaults-file=/home/dbadmin/.my.cnf --include="^test\.ib.*" --only-innodb backup
...many lines of output...
mysqlbackup: Scanned log up to lsn 2666737471.
mysqlbackup: Was able to parse the log up to lsn 2666737471.
mysqlbackup: Maximum page number for a log record 0
101208 17:17:45  mysqlbackup: Full backup completed!

# Back up some InnoDB tables and the .frm files for the backed-up tables only.
$ mysqlbackup --defaults-file=/home/dbadmin/.my.cnf --include="^test\.ib.*" \
  --only-innodb-with-frm=related backup
...many lines of output...
mysqlbackup: Scanned log up to lsn 2666737471.
mysqlbackup: Was able to parse the log up to lsn 2666737471.
mysqlbackup: Maximum page number for a log record 0
101208 17:17:45  mysqlbackup: Full backup completed!

备份目录仅包含 表ibstestibtest09 表的备份。其他 InnoDB 表不匹配包含模式 ^test\.ib.*。但是请注意,表ibtest11aibtest11b、位于备份中ibtest11cibtest11d即使它们在下面显示的目录中不可见,因为它们存储在ibdata1始终包含在备份中的系统表空间(文件)中。

# With the --only-innodb option:
$ ls /sqldata-backup/test
ibstest0.ibd   ibtest09.ibd

# With the --only-innodb-with-frm=related option:
$ ls /sqldata-backup/test
ibstest0.frm   ibtest09.frm
ibstest0.ibd   ibtest09.ibd

示例 4.2 制作压缩的部分备份

我们已经配置了 MySQL,以便每个 InnoDB 表都有自己的表空间。我们进行了部分备份,仅包括那些名称以alex or开头的 InnoDB 表blob。数据库的数据库目录的内容test如下所示。

$ ls /sqldata/mts/test
alex1.frm  alex2.ibd  blobt3.frm    ibstest0.ibd  ibtest11a.frm  ibtest11d.frm
alex1.ibd  alex3.frm  blobt3.ibd    ibtest09.frm  ibtest11b.frm
alex2.frm  alex3.ibd  ibstest0.frm  ibtest09.ibd  ibtest11c.frm

我们使用 和 选项 运行mysqlbackup :--compress--include

$ mysqlbackup --defaults-file=/home/dbadmin/.my.cnf --compress \
  --include=".*\.(alex|blob).*" --only-innodb backup
...many lines of output...
mysqlbackup: Scanned log up to lsn 2666737471.
mysqlbackup: Was able to parse the log up to lsn 2666737471.
mysqlbackup: Maximum page number for a log record 0

mysqlbackup: Compressed 147 MB of data files to 15 MB (compression 89%).

101208 17:18:04  mysqlbackup: Full backup completed!

数据库的备份目录test 如下所示。这些.ibz文件是按表压缩的数据文件。

$ ls /sqldata-backup/test
alex1.ibz   alex2.ibz   alex3.ibz   blobt3.ibz

mysqlbackup--databases--databases-list-file选项 让你只从选定的数据库备份非 InnoDB 表,而不是跨整个 MySQL 实例。(要过滤 InnoDB 表,请改用该 选项。)使用 ,您可以指定以空格分隔的数据库名称列表,整个列表用双引号括起来。使用,您可以指定包含数据库名称列表的文件的路径,每行一个。 --include--databases--databases-list-file

部分或全部数据库名称可以用表名限定,以仅从这些数据库中备份选定的非 InnoDB 表。

如果指定此选项,请确保为每个备份(尤其是增量备份)包含相同的数据库集,这样您就不会还原任何数据库的过时版本。