Documentation Home

17.1.2.8 将副本添加到复制环境

您可以在不停止源服务器的情况下将另一个副本添加到现有的复制配置中。为此,您可以通过复制现有副本的数据目录并为新副本提供不同的服务器 ID(用户指定)和服务器 UUID(在启动时生成)来设置新副本。

笔记

如果要复制以创建新副本的复制源服务器或现有副本有任何计划事件,请确保在启动新副本之前禁用这些事件。如果事件在已在源上运行的新副本上运行,则重复操作会导致错误。Event Scheduler 由 event_scheduler系统变量控制,默认为ONMySQL 8.0,因此在新副本启动时默认运行原始服务器上活动的事件。要停止所有事件在新副本上运行,请将 event_scheduler系统变量设置为OFFDISABLED在新副本上。或者,您可以使用该ALTER EVENT 语句将单个事件设置为 DISABLEDISABLE ON SLAVE阻止它们在新副本上运行。您可以使用 SHOW语句或信息架构EVENTS表列出服务器上的事件。有关详细信息,请参阅 第 17.5.1.16 节,“调用功能的复制”

作为以这种方式创建新副本的替代方法,MySQL Server 的克隆插件可用于将所有数据和复制设置从现有副本传输到克隆。有关使用此方法的说明,请参阅 第 5.6.7.7 节,“为复制而克隆”

要在不克隆的情况下复制现有副本,请执行以下步骤:

  1. 停止现有副本并记录副本状态信息,特别是源二进制日志文件和中继日志文件位置。您可以在性能模式复制表中查看副本状态(请参阅 第 27.12.11 节,“性能模式复制表”),或通过发出 SHOW REPLICA STATUS以下命令:

    mysql> STOP SLAVE;
    mysql> SHOW SLAVE STATUS\G
    Or from MySQL 8.0.22:
    mysql> STOP REPLICA;
    mysql> SHOW REPLICA STATUS\G
  2. 关闭现有副本:

    $> mysqladmin shutdown
  3. 将数据目录从现有副本复制到新副本,包括日志文件和中继日志文件。您可以通过使用tar或创建存档 ,或者使用cprsyncWinZip等工具执行直接复制来执行此操作 。

    重要的
    • 在复制之前,验证与现有副本相关的所有文件实际上都存储在数据目录中。例如,InnoDB 系统表空间、撤消表空间和重做日志可能存储在替代位置。 InnoDB表空间文件和 file-per-table 表空间可能已在其他目录中创建。副本的二进制日志和中继日志可能位于数据目录之外的它们自己的目录中。检查为现有副本设置的系统变量,并查找已指定的任何替代路径。如果找到,请将这些目录也复制过来。

    • 在复制期间,如果文件已用于复制元数据存储库(请参阅 第 17.2.4 节,“中继日志和复制元数据存储库”),请确保您也将这些文件从现有副本复制到新副本。如果表已用于存储库,这是 MySQL 8.0 的默认设置,则表位于数据目录中。

    • 复制后,从新副本上数据目录的副本中删除该 auto.cnf文件,以便新副本以不同的生成服务器 UUID 启动。服务器 UUID 必须是唯一的。

    添加新副本时遇到的一个常见问题是新副本失败并出现一系列警告和错误消息,如下所示:

    071118 16:44:10 [Warning] Neither --relay-log nor --relay-log-index were used; so
    replication may break when this MySQL server acts as a replica and has his hostname
    changed!! Please use '--relay-log=new_replica_hostname-relay-bin' to avoid this problem.
    071118 16:44:10 [ERROR] Failed to open the relay log './old_replica_hostname-relay-bin.003525'
    (relay_log_pos 22940879)
    071118 16:44:10 [ERROR] Could not find target log during relay log initialization
    071118 16:44:10 [ERROR] Failed to initialize the master info structure

    如果未指定系统变量,则会发生这种情况 relay_log,因为中继日志文件包含主机名作为其文件名的一部分。如果 relay_log_index不使用系统变量,中继日志索引文件也是如此。有关这些变量的更多信息,请参阅第 17.1.6 节,“复制和二进制日志记录选项和变量”

    relay_log为避免此问题,请在新副本上使用与在现有副本上 使用的相同的值 。如果未在现有副本上显式设置此选项,请使用 existing_replica_hostname-relay-bin. 如果这不可能,将现有副本的中继日志索引文件复制到新副本,并在新副本上设置 relay_log_index系统变量以匹配现有副本上使用的内容。如果未在现有副本上明确设置此选项,请使用 existing_replica_hostname-relay-bin.index. 或者,如果您在执行本节中的其余步骤后已尝试启动新副本并遇到如前所述的错误,请执行以下步骤:

    1. 如果您还没有这样做, STOP REPLICA请在新副本上发布。

      如果您已经再次启动现有副本,请STOP REPLICA同时在现有副本上发布。

    2. 将现有副本的中继日志索引文件的内容复制到新副本的中继日志索引文件中,确保覆盖文件中已有的任何内容。

    3. 继续执行本节中的其余步骤。

  4. 复制完成后,重新启动现有副本。

  5. 在新副本上,编辑配置并为新副本提供 server_id源或任何现有副本未使用的唯一服务器 ID(使用系统变量)。

  6. --skip-slave-start启动新的副本服务器,通过指定选项或从 MySQL 8.0.24 开始, skip_slave_start系统变量 确保复制尚未开始 。使用 Performance Schema 复制表或问题 SHOW REPLICA STATUS来确认新副本与现有副本相比具有正确的设置。还显示服务器 ID 和服务器 UUID 并验证它们对于新副本是否正确且唯一。

  7. 通过发出 START REPLICA语句启动副本线程。新副本现在使用其连接元数据存储库中的信息来启动复制过程。