为了方便创建部分备份,MySQL Enterprise Backup 从 3.10 版本开始引入了两个新的部分备份选项:--include-tables
和
--exclude-tables
. 新选项旨在替换
、
、 和
的旧选项--include
,
这些选项与新选项不兼容,将在即将发布的版本中弃用。在下面的讨论中,我们假设新选项用于部分备份。出于参考目的,我们在使用旧选项进行部分备份中的本节末尾包含了有关旧选项的信息
。
--databases
--databases-list-file
--only-innodb-with-frm
默认情况下,数据目录中数据库子目录下的所有文件都包含在备份中,因此备份包括来自所有 MySQL 存储引擎、任何第三方存储引擎的数据,甚至包括该目录中的任何非数据库文件。本节介绍可用于有选择地备份或排除数据的选项。
有多种方法可以使用 MySQL Enterprise Backup 创建不同类型的部分备份:
按名称包括或排除特定表。这使用
--include-tables
or--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
备份除 “ mysql ”和“ performance_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
您还可以使用适当的命令选项进行 压缩、 单映像和其他类型的选择性备份。
下一步:
使用旧版选项进行部分备份
本小节中的信息仅适用于使用、
、 和
的遗留选项--include
,
这些选项将在下一期中弃用。对于创建部分备份,强烈建议
改用和
的新选项。请注意,您不能在单个命令中组合旧的和新的部分备份选项。
--databases
--databases-list-file
--only-innodb-with-frm
--include-tables
--exclude-tables
MySQL Enterprise Backup 可以使用传统的部分备份选项进行不同类型的部分备份:
包括某些 InnoDB 表但不包括其他表。此操作涉及
--include
、--only-innodb
和--only-innodb-with-frm
选项。包括来自选定数据库但不包括其他数据库的某些非 InnoDB 表。此操作涉及
--databases
和--databases-list-file
选项。
有关所有这些选项的语法详细信息,请参阅 旧版部分备份选项。
通常,部分备份比完整备份更难恢复,因为备份数据可能不包括构成完整 MySQL 实例所必需的相互关联的部分。特别是,InnoDB 表具有内部 ID 和其他数据值,它们只能恢复到同一实例,而不能恢复到不同的 MySQL 服务器。始终全面测试任何部分备份的恢复过程,以了解相关过程和限制。
通过它的--include
选项,
mysqlbackup可以进行备份,其中包括一些 InnoDB 表,但不包括其他表:
带有
--include
选项的部分备份总是包含 InnoDB 系统表空间和其中的所有表。对于存储在系统表空间之外的 InnoDB 表,部分备份仅包括那些名称与
--include
选项指定的正则表达式匹配的表。
此操作需要将被遗漏的表存储在单独的
文件中。要将 InnoDB 表放在系统表空间之外,请在
table_name
.ibdinnodb_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
表(、、、、、、、、和alex1
)
alex2
的alex3
MySQL
描述
文件(文件)
。在这 10 个表中,有六个 ( ,
, ,
, ,
blobt3
ibstest0
ibstest09
ibtest11a,
ibtest11b
ibtest11c
ibtest11d
alex1
alex2
alex3
blobt3
ibstest0
ibstest09
) 存储在每个表的数据文件 ( .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
我们使用以下
选项运行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!
备份目录仅包含
表ibstest
和ibtest09
表的备份。其他 InnoDB 表不匹配包含模式
^test\.ib.*
。但是请注意,表ibtest11a
、
ibtest11b
、位于备份中ibtest11c
,
ibtest11d
即使它们在下面显示的目录中不可见,因为它们存储在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 表。
如果指定此选项,请确保为每个备份(尤其是增量备份)包含相同的数据库集,这样您就不会还原任何数据库的过时版本。