因为基于 GTID 的复制依赖于事务,所以在使用它时不支持 MySQL 中其他可用的一些功能。本节提供有关使用 GTID 进行复制的限制和限制的信息。
涉及非事务性存储引擎的更新。
使用 GTID 时,使用非事务性存储引擎更新表MyISAM
不能与使用事务性存储引擎更新表在同一语句或事务中进行,例如
InnoDB
.
此限制是由于在同一事务中对使用非事务性存储引擎的表的更新与对使用事务性存储引擎的表的更新混合在一起可能导致将多个 GTID 分配给同一事务。
当源和副本对同一表的各自版本使用不同的存储引擎时,也会出现此类问题,其中一个存储引擎是事务性的,而另一个不是。另请注意,定义为对非事务性表进行操作的触发器可能是导致这些问题的原因。
在刚刚提到的任何一种情况下,事务与 GTID 之间的一一对应关系被打破,导致基于 GTID 的复制无法正常运行。
创建表 ... 选择语句。
在 MySQL 8.0.21 之前,
CREATE
TABLE ... SELECT
使用基于 GTID 的复制时不允许使用语句。当
binlog_format
设置为 时
STATEMENT
,一条
CREATE
TABLE ... SELECT
语句在二进制日志中记录为一个 GTID 的一个事务,但如果
ROW
使用格式,则该语句被记录为两个 GTID 的两个事务。如果源使用
STATEMENT
格式而副本使用
ROW
格式,则副本将无法正确处理事务,因此
CREATE
TABLE ... SELECT
GTID 不允许使用该语句以防止这种情况发生。MySQL 8.0.21 在支持原子 DDL 的存储引擎上取消了此限制。在这种情况下,
CREATE
TABLE ... SELECT
作为一个事务记录在二进制日志中。有关详细信息,请参阅
第 13.1.1 节,“原子数据定义语句支持”。
临时表。
当binlog_format
设置为
时STATEMENT
,
当服务器上正在使用 GTID 时(即系统变量设置为时) ,不能在事务、过程、函数和触发器中使用
CREATE TEMPORARY
TABLE
语句
。如果设置了 GTID,则可以在使用 GTID 时在这些上下文之外使用它们
。从 MySQL 8.0.13 开始, when设置为or ,
并且
DROP TEMPORARY
TABLE
enforce_gtid_consistency
ON
autocommit=1
binlog_format
ROW
MIXED
CREATE TEMPORARY
TABLE
DROP TEMPORARY
TABLE
当使用 GTID 时,允许在事务、过程、函数或触发器中使用语句。这些语句不会写入二进制日志,因此不会复制到副本。使用基于行的复制意味着副本保持同步而无需复制临时表。如果从事务中删除这些语句导致事务为空,则事务不会写入二进制日志。
防止执行不受支持的语句。
为了防止执行会导致基于 GTID 的复制失败的语句,所有服务器都必须
--enforce-gtid-consistency
在启用 GTID 时使用该选项启动。这会导致本节前面讨论的任何类型的语句因错误而失败。
请注意,
--enforce-gtid-consistency
只有在对语句进行二进制日志记录时才会生效。如果在服务器上禁用了二进制日志记录,或者如果语句由于被过滤器删除而未写入二进制日志,则不会检查或强制执行未记录的语句的 GTID 一致性。
有关启用 GTID 时所需的其他启动选项的信息,请参阅第 17.1.3.4 节,“使用 GTID 设置复制”。
跳过交易。
sql_replica_skip_counter
or
sql_slave_skip_counter
在使用基于 GTID 的复制时不可用。如果您需要跳过事务,请改用源
gtid_executed
变量的值。如果您使用语句
的ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
选项在复制通道上启用了 GTID 分配
,或者
可用。有关详细信息,请参阅
第 17.1.7.3 节,“跳过事务”。
CHANGE REPLICATION SOURCE
TO
sql_replica_skip_counter
sql_slave_skip_counter
忽略服务器。 CHANGE
REPLICATION SOURCE TO
|
的 IGNORE_SERVER_IDS 选项 CHANGE
MASTER TO
使用 GTID 时不推荐使用该语句,因为已经应用的事务会被自动忽略。在开始基于 GTID 的复制之前,检查并清除之前在相关服务器上设置的所有忽略的服务器 ID 列表。该
SHOW
REPLICA STATUS
语句可以针对单个通道发出,如果有的话,会显示被忽略的服务器 ID 列表。如果没有列表,则该
Replicate_Ignore_Server_Ids
字段为空白。
GTID 模式和 mysql_upgrade。
在 MySQL 8.0.16 之前,当服务器运行时启用了全局事务标识符 (GTID) ( gtid_mode=ON
),请不要通过mysql_upgrade(
--write-binlog
选项)启用二进制日志记录。从 MySQL 8.0.16 开始,服务器执行整个 MySQL 升级过程,但在升级期间禁用二进制日志记录,因此没有问题。