#### 17.1.3.7 使用 GTID 进行复制的限制

[](<>)

因为基于 GTID 的复制依赖于事务，所以在使用 MySQL 时不支持一些原本在 MySQL 中可用的功能。本节提供有关使用 GTID 进行复制的限制和限制的信息。

**涉及非事务性存储引擎的更新。**使用 GTID 时，使用非事务性存储引擎更新表，例如[`MyISAM`](myisam-storage-engine.html)不能在与使用事务存储引擎（如[`InnoDB`](innodb-storage-engine.html).

此限制是由于在同一事务中对使用非事务性存储引擎的表的更新与对使用事务性存储引擎的表的更新混合可能导致将多个 GTID 分配给同一事务。

当源和副本对同一表的各自版本使用不同的存储引擎时，也会出现此类问题，其中一个存储引擎是事务性的，另一个不是。另请注意，定义为对非事务性表进行操作的触发器可能是导致这些问题的原因。

在刚才提到的任何一种情况下，事务和 GTID 之间的一一对应关系被破坏，导致基于 GTID 的复制无法正常运行。

**CREATE TABLE ... SELECT 语句。**在 MySQL 8.0.21 之前，[`创建表...选择`](create-table-select.html)使用基于 GTID 的复制时不允许使用语句。什么时候[`binlog_format`](replication-options-binary-log.html#sysvar_binlog_format)被设定为`陈述`， 一种[`创建表...选择`](create-table-select.html)语句在二进制日志中记录为一个具有一个 GTID 的事务，但如果`排`使用格式，该语句被记录为具有两个 GTID 的两个事务。如果使用的来源`陈述`格式和使用的副本`排`格式，副本将无法正确处理事务，因此[`创建表...选择`](create-table-select.html)声明不允许使用 GTID 以防止出现这种情况。在 MySQL 8.0.21 中支持 atomic DDL 的存储引擎上取消了此限制。在这种情况下，[`创建表...选择`](create-table-select.html)作为一个事务记录在二进制日志中。有关详细信息，请参阅[第 13.1.1 节，“原子数据定义语句支持”](atomic-ddl.html).

**临时表。**什么时候[`binlog_format`](replication-options-binary-log.html#sysvar_binlog_format)被设定为`陈述`,[`创建临时表`](create-table.html)和[`删除临时表`](drop-table.html)当 GTID 在服务器上使用时（即，当[`强制gtid_consistency`](replication-options-gtids.html#sysvar_enforce_gtid_consistency)系统变量设置为`在`）。在使用 GTID 时，它们可以在这些上下文之外使用，前提是[`自动提交=1`](server-system-variables.html#sysvar_autocommit)已设置。从 MySQL 8.0.13 开始，当[`binlog_format`](replication-options-binary-log.html#sysvar_binlog_format)被设定为`排`要么`混合`,[`创建临时表`](create-table.html)和[`删除临时表`](drop-table.html)使用 GTID 时，允许在事务、过程、函数或触发器中使用语句。这些语句不会写入二进制日志，因此不会复制到副本。使用基于行的复制意味着副本保持同步而无需复制临时表。如果从事务中删除这些语句导致空事务，则该事务不会写入二进制日志。

**防止执行不受支持的语句。**为了防止执行会导致基于 GTID 的复制失败的语句，所有服务器都必须以[`--enforce-gtid-一致性`](replication-options-gtids.html#sysvar_enforce_gtid_consistency)启用 GTID 时的选项。这会导致本节前面讨论的任何类型的语句都失败并出现错误。

注意[`--enforce-gtid-一致性`](replication-options-gtids.html#sysvar_enforce_gtid_consistency)仅当对语句进行二进制日志记录时才会生效。如果在服务器上禁用了二进制日志记录，或者如果语句由于被过滤器删除而未写入二进制日志，则不会检查或强制未记录语句的 GTID 一致性。

有关启用 GTID 时所需的其他启动选项的信息，请参阅[第 17.1.3.4 节，“使用 GTID 设置复制”](replication-gtids-howto.html).

**跳过交易。**  [`sql_replica_skip_counter`](replication-options-replica.html#sysvar_sql_replica_skip_counter)要么[`sql_slave_skip_counter`](replication-options-replica.html#sysvar_sql_slave_skip_counter)使用基于 GTID 的复制时不可用。如果您需要跳过事务，请使用源的值[`gtid_executed`](replication-options-gtids.html#sysvar_gtid_executed)改为变量。如果您已使用复制通道启用 GTID 分配`ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS`的选项[`将复制源更改为`](change-replication-source-to.html)陈述，[`sql_replica_skip_counter`](replication-options-replica.html#sysvar_sql_replica_skip_counter)要么[`sql_slave_skip_counter`](replication-options-replica.html#sysvar_sql_slave_skip_counter)可用。有关详细信息，请参阅[第 17.1.7.3 节，“跳过事务”](replication-administration-skip.html).

**忽略服务器。**忽略\_服务器\_IDS 选项[`将复制源更改为`](change-replication-source-to.html)\|[`将主更改为`](change-master-to.html)使用 GTID 时不推荐使用语句，因为已应用的事务会被自动忽略。在开始基于 GTID 的复制之前，请检查并清除之前在相关服务器上设置的所有忽略的服务器 ID 列表。这[`显示副本状态`](show-replica-status.html)可以为单个通道发出的语句显示忽略的服务器 ID 的列表（如果有的话）。如果没有列表，则`Replicate_Ignore_Server_Ids`字段为空白。

[](<>)**GTID模式和mysql\_升级。**在 MySQL 8.0.16 之前，当服务器在启用全局事务标识符 (GTID) 的情况下运行时 ([`gtid_mode=ON`](replication-options-gtids.html#sysvar_gtid_mode))，不要启用二进制日志记录[**mysql\_升级**](mysql-upgrade.html)（这[`--write-binlog`](mysql-upgrade.html#option_mysql_upgrade_write-binlog)选项）。从 MySQL 8.0.16 开始，服务器执行整个 MySQL 升级过程，但在升级过程中禁用了二进制日志记录，因此没有问题。
