您可以在不停止源服务器的情况下将另一个副本添加到现有的复制配置中。为此,您可以通过复制现有副本的数据目录来设置新副本,并为新副本分配不同的服务器 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 进行直接复制。Important-
在复制之前,请验证现有副本的所有文件实际上都存储在数据目录中。例如,
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
系统变量),该 ID 未被源或任何现有副本使用。 -
启动新副本服务器,确保复制尚未启动,通过指定
--skip-replica-start
。使用性能架构复制表或发出SHOW REPLICA STATUS
来确认新副本的设置是否正确,并与现有副本进行比较。还要显示服务器 ID 和服务器 UUID,并验证它们是否正确且唯一。 -
通过发出
START REPLICA
语句来启动副本线程。新副本现在使用其连接元数据存储库中的信息来启动复制过程。