#### 17.1.3.4 使用 GTID 设置复制

[](<>)

本节描述了在 MySQL 8.0 中配置和启动基于 GTID 的复制的过程。这是一个“冷启动”过程，假设您是第一次启动源服务器，或者可以停止它；有关使用来自正在运行的源服务器的 GTID 配置副本的信息，请参阅[第 17.1.3.5 节，“使用 GTID 进行故障转移和横向扩展”](replication-gtids-failover.html).有关在线更改服务器上的 GTID 模式的信息，请参阅[第 17.1.4 节，“更改在线服务器上的 GTID 模式”](replication-mode-change-online.html).

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

1.  如果复制已在运行，请通过将两台服务器设为只读来同步它们。

2.  停止两台服务器。

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

    这[**mysqld**](mysqld.html)启动服务器所需的选项将在本节后面的示例中讨论。

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

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

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

    在以下示例中，两台服务器已经作为源和副本运行，使用 MySQL 的基于二进制日志位置的复制协议。如果您从新服务器开始，请参阅[第 17.1.2.3 节，“为复制创建用户”](replication-howto-repuser.html)有关为复制连接添加特定用户的信息和[第 17.1.2.1 节，“设置复制源配置”](replication-howto-masterbaseconfig.html)有关设置[`server_id`](replication-options.html#sysvar_server_id)多变的。以下示例显示了如何存储[**mysqld**](mysqld.html)服务器选项文件中的启动选项，请参见[第 4.2.2.2 节，“使用选项文件”](option-files.html)了解更多信息。或者，您可以在运行时使用启动选项[**mysqld**](mysqld.html).

    接下来的大多数步骤都需要使用MySQL`根`帐户或另一个具有[`超级的`](privileges-provided.html#priv_super)特权[**mysqladmin**](mysqladmin.html) `关闭`需要`超级的`特权还是[`关闭`](privileges-provided.html#priv_shutdown)特权

**第一步：同步服务器。**只有在使用已经在复制而不使用GTID的服务器时，才需要此步骤。对于新服务器，请转至步骤3。通过设置[`只读`](server-system-variables.html#sysvar_read_only)系统变量到`在…上`在每台服务器上发出以下命令：

```
mysql> SET @@GLOBAL.read_only = ON;
```

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

如果您使用二进制日志进行复制以外的任何操作，例如进行时间点备份和恢复，请等待，直到您不需要包含没有GTID的事务的旧二进制日志。理想情况下，等待服务器清除所有二进制日志，然后等待任何现有备份过期。

重要的

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

**步骤2：停止两台服务器。**停止每个服务器使用[**mysqladmin**](mysqladmin.html)如图所示，在哪里*`用户名`*具有足够权限关闭服务器的MySQL用户的用户名：

```
$> mysqladmin -uusername -p shutdown
```

然后在提示下提供该用户的密码。

**步骤3：在启用GTID的情况下启动两台服务器。**要启用基于GTID的复制，必须通过设置[`gtid_模式`](replication-options-gtids.html#sysvar_gtid_mode)可变到`在…上`，以及[`加强一致性`](replication-options-gtids.html#sysvar_enforce_gtid_consistency)变量已启用，以确保只记录对基于GTID的复制安全的语句。例如：

```
gtid_mode=ON
enforce-gtid-consistency=ON
```

使用[`--跳过从机启动`](replication-options-replica.html#option_mysqld_skip-slave-start)选项，或者从MySQL 8.0.24[`跳过从站开始`](replication-options-replica.html#sysvar_skip_slave_start)系统变量，以确保在配置副本设置之前不会启动复制。在MySQL 8.0.26中，使用[`--跳过副本启动`](replication-options-replica.html#option_mysqld_skip-replica-start)或[`跳过副本开始`](replication-options-replica.html#sysvar_skip_replica_start)相反有关GTID相关选项和变量的更多信息，请参阅[第17.1.6.5节，“全球交易ID系统变量”](replication-options-gtids.html).

在使用[mysql。gtid\_执行表](replication-gtids-concepts.html#replication-gtids-gtid-executed-table)。源服务器必须始终启用二进制日志记录才能进行复制。但是，副本服务器可以使用GTID，但不需要二进制日志记录。如果需要在副本服务器上禁用二进制日志记录，可以通过指定[`--跳过日志箱`](replication-options-binary-log.html#option_mysqld_log-bin)和[`--日志副本更新=关闭`](replication-options-binary-log.html#sysvar_log_replica_updates)或[`--日志从属更新=关闭`](replication-options-binary-log.html#sysvar_log_slave_updates)复制副本的选项。

**步骤4：将复制副本配置为使用基于GTID的自动定位。**告诉复制副本使用具有基于GTID的事务的源作为复制数据源，并使用基于GTID的自动定位，而不是基于文件的定位。问题a[`将复制源更改为`](change-replication-source-to.html)语句（来自MySQL 8.0.23）或[`将主机更改为`](change-master-to.html)声明（MySQL 8.0.23之前），包括`震源自动位置` \| `主自动位置`选项，告诉复制副本源事务由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.html#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进行故障切换和扩展”](replication-gtids-failover.html)，讨论了使用GTID时创建新副本的问题。
