4.3.5 制作部分备份

笔记

为了方便创建部分备份,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(或两者)选项。

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

重要的

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

重要的

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

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

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

mysqlbackup \
 --host=localhost --user=mysqluser --protocol=TCP --port=3306 \
 --backup-dir=$MEB_TEMP_BACKUP_DIR --backup-image=$MEB_BACKUPS_DIR/my.mbi \
 --include-tables="\.emp" \
 backup-to-image

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

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

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

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

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

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

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

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

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

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

重要的

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

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

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

笔记

Typically, a partial backup is more difficult to restore than a full backup, because the backup data might not include the necessary interrelated pieces to constitute a complete MySQL instance. In particular, InnoDB tables have internal IDs and other data values that can only be restored to the same instance, not a different MySQL server. Always fully test the recovery procedure for any partial backups to understand the relevant procedures and restrictions.

With its --include option, mysqlbackup can make a backup that includes some InnoDB tables but not others:

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

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

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

Those InnoDB tables created with innodb_file_per_table turned off are stored as usual in the InnoDB system tablespace, and cannot be left out of the backup.

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

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

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

IMPORTANT: Because the InnoDB system tablespace holds metadata about InnoDB tables from all databases in an instance, restoring a partial backup on a server that includes other databases could cause the system to lose track of those InnoDB tables in other databases. Always restore partial backups on a fresh MySQL server instance without any other InnoDB tables that you want to preserve.

The --only-innodb and --only-innodb-with-frm options back up InnoDB tables only, skipping those of other storage engines. You might also use them together with the --include option to make selective backup of InnoDB tables while excluding all other files created by other storage engines.

Example 4.23 Making an Uncompressed Partial Backup of InnoDB Tables

In this example, we have configured MySQL so that some InnoDB tables have their own tablespaces. We make a partial backup including only those InnoDB tables in test database whose name starts with ib. The contents of the database directory for test database are shown below. The directory contains a MySQL description file (.frm file) for each of the tables (alex1, alex2, alex3, blobt3, ibstest0, ibstest09, ibtest11a, ibtest11b, ibtest11c, and ibtest11d) in the database. Of these 10 tables six (alex1, alex2, alex3, blobt3, ibstest0, ibstest09) are stored in per-table data files (.ibd files).

$ 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

We run the mysqlbackup with the --include option:

# Back up some InnoDB tables but not any .frm files.
$ mysqlbackup --defaults-file=/home/dbadmin/my.cnf --include="^test\.ib.*" --only-innodb backup

# Contents in the backup directory's subdirectory for the test database:
$ ls /sqldata-backup/test
ibstest0.ibd   ibtest09.ibd

# 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

# Contents in the backup directory's subdirectory for the test database:
$ ls /sqldata-backup/test
ibstest0.frm   ibtest09.frm
ibstest0.ibd   ibtest09.ibd

The backup directory's subdirectory for the test database contains only backups of ibstest0 and ibtest09 tables, because other InnoDB tables do not match the include pattern ^test\.ib.*. The related .frm files are included in the second case. Notice that, however, the tables ibtest11a, ibtest11b, ibtest11c, ibtest11d are in the backup even though they are not visible in the directory shown below, because they are stored in the system tablespace (ibdata1 file) which is always included in the backup.


Example 4.24 Making a Compressed Partial Backup

We have configured MySQL so that every InnoDB table has its own tablespace. We make a partial backup including only those InnoDB tables whose name starts with alex or blob. The contents of the database directory for test database is shown below.

$ 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

We run mysqlbackup with the --compress and --include options:

$ mysqlbackup --defaults-file=/home/dbadmin/my.cnf --compress \
  --include=".*\.(alex|blob).*" --only-innodb backup

The backup directory for the database test is shown below. The .ibz files are compressed per-table data files.

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

The --databases and --databases-list-file options of mysqlbackup let you back up non-InnoDB tables only from selected databases, rather than across the entire MySQL instance. (To filter InnoDB tables, use the --include option instead.) With --databases, you specify a space-separated list of database names, with the entire list enclosed in double quotation marks. With --databases-list-file, you specify the path of a file containing the list of database names, one per line.

Some or all of the database names can be qualified with table names, to only back up selected non-InnoDB tables from those databases.

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