16.1.2.4 选择数据快照的方法

如果源上的数据库包含现有数据,则必须将此数据复制到每个副本。有多种方法可以从源转储数据。以下各节介绍了可能的选项。

要选择转储数据库的适当方法,请在以下选项之间进行选择:

  • 使用mysqldump工具创建要复制的所有数据库的转储。这是推荐的方法,尤其是在使用InnoDB时。

  • 如果您的数据库存储在二进制可移植文件中,则可以将原始数据文件复制到副本中。这比使用mysqldump并在每个副本上导入文件更为有效,因为在重放INSERT语句时,它跳过了更新索引的开销。对于InnoDB之类的存储引擎,不建议这样做。

16.1.2.4.1 使用 mysqldump 创建数据快照

要创建现有源中数据的快照,请使用mysqldump工具。数据转储完成后,请在开始复制过程之前将此数据导入副本。

下面的示例将所有数据库转储到名为dbdump.db的文件中,并包括--master-data选项,该选项会自动在副本上附加更改为主语句以启动复制过程:

shell> mysqldump --all-databases --master-data > dbdump.db

Note

如果不使用--master-data,则必须手动将所有 table 锁定在单独的会话中。参见第 16.1.2.3 节,“获取复制源的二进制日志坐标”

可以使用mysqldump工具从转储中排除某些数据库。如果要选择要包含在转储中的数据库,请不要使用--all-databases。选择以下选项之一:

有关更多信息,请参见第 4.5.4 节“ mysqldump-数据库备份程序”

要导入数据,请将转储文件复制到副本,或者在远程连接到副本时从源访问文件。

16.1.2.4.2 使用原始数据文件创建数据快照

本节介绍如何使用构成数据库的原始文件创建数据快照。使用具有复杂缓存或日志记录算法的存储引擎在 table 中使用此方法需要额外的步骤来生成完美的“时间点”快照:即使您已经获取了一个快照,初始的复制命令也可能会忽略缓存信息和日志记录更新。全局读取锁定。存储引擎对此的响应方式取决于其崩溃恢复能力。

如果使用InnoDBtable,则可以使用 MySQL Enterprise Backup 组件中的 mysqlbackup 命令生成一致的快照。此命令记录与要在副本上使用的快照相对应的日志名称和偏移量。 MySQL Enterprise Backup 是商业产品,包含在 MySQL Enterprise 订阅中。有关详细信息,请参见第 29.2 节“ MySQL 企业备份概述”

如果源和副本的ft_stopword_fileft_min_word_lenft_max_word_len值不同,并且您正在复制具有全文索引的 table,则此方法也不可靠。

假设上述 exception 不适用于您的数据库,请使用cold backup技术来获取InnoDBtable 的可靠二进制快照:对 MySQL Server 进行slow shutdown,然后手动复制数据文件。

要在单个文件系统上存在 MySQL 数据文件时为MyISAMtable 创建原始数据快照,可以使用标准文件复制工具(例如 cpcopy ),远程复制工具(例如 ) scprsync ,归档工具(例如 ziptar )或文件系统快照工具(例如 dump )。如果仅复制某些数据库,则仅复制与那些 table 相关的那些文件。对于InnoDB,除非启用了innodb_file_per_table选项,否则所有数据库中的所有 table 都存储在system tablespace文件中。

复制不需要以下文件:

根据您是否正在使用InnoDBtable,选择以下一项:

如果您使用的是InnoDBtable,并且还希望通过原始数据快照获得最一致的结果,请在此过程中关闭源服务器,如下所示:

shell> mysqladmin shutdown
  • 制作 MySQL 数据文件的副本。以下示例显示了执行此操作的常用方法。您只需要选择其中之一:
shell> tar cf /tmp/db.tar ./data
shell> zip -r /tmp/db.zip ./data
shell> rsync --recursive ./data /tmp/dbdata
  • 重新启动源服务器。

如果不使用InnoDBtable,则可以从源获取系统快照,而无需按照以下步骤中所述关闭服务器:

shell> tar cf /tmp/db.tar ./data
shell> zip -r /tmp/db.zip ./data
shell> rsync --recursive ./data /tmp/dbdata
  • 在获取读锁的 Client 端中,释放锁:
mysql> UNLOCK TABLES;

创建数据库的存档或副本后,请在开始复制过程之前将文件复制到每个副本。