#### 17.1.2.8 将副本添加到复制环境

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

笔记

如果要复制以创建新副本的复制源服务器或现有副本具有任何计划事件，请确保在启动新副本之前禁用这些事件。如果事件在源上已运行的新副本上运行，则重复操作会导致错误。事件调度程序由[`event_scheduler`](server-system-variables.html#sysvar_event_scheduler)系统变量，默认为`在`从 MySQL 8.0 开始，因此在原始服务器上处于活动状态的事件默认在新副本启动时运行。要停止所有事件在新副本上运行，请将[`event_scheduler`](server-system-variables.html#sysvar_event_scheduler)系统变量为`离开`要么`已禁用`在新副本上。或者，您可以使用[`改变事件`](alter-event.html)将单个事件设置为的语句`禁用`要么`禁用从属`以防止它们在新副本上运行。您可以使用[`显示`](show.html)声明或信息模式[`活动`](information-schema-events-table.html)桌子。有关详细信息，请参阅[第 17.5.1.16 节，“调用功能的复制”](replication-features-invoked.html).

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

要复制现有副本而不进行克隆，请执行以下步骤：

1.  停止现有副本并记录副本状态信息，特别是源二进制日志文件和中继日志文件位置。您可以在 Performance Schema 复制表中查看副本状态（请参阅[第 27.12.11 节，“性能模式复制表”](performance-schema-replication-tables.html))，或通过发行[`显示副本状态`](show-replica-status.html)如下：

    ```
    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.  将现有副本的数据目录复制到新副本，包括日志文件和中继日志文件。您可以通过使用创建档案来做到这一点**柏油**要么`WinZip`，或通过使用诸如**cp**要么**rsync**.

    重要的

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

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

    -   复制后删除`自动.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
    ```

    这种情况可能会发生，如果[`中继日志`](replication-options-replica.html#sysvar_relay_log)未指定系统变量，因为中继日志文件包含主机名作为其文件名的一部分。中继日志索引文件也是如此，如果[`中继日志索引`](replication-options-replica.html#sysvar_relay_log_index)不使用系统变量。有关这些变量的更多信息，请参阅[第 17.1.6 节，“复制和二进制日志记录选项和变量”](replication-options.html).

    为避免此问题，请使用相同的值[`中继日志`](replication-options-replica.html#sysvar_relay_log)在现有副本上使用的新副本上。如果未在现有副本上明确设置此选项，请使用`*`现有副本主机名`*-中继箱`.如果这不可行，请将现有副本的中继日志索引文件复制到新副本并设置[`中继日志索引`](replication-options-replica.html#sysvar_relay_log_index)新副本上的系统变量以匹配现有副本上使用的内容。如果未在现有副本上明确设置此选项，请使用`*`现有副本主机名`*-relay-bin.index`.或者，如果您在执行本节中的其余步骤后已经尝试启动新副本并且遇到了类似前面描述的错误，请执行以下步骤：

    1.  如果您还没有这样做，请发出[`停止复制`](stop-replica.html)在新副本上。

        如果您已经再次启动现有副本，请发出[`停止复制`](stop-replica.html)在现有的副本上也是如此。

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

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

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

5.  在新副本上，编辑配置并为新副本提供唯一的服务器 ID（使用[`server_id`](replication-options.html#sysvar_server_id)系统变量）未被源或任何现有副本使用。

6.  启动新的副本服务器，通过指定[`--skip-slave-启动`](replication-options-replica.html#option_mysqld_skip-slave-start)选项，或者从 MySQL 8.0.24 开始，[`skip_slave_start`](replication-options-replica.html#sysvar_skip_slave_start)系统变量。使用性能模式复制表或问题[`显示副本状态`](show-replica-status.html)确认新副本与现有副本相比具有正确的设置。还要显示服务器 ID 和服务器 UUID，并验证这些对于新副本是否正确且唯一。

7.  通过发出一个启动副本线程[`开始复制`](start-replica.html)陈述。新副本现在使用其连接元数据存储库中的信息来启动复制过程。
