Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Restrictions on Replication with GTIDs

19.1.3.7 复制限制:使用 GTIDs

由于 GTID-基于的复制依赖于事务,因此在使用它时,MySQL 中一些功能不可用。这部分提供了关于 GTIDs 复制的限制和限制的信息。

非事务存储引擎的更新。 在使用 GTIDs 时,使用非事务存储引擎,如MyISAM的表不能在同一个语句或事务中与使用事务存储引擎,如InnoDB的表更新。

这项限制是因为在同一个事务中更新使用非事务存储引擎的表和使用事务存储引擎的表可能会导致同一个事务分配多个 GTIDs。

类似的问题也可能发生在源端和副本端使用不同的存储引擎来存储同一个表的不同版本,其中一个存储引擎是事务的,而另一个存储引擎不是。还需要注意的是,定义在非事务表上的触发器可能会导致这些问题。

在上述任何情况下,事务和 GTIDs 之间的一对一对应关系被破坏,导致 GTID-基于的复制不能正确地工作。

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

临时表.  如果binlog_format 设置为 STATEMENT,则CREATE TEMPORARY TABLEDROP TEMPORARY TABLE 语句不能在事务、存储程序、函数和触发器中使用,除非在服务器上启用了GTIDs(即enforce_gtid_consistency 系统变量设置为 ON)。在GTIDs启用时,可以在这些上下文外使用这些语句,只要autocommit=1 设置为 1。 When binlog_format 设置为 ROWMIXED,则CREATE TEMPORARY TABLEDROP TEMPORARY TABLE 语句可以在事务、存储程序、函数或触发器中使用,GTIDs启用时。这些语句不会被写入二进制日志,因此不会被复制到副本上。行级别复制意味着副本保持同步,不需要复制临时表。如果这些语句从事务中删除,导致空事务,事务不会被写入二进制日志。

防止执行不支持的语句.  要防止语句执行,导致GTID-基于的复制失败,所有服务器都必须使用--enforce-gtid-consistency 选项启用GTIDs。这将导致语句失败,并显示错误。

注意--enforce-gtid-consistency 只有在语句被写入二进制日志时才生效。如果服务器禁用二进制日志记录,或者语句被过滤器删除,不会被写入二进制日志,GTID一致性将不会被检查或强制执行语句。

关于启用GTIDs时需要的其他启动选项,请参阅第19.1.3.4节,“使用 GTIDs 设置复制”

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

忽略服务器。 IGNORE_SERVER_IDS不能与CHANGE REPLICATION SOURCE TO语句在使用 GTIDs时一起使用,因为已经应用的事务将自动被忽略。在开始 GTID-基于的复制前,请检查并清除参与的服务器上之前设置的所有忽略服务器 ID 列表。可以使用SHOW REPLICA STATUS语句,显示每个通道的忽略服务器 ID 列表。如果没有列表,Replicate_Ignore_Server_Ids字段为空。如果忽略服务器 ID 列表不为空,可以使用CHANGE REPLICATION SOURCE TO ... IGNORE_SERVER_IDS=()(即使用空的忽略服务器 ID 列表)来清除列表。