16.1.2.6 将副本添加到复制拓扑
您可以将另一个副本添加到现有复制配置中,而无需停止源服务器。为此,您可以通过复制现有副本的数据目录来设置新副本,并为新副本提供不同的服务器 ID(由用户指定)和服务器 UUID(在启动时生成)。
复制现有副本:
- 停止现有副本并记录副本状态信息,尤其是源的二进制日志文件和中继日志文件的位置。您可以在 Performance Schema 复制 table(请参阅第 25.12.11 节,“性能架构复制 table”)中查看副本状态,也可以通过发出显示从站状态来查看副本状态,如下所示:
mysql> STOP SLAVE;
mysql> SHOW SLAVE STATUS\G
- 关闭现有副本:
shell> mysqladmin shutdown
- 将数据目录从现有副本复制到新副本,包括日志文件和中继日志文件。您可以通过使用 tar 或
WinZip
创建归档文件,或使用 cp 或 rsync 之类的工具执行直接复制来实现。
Important
-
复制之前,请验证与现有副本相关的所有文件是否实际存储在数据目录中。例如,
InnoDB
系统 table 空间,撤消 table 空间和重做日志可能存储在备用位置。InnoDB
table 空间文件和每 table 文件 table 空间可能已在其他目录中创建。副本的二进制日志和中继日志可能位于数据目录之外的其自己的目录中。检查为现有副本设置的系统变量,并查找已指定的任何替代路径。如果找到任何目录,也请复制这些目录。 -
复制期间,如果文件已用于复制元数据存储库(请参见第 16.2.4 节“中继日志和复制应用程序元数据存储库”)(这是 MySQL 5.7 中的默认设置),请确保还将这些文件也从现有副本复制到新副本。如果将 table 用于存储库,则这些 table 位于数据目录中。
-
复制后,从新副本上的数据目录的副本中删除
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 slave 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系统变量,则中继日志索引文件也是如此。有关这些变量的更多信息,请参见第 16.1.6 节“复制和二进制日志记录选项和变量”。
为避免此问题,请对新副本上的relay_log使用与现有副本相同的值。如果未在现有副本上显式设置此选项,请使用existing_replica_hostname-relay-bin
。如果不可能,请将现有副本的中继日志索引文件复制到新副本,并在新副本上设置relay_log_index系统变量以匹配现有副本上使用的变量。如果未在现有副本上显式设置此选项,请使用existing_replica_hostname-relay-bin.index
。或者,如果您已经按照本节中的其余步骤尝试了启动新副本,并且遇到了如前所述的错误,请执行以下步骤:
- 如果尚未这样做,请在新副本上发出STOP SLAVE。
如果您已经重新启动了现有副本,请在现有副本上发出STOP SLAVE。
-
将现有副本的中继日志索引文件的内容复制到新副本的中继日志索引文件中,确保覆盖文件中已存在的所有内容。
-
continue 执行本节中的其余步骤。
-
复制完成后,重新启动现有副本。
-
在新副本上,编辑配置并为新副本提供一个源服务器或任何现有副本未使用的唯一服务器 ID(使用server_id系统变量)。
-
启动新的副本服务器,指定--skip-slave-start选项,以便复制尚未开始。使用性能架构复制 table 或发出显示从站状态来确认新副本与现有副本相比具有正确的设置。还显示服务器 ID 和服务器 UUID,并验证它们对于新副本正确且唯一。
-
通过发出START SLAVE语句来启动复制线程:
mysql> START SLAVE;
现在,新副本使用其源元数据存储库中的信息来启动复制过程。