您可以在不停止源服务器的情况下,将另一个副本添加到现有的复制配置中。为此,您可以通过复制现有副本的数据目录来设置新副本,并为新副本指定不同的服务器 ID(用户指定)和服务器 UUID(在启动时生成)。
如果您要复制以创建新副本的复制源服务器或现有副本有任何计划事件,请确保在启动新副本之前禁用这些事件。如果在新副本上运行已在源上运行的事件,则重复操作会导致错误。事件调度程序由 event_scheduler
系统变量控制,该变量默认为 ON
,因此在新副本启动时,默认情况下会运行原始服务器上处于活动状态的事件。要停止在新副本上运行所有事件,请在新副本上将 event_scheduler
系统变量设置为 OFF
或 DISABLED
。或者,您可以使用 ALTER EVENT
语句将单个事件设置为 DISABLE
或 DISABLE ON REPLICA
,以防止它们在新副本上运行。您可以使用 SHOW
语句或信息模式 EVENTS
表列出服务器上的事件。有关更多信息,请参阅 第 19.5.1.16 节,“已调用功能的复制”。
作为以这种方式创建新副本的替代方法,可以使用 MySQL 服务器的克隆插件将所有数据和复制设置从现有副本传输到克隆。有关使用此方法的说明,请参阅 第 7.6.7.7 节,“用于复制的克隆”。
要复制现有副本而不进行克隆,请按照以下步骤操作
停止现有副本并记录副本状态信息,尤其是源二进制日志文件和中继日志文件位置。您可以在性能模式复制表中查看副本状态(请参阅 第 29.12.11 节,“性能模式复制表”),也可以通过发出
SHOW REPLICA STATUS
来查看,如下所示mysql> STOP REPLICA; mysql> SHOW REPLICA STATUS\G
关闭现有副本
$> mysqladmin shutdown
将数据目录从现有副本复制到新副本,包括日志文件和中继日志文件。您可以通过使用 tar 或
WinZip
创建存档,或者使用 cp 或 rsync 等工具执行直接复制来完成此操作。重要在复制之前,请验证与现有副本相关的所有文件是否实际存储在数据目录中。例如,
InnoDB
系统表空间、撤消表空间和重做日志可能存储在备用位置。InnoDB
表空间文件和每表文件表空间可能已在其他目录中创建。副本的二进制日志和中继日志可能位于数据目录之外的其自身目录中。检查为现有副本设置的系统变量,并查找已指定的任何备用路径。如果找到任何路径,请同时复制这些目录。在复制过程中,如果文件已用于复制元数据存储库(请参阅第 19.2.4 节“中继日志和复制元数据存储库”),请确保还将这些文件从现有副本复制到新副本。如果已将表用于存储库(默认情况下,表位于数据目录中)。
复制完成后,从新副本上的数据目录副本中删除
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
系统变量,则中继日志索引文件也是如此。有关这些变量的更多信息,请参阅第 19.1.6 节“复制和二进制日志记录选项和变量”。为避免此问题,请在新副本上对
relay_log
使用与现有副本上使用的值相同的值。如果未在现有副本上显式设置此选项,请使用
。如果无法做到这一点,请将现有副本的中继日志索引文件复制到新副本,并在新副本上设置existing_replica_hostname
-relay-binrelay_log_index
系统变量,使其与现有副本上使用的值相匹配。如果未在现有副本上显式设置此选项,请使用
。或者,如果您在按照本节中的其余步骤操作后尝试启动新副本时遇到类似于前面所述的错误,请执行以下步骤existing_replica_hostname
-relay-bin.index如果尚未执行此操作,请在新副本上发出
STOP REPLICA
。如果已再次启动现有副本,请在现有副本上发出
STOP REPLICA
。将现有副本的中继日志索引文件的内容复制到新副本的中继日志索引文件中,确保覆盖文件中已有的任何内容。
继续执行本节中的其余步骤。
复制完成后,重新启动现有副本。
在新副本上,编辑配置并为新副本指定一个源或任何现有副本均未使用的唯一服务器 ID(使用
server_id
系统变量)。启动新的副本服务器,通过指定
--skip-replica-start
确保复制尚未启动。使用 Performance Schema 复制表或发出SHOW REPLICA STATUS
以确认新副本与现有副本相比是否具有正确的设置。还要显示服务器 ID 和服务器 UUID,并验证这些 ID 和 UUID 对于新副本是否正确且唯一。通过发出
START REPLICA
语句来启动副本线程。新副本现在使用其连接元数据存储库中的信息来启动复制过程。