由于基于GTID的复制依赖于事务,一些otherwise在MySQL中可用的功能在使用GTID时不可用。本节提供了关于使用GTID的复制限制和限制的信息。
涉及非事务存储引擎的更新。 使用GTID时,无法在同一语句或事务中更新使用非事务存储引擎(如MyISAM
)的表和使用事务存储引擎(如InnoDB
)的表。
这是因为更新使用非事务存储引擎的表和更新使用事务存储引擎的表在同一事务中可能会导致同一事务被分配多个GTID。
类似的问题也可能发生在源服务器和副本服务器使用不同的存储引擎来存储同一表时,其中一个存储引擎是事务性的,另一个不是。还要注意,定义在非事务表上的触发器也可能引发这些问题。
在任何这些情况下,事务和GTID之间的一对一对应关系被破坏,导致基于GTID的复制无法正确工作。
CREATE TABLE ... SELECT语句。 对于支持原子DDL的存储引擎,CREATE TABLE ... SELECT
在二进制日志中记录为一个事务。有关更多信息,请参见第15.1.1节,“原子数据定义语句支持”。
临时表。 如果binlog_format
设置为 STATEMENT
,CREATE TEMPORARY TABLE
和 DROP TEMPORARY TABLE
语句不能在事务、过程、函数和触发器中使用当GTID在服务器上启用时(即enforce_gtid_consistency
系统变量设置为 ON
)。它们可以在GTID启用时在这些上下文之外使用,前提是autocommit=1
设置。当binlog_format
设置为 ROW
或 MIXED
时,CREATE TEMPORARY TABLE
和 DROP TEMPORARY TABLE
语句可以在事务、过程、函数或触发器中使用当GTID启用时。这些语句不会被写入二进制日志,因此不会被复制到副本上。如果从事务中删除这些语句结果为空事务,则该事务不会被写入二进制日志。
防止执行不支持的语句。 为了防止执行可能导致基于GTID的复制失败的语句,所有服务器必须在启用GTID时启动--enforce-gtid-consistency
选项。这将导致任何类型的语句失败并显示错误。
注意--enforce-gtid-consistency
只在语句被写入二进制日志时生效。如果二进制日志记录被禁用或语句被过滤器删除,那么GTID一致性检查和执行将不会生效。
有关启用GTID所需的其他启动选项的信息,请参见第19.1.3.4节,“使用GTID设置复制”。
跳过事务。 sql_replica_skip_counter
在使用基于GTID的复制时不可用。如果您需要跳过事务,请使用源的gtid_executed
变量的值代替。如果您在复制通道上启用了GTID分配,使用CHANGE REPLICATION SOURCE TO
语句的ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
选项,sql_replica_skip_counter
可用。有关更多信息,请参阅第 19.1.7.3 节,“跳过事务”。
忽略服务器。 IGNORE_SERVER_IDS
不能与CHANGE REPLICATION SOURCE TO
一起使用,因为已经应用的事务将自动被忽略。在启动基于GTID的复制之前,请检查并清除所有以前设置的忽略服务器ID列表,涉及到的服务器。如果SHOW REPLICA STATUS
语句(可以针对单个通道发出)显示的忽略服务器ID列表不为空,可以使用CHANGE REPLICATION SOURCE TO ... IGNORE_SERVER_IDS=()
(即使用空列表)来清除它。