你可以添加其他的副本到一个已存在的复制配置中,而不用停止源服务器。为了做到这个,你可以通过已存在副本的数据目录和给新的副本一个不同的服务器ID(用户指定),和服务器UUID(启动时生成)来设置新的副本。
为了复制一个已存在的副本:
-
停止已存在的副本并且记录副本状态信息,尤其时源的binary log文件和relay log文件位置。您可以在Performance Schema复制表(请参见第26.12.11节“ Performance Schema Replication Tables”)中查看副本状态,也可以通过发出SHOW SLAVE STATUS来查看副本状态,如下所示:
-
停止已存在的副本:
-
把数据目录从已存在的副本拷贝到新的副本,包括日志文件和relay log文件。您可以通过使用tar或WinZip创建归档文件,或使用诸如cp或rsync之类的工具执行直接复制来执行此操作。
重要:
在复制前,验证所有与已存在副本相关的文件确实存储在数据目录下。例如,InnoDB系统表空间,undo表空间,和redo日志可能会存储在可选的其他位置。InnoDB表空间文件和file-per-table表空间可能已经被创建在其他目录。副本的二进制日志和中继日志可能位于数据目录之外的其自己的目录中。检查为现有副本设置的系统变量,并查找已指定的任何替代路径。 如果找到任何目录,也请复制这些目录。
复制期间,如果文件已用于复制元数据存储库(请参见第17.2.4节“中继日志和复制元数据存储库”),请确保还将这些文件也从现有副本复制到新副本。 如果将表用于存储库(这是MySQL 8.0的默认设置),则表位于data目录中。
复制后,从新副本上的数据目录副本中删除auto.cnf文件,以便使用其他生成的服务器UUID启动新副本。 服务器UUID必须是唯一的。
添加新副本时遇到的一个常见问题是,新副本会失败,并显示一系列警告和错误消息,如下所示:
为避免这个问题,请在新副本上使用与原来副本上的relay_log相同的值。如果这个选项在原来副本没有显式设置,请使用existing_replica_hostname-relay-bin。如果这不可能,则将现有副本的中继日志索引文件复制到新副本,并在新副本上设置relay_log_index系统变量以匹配现有副本上使用的系统变量。如果未在现有副本上显式设置此选项,请使用existing_replica_hostname-relay-bin.index。 或者,如果您已经按照本节中的其余步骤尝试了启动新副本,并且遇到了如前所述的错误,请执行以下步骤:
a. 如果尚未执行此操作,请在新副本上发出STOP SLAVE。
如果您已经重新启动了现有副本,则也对现有副本发出STOP SLAVE。
b. 将现有副本的中继日志索引文件的内容复制到新副本的中继日志索引文件中,确保覆盖文件中已存在的所有内容。
c. 继续执行本节中的其余步骤。
4. 当复制完成,重启原来的副本。
5. 在新副本上,编辑配置,并为新副本提供一个源服务器或任何现有副本未使用的唯一服务器ID(使用server_id系统变量)。
6. 启动新的副本服务器,并指定–skip-slave-start选项,以使复制尚未开始。 使用Performance Schema replication表或发出SHOW SLAVE STATUS来确认新副本与现有副本相比具有正确的设置。 还显示服务器ID和服务器UUID,并验证它们对于新副本正确且唯一。
7. 通过发出START SLAVE语句来启动复制线程:
现在,新副本使用其连接元数据存储库中的信息来启动复制过程。