#### 17.1.4.1 复制模式概念

[](<>)

为了能够安全地配置在线服务器的复制模式，了解复制的一些关键概念非常重要。本节解释了这些概念，是尝试修改在线服务器的复制模式之前的必备阅读材料。

MySQL 中可用的复制模式依赖于不同的技术来识别记录的事务。复制使用的事务类型如下：

-   GTID 事务由全局事务标识符 (GTID) 标识，格式为`UUID：号码`.日志中的每个 GTID 事务总是以`Gtid_log_event`.GTID 事务可以使用 GTID 或使用文件名和位置来处理。

-   匿名事务没有分配 GTID，MySQL 确保日志中的每个匿名事务前面都有一个`Anonymous_gtid_log_event`.在以前的版本中，匿名交易之前没有任何特定事件。匿名事务只能使用文件名和位置来处理。

    使用 GTID 时，您可以利用 GTID 自动定位和自动故障转移，以及使用[`WAIT_FOR_EXECUTED_GTID_SET()`](gtid-functions.html#function_wait-for-executed-gtid-set),[`session_track_gtids`](server-system-variables.html#sysvar_session_track_gtids)，并使用性能模式表监视复制的事务。

    从运行先前版本 MySQL 的源接收到的中继日志中的事务可能根本没有任何特定事件，但是在被重放并记录在副本的二进制日志中之后，它们前面有一个`Anonymous_gtid_log_event`.

    在线配置复制模式的能力意味着[`gtid_mode`](replication-options-gtids.html#sysvar_gtid_mode)和[`强制gtid_consistency`](replication-options-gtids.html#sysvar_enforce_gtid_consistency)变量现在都是动态的，并且可以由具有足够权限以设置全局系统变量的帐户从顶级语句中设置。看[第 5.1.9.1 节，“系统变量权限”](system-variable-privileges.html).在 MySQL 5.6 及更早版本中，这两个变量只能在服务器启动时使用适当的选项进行配置，这意味着对复制模式的更改需要重新启动服务器。在所有版本中[`gtid_mode`](replication-options-gtids.html#sysvar_gtid_mode)可以设置为`在`要么`离开`，这对应于 GTID 是否用于识别交易。什么时候[`gtid_mode=ON`](replication-options-gtids.html#sysvar_gtid_mode)无法复制匿名交易，以及何时[`gtid_mode=OFF`](replication-options-gtids.html#sysvar_gtid_mode)只能复制匿名交易。什么时候[`gtid_mode=OFF_PERMISSIVE`](replication-options-gtids.html#sysvar_gtid_mode)然后*新的*事务是匿名的，同时允许复制事务是 GTID 或匿名事务。什么时候[`gtid_mode=ON_PERMISSIVE`](replication-options-gtids.html#sysvar_gtid_mode)然后*新的*事务使用 GTID，同时允许复制事务是 GTID 或匿名事务。这意味着可以有一个复制拓扑，其中包含使用匿名和 GTID 事务的服务器。例如一个来源[`gtid_mode=ON`](replication-options-gtids.html#sysvar_gtid_mode)可以复制到副本[`gtid_mode=ON_PERMISSIVE`](replication-options-gtids.html#sysvar_gtid_mode).的有效值[`gtid_mode`](replication-options-gtids.html#sysvar_gtid_mode)如下并按此顺序：

-   `离开`

-   `OFF_PERMISSIVE`

-   `ON_PERMISSIVE`

-   `在`

    需要注意的是，状态[`gtid_mode`](replication-options-gtids.html#sysvar_gtid_mode)只能按上述顺序一步一步更改。例如，如果[`gtid_mode`](replication-options-gtids.html#sysvar_gtid_mode)当前设置为`OFF_PERMISSIVE`, 可以改成`离开`要么`ON_PERMISSIVE`但不是`在`.这是为了确保从匿名事务在线更改为 GTID 事务的过程由服务器正确处理。当您在[`gtid_mode=ON`](replication-options-gtids.html#sysvar_gtid_mode)和[`gtid_mode=OFF`](replication-options-gtids.html#sysvar_gtid_mode), GTID 状态（换句话说[`gtid_executed`](replication-options-gtids.html#sysvar_gtid_executed)) 是持久的。这样可以确保始终保留服务器已应用的 GTID 集，而不管不同类型之间的更改。[`gtid_mode`](replication-options-gtids.html#sysvar_gtid_mode).

    与 GTID 相关的字段显示正确的信息，而与当前选择的无关[`gtid_mode`](replication-options-gtids.html#sysvar_gtid_mode).这意味着显示 GTID 集的字段，例如[`gtid_executed`](replication-options-gtids.html#sysvar_gtid_executed),[`gtid_purged`](replication-options-gtids.html#sysvar_gtid_purged),`RECEIVED_TRANSACTION_SET`在里面[`复制连接状态`](performance-schema-replication-connection-status-table.html)Performance Schema 表，以及 GTID 相关结果[`显示副本状态`](show-replica-status.html)（或在 MySQL 8.0.22 之前，[`显示奴隶状态`](show-slave-status.html))，现在在不存在 GTID 时返回空字符串。显示单个 GTID 的字段，例如`CURRENT_TRANSACTION`在性能模式中[`replication_applier_status_by_worker`](performance-schema-replication-applier-status-by-worker-table.html)表，现在显示`匿名的`当不使用 GTID 事务时。

    使用从源复制[`gtid_mode=ON`](replication-options-gtids.html#sysvar_gtid_mode)提供使用 GTID 自动定位的能力，使用`SOURCE_AUTO_POSITION`的[`将复制源更改为`](change-replication-source-to.html)语句（来自 MySQL 8.0.23），或`MASTER_AUTO_POSITION`的选项[`将主更改为`](change-master-to.html)语句（在 MySQL 8.0.23 之前）。正在使用的复制拓扑会影响是否可以启用自动定位，因为此功能依赖于 GTID，并且与匿名事务不兼容。强烈建议在启用自动定位之前确保拓扑中没有剩余匿名事务，请参阅[第 17.1.4.2 节，“启用在线 GTID 事务”](replication-mode-change-online-enable-gtids.html).

    的有效组合[`gtid_mode`](replication-options-gtids.html#sysvar_gtid_mode)源和副本上的自动定位如下表所示，其中源的[`gtid_mode`](replication-options-gtids.html#sysvar_gtid_mode)显示在水平面和复制品的[`gtid_mode`](replication-options-gtids.html#sysvar_gtid_mode)是垂直的。每个条目的含义如下：

-   `是`： 这[`gtid_mode`](replication-options-gtids.html#sysvar_gtid_mode)源和副本的兼容

-   `ñ`： 这[`gtid_mode`](replication-options-gtids.html#sysvar_gtid_mode)源和副本不兼容

-   `*`：自动定位可与此组合一起使用

[](<>)

**表 17.1 源和副本 gtid 的有效组合\_模式**

| [`gtid_mode`](replication-options-gtids.html#sysvar_gtid_mode) | 资源`离开` | 资源`OFF_PERMISSIVE` | 资源`ON_PERMISSIVE` | 资源`在` |
| -------------------------------------------------------------- | ------ | ------------------ | ----------------- | ----- |
| 复制品`离开` | 是 | 是 | ñ | ñ |
| 复制品`OFF_PERMISSIVE` | 是 | 是 | 是 | 是\* |
| 复制品`ON_PERMISSIVE` | 是 | 是 | 是 | 是\* |
| 复制品`在` | ñ | ñ | 是 | 是\* |

当前选中的[`gtid_mode`](replication-options-gtids.html#sysvar_gtid_mode)也影响到[`gtid_next`](replication-options-gtids.html#sysvar_gtid_next)多变的。下表显示了服务器对不同值的行为[`gtid_mode`](replication-options-gtids.html#sysvar_gtid_mode)和[`gtid_next`](replication-options-gtids.html#sysvar_gtid_next).每个条目的含义如下：

-   `匿名的`: 生成匿名交易。

-   `错误`: 产生错误，执行失败`设置 GTID_NEXT`.

-   `UUID：号码`：生成具有指定 UUID:NUMBER 的 GTID。

-   `新的 GTID`：使用自动生成的数字生成 GTID。

[](<>)

**表 17.2 gtid 的有效组合\_模式和gtid\_下一个**

|  | [`gtid_next`](replication-options-gtids.html#sysvar_gtid_next)自动的<br/><br/>二进制登录 | [`gtid_next`](replication-options-gtids.html#sysvar_gtid_next)自动的<br/><br/>二进制注销 | [`gtid_next`](replication-options-gtids.html#sysvar_gtid_next)匿名的 | [`gtid_next`](replication-options-gtids.html#sysvar_gtid_next)UUID：号码 |
| --- | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ----------------------------------------------------------------- | --------------------------------------------------------------------- |
| [`gtid_mode`](replication-options-gtids.html#sysvar_gtid_mode) `离开` | 匿名的 | 匿名的 | 匿名的 | 错误 |
| [`gtid_mode`](replication-options-gtids.html#sysvar_gtid_mode) `OFF_PERMISSIVE` | 匿名的 | 匿名的 | 匿名的 | UUID：号码 |
| [`gtid_mode`](replication-options-gtids.html#sysvar_gtid_mode) `ON_PERMISSIVE` | 新的 GTID | 匿名的 | 匿名的 | UUID：号码 |
| [`gtid_mode`](replication-options-gtids.html#sysvar_gtid_mode) `在` | 新的 GTID | 匿名的 | 错误 | UUID：号码 |

当二进制日志关闭并且[`gtid_next`](replication-options-gtids.html#sysvar_gtid_next)被设定为`自动的`，则不会生成 GTID。这与以前版本的行为一致。
