Documentation Home

17.1.2.5 选择数据快照的方法

如果源数据库包含现有数据,则有必要将此数据复制到每个副本。有多种方法可以从源数据库中转储数据。以下部分描述了可能的选项。

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

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

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

  • 使用 MySQL Server 的克隆插件将所有数据从现有副本传输到克隆。有关使用此方法的说明,请参阅第 5.6.7.7 节,“为复制而克隆”

小费

要部署多个 MySQL 实例,您可以使用InnoDB Cluster ,它使您可以轻松地在MySQL Shell中管理一组 MySQL 服务器实例。InnoDB Cluster 将 MySQL Group Replication 包装在一个编程环境中,使您能够轻松部署 MySQL 实例集群以实现高可用性。此外,InnoDB Cluster 与MySQL Router无缝连接,使您的应用程序无需编写自己的故障转移过程即可连接到集群。但是,对于不需要高可用性的类似用例,您可以使用InnoDB ReplicaSet。可以在此处找到 MySQL Shell 的安装说明。

17.1.2.5.1 使用 mysqldump 创建数据快照

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

以下示例将所有数据库转储到名为 的文件 dbdump.db,并包含 --master-data自动附加CHANGE REPLICATION SOURCE TO|的选项。CHANGE MASTER TO副本上启动复制过程所需的语句:

$> mysqldump --all-databases --master-data > dbdump.db
笔记

如果不使用 --master-data,则需要手动锁定单独会话中的所有表。请参阅第 17.1.2.4 节,“获取复制源二进制日志坐标”

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

  • --ignore-table使用选项 排除数据库中的所有表 。

  • --databases使用该选项 仅命名要转储的那些数据库 。

笔记

默认情况下,如果源 ( gtid_mode=ON) 上正在使用 GTID, mysqldumpgtid_executed会在转储输出中 包含来自源集的 GTID, 以将它们添加到gtid_purged副本集。如果您只转储特定的数据库或表,请务必注意mysqldump包含的值包括源集合中所有事务的 GTID gtid_executed,即使是那些更改了数据库或其他数据库的隐藏部分的 GTID未包含在部分转储中的服务器。检查 mysqldump 的描述--set-gtid-purged选项来查找您正在使用的 MySQL 服务器版本的默认行为的结果,以及如果此结果不适合您的情况如何更改行为。

有关详细信息,请参阅第 4.5.4 节,“mysqldump — 数据库备份程序”

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

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

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

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

ft_stopword_file如果源和副本具有不同的、 ft_min_word_len或 值ft_max_word_len并且您正在复制具有全文索引的表, 则此方法也无法可靠地工作 。

假设上述异常不适用于您的数据库,请使用冷备份 技术获取 InnoDB表的可靠二进制快照: 缓慢关闭MySQL 服务器,然后手动复制数据文件。

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

复制不需要以下文件:

  • mysql数据库相关的文件。

  • 副本的连接元数据存储库文件 master.info,如果使用的话;现在不推荐使用此文件(请参阅 第 17.2.4 节,“中继日志和复制元数据存储库”)。

  • 源的二进制日志文件,如果您要使用二进制日志索引文件来定位副本的源二进制日志坐标,则二进制日志索引文件除外。

  • 任何中继日志文件。

根据您是否使用InnoDB 表格,选择以下选项之一:

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

  1. 获取读锁并获取源的状态。请参阅 第 17.1.2.4 节,“获取复制源二进制日志坐标”

  2. 在单独的会话中,关闭源服务器:

    $> mysqladmin shutdown
  3. 制作 MySQL 数据文件的副本。以下示例显示了执行此操作的常用方法。您只需选择其中一项:

    $> tar cf /tmp/db.tar ./data
    $> zip -r /tmp/db.zip ./data
    $> rsync --recursive ./data /tmp/dbdata
  4. 重新启动源服务器。

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

  1. 获取读锁并获取源的状态。请参阅 第 17.1.2.4 节,“获取复制源二进制日志坐标”

  2. 制作 MySQL 数据文件的副本。以下示例显示了执行此操作的常用方法。您只需选择其中一项:

    $> tar cf /tmp/db.tar ./data
    $> zip -r /tmp/db.zip ./data
    $> rsync --recursive ./data /tmp/dbdata
  3. 在您获取读锁的客户端中,释放锁:

    mysql> UNLOCK TABLES;

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