文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (美国信函) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  使用 GTID 的复制限制

19.1.3.7 使用 GTID 的复制限制

由于基于 GTID 的复制依赖于事务,因此一些在 MySQL 中可用的功能在使用它时不受支持。本节提供有关使用 GTID 的复制限制的信息。

涉及非事务性存储引擎的更新。 在使用 GTID 时,对使用非事务性存储引擎(如 MyISAM)的表的更新不能与对使用事务性存储引擎(如 InnoDB)的表的更新在同一个语句或事务中进行。

此限制是由于这样一个事实,即在同一事务内对使用非事务性存储引擎的表进行更新与对使用事务性存储引擎的表进行更新混合在一起,会导致为同一事务分配多个 GTID。

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

在上述任何情况下,事务和 GTID 之间的一对一对应关系都会被破坏,结果是基于 GTID 的复制无法正常工作。

CREATE TABLE ... SELECT 语句。 对于支持原子 DDL 的存储引擎,CREATE TABLE ... SELECT 在二进制日志中记录为一个事务。有关更多信息,请参见 第 15.1.1 节“原子数据定义语句支持”

临时表。 如果 binlog_format 设置为 STATEMENTCREATE TEMPORARY TABLEDROP TEMPORARY TABLE 语句在服务器上使用 GTID 时(即,当 enforce_gtid_consistency 系统变量设置为 ON 时),不能在事务、过程、函数和触发器内使用。当 GTID 正在使用时,它们可以在这些上下文之外使用,前提是 autocommit=1 设置。当 binlog_format 设置为 ROWMIXED 时,当 GTID 正在使用时,CREATE TEMPORARY TABLEDROP TEMPORARY TABLE 语句可以在事务、过程、函数或触发器内使用。这些语句不会写入二进制日志,因此不会复制到副本。使用基于行的复制意味着副本保持同步,而无需复制临时表。如果从事务中删除这些语句导致空事务,则该事务不会写入二进制日志。

防止执行不支持的语句。 为了防止执行会导致基于 GTID 的复制失败的语句,所有服务器在启用 GTID 时,必须使用 --enforce-gtid-consistency 选项启动。这将导致本节前面讨论的任何类型的语句都以错误失败。

请注意,--enforce-gtid-consistency 仅在对语句进行二进制日志记录时才生效。如果服务器上的二进制日志记录被禁用,或者语句由于被过滤器删除而没有写入二进制日志,则不会对未记录的语句进行 GTID 一致性检查或强制执行。

有关启用 GTID 时其他必需的启动选项的信息,请参阅 第 19.1.3.4 节,“使用 GTID 设置复制”

跳过事务。 sql_replica_skip_counter 在使用基于 GTID 的复制时不可用。如果需要跳过事务,请使用源的 gtid_executed 变量的值。如果已使用 CHANGE REPLICATION SOURCE TO 语句的 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS 选项在复制通道上启用了 GTID 赋值,则 sql_replica_skip_counter 可用。有关更多信息,请参阅 第 19.1.7.3 节,“跳过事务”

忽略服务器。 IGNORE_SERVER_IDS 不能与 CHANGE REPLICATION SOURCE TO 一起使用,因为在使用 GTID 时,已应用的事务会自动被忽略。在开始基于 GTID 的复制之前,请检查并清除已在涉及的服务器上设置的所有忽略的服务器 ID 列表。SHOW REPLICA STATUS 语句(可以针对各个通道发出)会显示忽略的服务器 ID 列表(如果有)。如果没有列表,则 Replicate_Ignore_Server_Ids 字段为空。如果忽略的服务器 ID 列表不为空,则可以使用 CHANGE REPLICATION SOURCE TO ... IGNORE_SERVER_IDS=()(换句话说,使用要忽略的服务器 ID 的空列表)清除它。