Documentation Home

17.1.3.4 使用 GTID 设置复制

本节描述了在 MySQL 8.0 中配置和启动基于 GTID 的复制的过程。这是一个 冷启动过程,假设您是第一次启动源服务器,或者可以停止它;有关使用正在运行的源服务器的 GTID 供应副本的信息,请参阅 第 17.1.3.5 节,“使用 GTID 进行故障转移和横向扩展”。有关在线更改服务器上的 GTID 模式的信息,请参阅 第 17.1.4 节,“更改在线服务器上的 GTID 模式”

对于最简单的 GTID 复制拓扑(由一个源和一个副本组成),此启动过程中的关键步骤如下:

  1. 如果复制已经在运行,通过将它们设置为只读来同步两个服务器。

  2. 停止两个服务器。

  3. 在启用 GTID 并配置正确选项的情况下重新启动两台服务器。

    启动服务器所需的mysqld选项将在本节后面的示例中讨论。

  4. 指示副本使用源作为复制数据源并使用自动定位。完成此步骤所需的 SQL 语句在本节后面的示例中进行了描述。

  5. 进行新的备份。包含没有 GTID 的事务的二进制日志不能在启用 GTID 的服务器上使用,因此在此之前进行的备份不能用于您的新配置。

  6. 启动副本,然后在两台服务器上禁用只读模式,以便它们可以接受更新。

在下面的示例中,两台服务器已经作为源服务器和副本服务器运行,使用 MySQL 的二进制日志基于位置的复制协议。如果您从新服务器开始,请参阅 第 17.1.2.3 节“为复制创建用户”以获取有关为复制连接添加特定用户的信息,以及 第 17.1.2.1 节“设置复制源配置”以获取有关设置 server_id变量的信息. 以下示例显示如何将mysqld启动选项存储在服务器的选项文件中,有关更多信息,请参见 第 4.2.2.2 节,“使用选项文件”或者,您可以在运行mysqld时使用启动选项 .

接下来的大部分步骤都需要使用 MySQL 帐户或其他具有权限 root的 MySQL 用户帐户。mysqladmin需要特权或 特权。 SUPER shutdownSUPERSHUTDOWN

第 1 步:同步服务器。  只有在使用已经在不使用 GTID 的情况下进行复制的服务器时才需要执行此步骤。对于新服务器,请继续执行步骤 3。通过发出以下命令,在每个服务器上将 read_only系统变量 设置为只读 :ON

mysql> SET @@GLOBAL.read_only = ON;

等待所有正在进行的事务提交或回滚。然后,让副本赶上源。在继续之前确保副本已处理所有更新非常重要

如果您将二进制日志用于除复制之外的任何其他用途,例如进行时间点备份和恢复,请等到您不需要包含没有 GTID 的事务的旧二进制日志。理想情况下,等待服务器清除所有二进制日志,并等待任何现有备份过期。

重要的

重要的是要了解包含没有 GTID 的事务的日志不能在启用 GTID 的服务器上使用。在继续之前,您必须确保拓扑中的任何地方都不存在没有 GTID 的事务。

第 2 步:停止两个服务器。 使用mysqladmin 停止每个服务器,如下所示,其中username是具有足够权限关闭服务器的 MySQL 用户的用户名:

$> mysqladmin -uusername -p shutdown

然后在出现提示时提供该用户的密码。

第 3 步:在启用 GTID 的情况下启动两台服务器。 gtid_mode要启用基于 GTID 的复制,必须通过将变量 设置为启用 GTID 模式来启动每个服务器 ON,并 enforce_gtid_consistency 启用该变量以确保仅记录对基于 GTID 的复制安全的语句。例如:

gtid_mode=ON
enforce-gtid-consistency=ON

--skip-slave-start使用系统变量选项或从 MySQL 8.0.24 开始每个副本 skip_slave_start,以确保在配置副本设置之前不会启动复制。从 MySQL 8.0.26 开始,使用 --skip-replica-startskip_replica_start代替。有关 GTID 相关选项和变量的更多信息,请参阅 第 17.1.6.5 节,“全局事务 ID 系统变量”

在使用mysql.gtid_executed Table 时,不必为了使用 GTID 而启用二进制日志记录 。源服务器必须始终启用二进制日志记录才能进行复制。但是,副本服务器可以使用 GTID 但不使用二进制日志记录。如果您需要在副本服务器上禁用二进制日志记录,您可以通过为副本指定 --skip-log-bin--log-replica-updates=OFF--log-slave-updates=OFF选项来实现。

第 4 步:配置副本以使用基于 GTID 的自动定位。  告诉副本使用基于 GTID 事务的源作为复制数据源,并使用基于 GTID 的自动定位而不是基于文件的定位。在副本上发出 CHANGE REPLICATION SOURCE TO 语句(来自 MySQL 8.0.23)或CHANGE MASTER TO语句(MySQL 8.0.23 之前),包括SOURCE_AUTO_POSITION| MASTER_AUTO_POSITION语句中的选项告诉副本源的事务由 GTID 标识。

您可能还需要为源的主机名和端口号提供适当的值,以及复制用户帐户的用户名和密码,副本可以使用这些值连接到源;如果这些已经在步骤 1 之前设置并且不需要进行进一步的更改,则可以安全地从此处显示的语句中省略相应的选项。

mysql> CHANGE MASTER TO
     >     MASTER_HOST = host,
     >     MASTER_PORT = port,
     >     MASTER_USER = user,
     >     MASTER_PASSWORD = password,
     >     MASTER_AUTO_POSITION = 1;

Or from MySQL 8.0.23:

mysql> CHANGE REPLICATION SOURCE TO
     >     SOURCE_HOST = host,
     >     SOURCE_PORT = port,
     >     SOURCE_USER = user,
     >     SOURCE_PASSWORD = password,
     >     SOURCE_AUTO_POSITION = 1;

第 5 步:进行新备份。  既然您已经启用了 GTID,那么在您启用 GTID 之前所做的现有备份就不能再在这些服务器上使用。此时进行新的备份,这样您就不会没有可用的备份。

例如,您可以FLUSH LOGS在进行备份的服务器上执行。然后明确地进行备份或等待您可能已设置的任何定期备份例程的下一次迭代。

第 6 步:启动副本并禁用只读模式。  像这样启动副本:

mysql> START SLAVE;
Or from MySQL 8.0.22:
mysql> START REPLICA;

仅当您在步骤 1 中将服务器配置为只读时,才需要执行以下步骤。要允许服务器再次开始接受更新,请发出以下语句:

mysql> SET @@GLOBAL.read_only = OFF;

基于 GTID 的复制现在应该正在运行,您可以像以前一样在源上开始(或恢复)活动。 第 17.1.3.5 节,“使用 GTID 进行故障转移和横向扩展”,讨论了在使用 GTID 时创建新的副本。