19.1.2.8 添加副本到复制环境
您可以在不停止源服务器的情况下添加另一个副本到现有的复制配置中。要实现这一点,您可以将数据目录从现有副本复制到新副本,并为新副本指定不同的服务器ID(用户指定)和服务器UUID(在启动时生成)。
如果复制源服务器或您要复制的现有副本有任何计划事件,确保在启动新副本前禁用这些事件。如果在新副本上运行的事件已经在源服务器上运行过,那么重复的操作将导致错误。事件调度器由event_scheduler
系统变量控制,该变量默认为ON
,因此在新副本启动时,默认情况下将运行原服务器上的活动事件。要在新副本上停止所有事件,您可以将event_scheduler
系统变量设置为OFF
或DISABLED
,或者使用ALTER EVENT
语句将单个事件设置为DISABLE
或DISABLE ON REPLICA
以防止在新副本上运行事件。您可以使用SHOW
语句或信息_schemaEVENTS
表来列出服务器上的事件。更多信息,请见第19.5.1.16节,“复制激活的特性”。
作为创建新副本的替代方法,MySQL Server的克隆插件可以将现有副本的所有数据和复制设置转移到克隆中。有关使用该方法的说明,请见第7.6.7.7节,“克隆复制”。
要将现有副本复制到新副本中,请按照以下步骤进行:
-
停止现有副本并记录副本状态信息,特别是源二进制日志文件和中继日志文件的位置。您可以在性能_schema复制表中查看副本状态(见第29.12.11节,“性能_schema复制表”),或者使用
SHOW REPLICA STATUS
语句:mysql> STOP REPLICA; mysql> SHOW REPLICA STATUS\G
-
关闭现有副本:
$> mysqladmin shutdown
-
将数据目录从现有副本复制到新副本中,包括日志文件和中继日志文件。您可以使用tar或
WinZip
创建归档,或者使用工具如cp或rsync进行直接复制。Important-
在复制之前,验证现有副本相关文件是否存储在数据目录中。例如,
InnoDB
系统表空间、回滚表空间和重做日志可能存储在alternative位置。InnoDB
表空间文件和按文件表空间可能创建在其他目录中。副本的二进制日志和中继日志可能存储在自己的目录外数据目录中。检查系统变量,查找任何指定的alternative路径。如果找到,请将这些目录复制到新副本中。 -
在复制过程中,如果文件已经用于复制元数据存储库(见第19.2.4节,“Relay Log and Replication Metadata Repositories”),确保也将这些文件从现有副本复制到新副本中。如果表已经用于存储库(默认情况下,表在数据目录中。
-
在复制完成后,删除新副本的数据目录中的
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日志文件包含主机名作为文件名的一部分。这也适用于relay日志索引文件,如果没有使用relay_log_index
系统变量。有关这些变量的更多信息,请见第19.1.6节,“Replication and Binary Logging Options and Variables”。为了避免这个问题,在新副本中使用与现有副本相同的
relay_log
值。如果这个选项在现有副本中没有被设置明确,请使用
。如果这不可行,请将现有副本的relay日志索引文件复制到新副本中,并在新副本中设置existing_replica_hostname
-relay-binrelay_log_index
系统变量,以匹配现有副本的设置。如果这个选项在现有副本中没有被设置明确,请使用
。或者,如果您已经尝试启动新副本,并且遇到之前描述的错误,请执行以下步骤:existing_replica_hostname
-relay-bin.index-
如果您还没有这样做,请在新副本上执行
STOP REPLICA
。如果您已经重新启动了现有副本,请在现有副本上执行
STOP REPLICA
。 -
将现有副本的relay log索引文件的内容复制到新副本的relay log索引文件中,并确保覆盖文件中的任何内容。
-
继续执行本节中的剩余步骤。
-
-
复制完成后,重启现有副本。
-
在新副本上编辑配置,并为新副本分配一个唯一的服务器ID(使用
server_id
系统变量),该ID不用于源或任何现有副本。 -
启动新副本服务器,确保在指定
--skip-replica-start
时不启动复制。使用性能chema复制表或执行SHOW REPLICA STATUS
以确认新副本的设置与现有副本相比是否正确。同时,显示服务器ID和服务器UUID,并验证这些值是否正确且唯一于新副本。 -
使用
START REPLICA
语句启动副本线程。新副本现在使用其连接元数据存储库中的信息来启动复制过程。