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