因为基于 GTID 的复制依赖于事务,所以在使用它时不支持 MySQL 中其他可用的一些功能。本节提供有关使用 GTID 进行复制的限制和限制的信息。
涉及非事务性存储引擎的更新。
使用 GTID 时,使用非事务性存储引擎更新表MyISAM
不能与使用事务性存储引擎更新表在同一语句或事务中进行,例如
InnoDB
.
此限制是由于在同一事务中对使用非事务性存储引擎的表的更新与对使用事务性存储引擎的表的更新混合在一起可能导致将多个 GTID 分配给同一事务。
当源和副本对同一表的各自版本使用不同的存储引擎时,也会出现此类问题,其中一个存储引擎是事务性的,而另一个不是。
在刚刚提到的任何一种情况下,事务与 GTID 之间的一一对应关系被打破,导致基于 GTID 的复制无法正常运行。
创建表 ... 选择语句。
CREATE
TABLE ... SELECT
对于基于语句的复制是不安全的。当使用基于行的复制时,这个语句实际上被记录为两个单独的事件——一个用于创建表,另一个用于将行从源表插入到刚创建的新表中。当此语句在事务中执行时,在某些情况下这两个事件可能会收到相同的事务标识符,这意味着包含插入的事务被副本跳过。因此,
CREATE TABLE ... SELECT
在使用基于 GTID 的复制时不受支持。
临时表。
使用 GTID 时(即,当服务器以该
选项启动时) ,事务内部不支持CREATE TEMPORARY
TABLE
和
语句。可以在启用 GTID 的情况下使用这些语句,但只能在任何事务之外,并且只能与
.
DROP TEMPORARY
TABLE
--enforce-gtid-consistency
autocommit=1
防止执行不受支持的语句。
为了防止执行会导致基于 GTID 的复制失败的语句,所有服务器都必须
--enforce-gtid-consistency
在启用 GTID 时使用该选项启动。这会导致本节前面讨论的任何类型的语句因错误而失败。
有关启用 GTID 时所需的其他启动选项的信息,请参阅第 17.1.3.2 节,“使用 GTID 设置复制”。
sql_slave_skip_counter
使用 GTID 时不支持。如果您需要跳过事务,请改用源
gtid_executed
变量的值;有关详细信息,请参阅注入空交易。
GTID 模式和 mysqldump。 在 MySQL 5.6.9 及更高版本中,如果目标服务器的二进制日志中没有 GTID ,则可以将使用mysqldump生成的转储导入运行在 GTID 模式下的 MySQL 服务器。
在MySQL 5.6.9之前,mysqldump不记录全局事务ID,需要使用binary log和mysqlbinlog来恢复GTID。(错误#14797808,错误#14832472)
GTID 模式和 mysql_upgrade。
在 MySQL 5.6.7 之前,mysql_upgrade无法连接到在启用全局事务标识符 (GTID) 的情况下运行的 MySQL 服务器 ( gtid_mode=ON
),除非
mysql_upgrade使用 运行
--write-binlog=OFF
。否则,必须
在运行
mysql_upgrade之前重新启动mysqld,然后再重新启动
。在 MySQL 5.6.7 及更高版本中,mysql_upgrade默认
运行。(漏洞#13833710)。当服务器以 ( ) 运行时,不要启用此选项。
gtid_mode=OFF
gtid_mode=ON
--write-binlog=OFF
gtid_mode=ON