• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 使用GTID复制的限制

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

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

    此限制是由于以下事实:在同一事务中对使用非事务性存储引擎的表的更新与对使用事务性存储引擎的表的更新混合在一起可能导致将多个GTID分配给同一事务。

    当主服务器和从属服务器针对同一表的各自版本使用不同的存储引擎时,也会出现此类问题,其中一个存储引擎是事务性的,而另一个则不是事务性的。还应注意,定义为对非事务表进行操作的触发器可能是导致这些问题的原因。

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

    CREATE TABLE ... SELECT语句。CREATE TABLE ... SELECT使用基于GTID的复制时,不允许使用这些语句。当binlog_format设置为STATEMENT时,一条CREATE TABLE ... SELECT语句作为具有一个GTID的一个事务记录在二进制日志中,但是如果使用ROW格式,则该语句记录为具有两个GTID的两个事务。如果主服务器使用STATEMENT格式,而从服务器使用ROW格式,CREATE TABLE ... SELECT则从服务器将无法正确处理事务,因此不允许使用GTID语句来防止这种情况。

    临时表。binlog_format被设定为STATEMENTCREATE TEMPORARY TABLEDROP TEMPORARY TABLE语句不能内部交易,程序,函数,以及触发器被使用时GTIDs是在服务器上使用(即,当enforce_gtid_consistency系统变量被设置为ON)。如果autocommit=1已设置GTID,则可以在这些上下文之外使用它们。从MySQL 8.0.13开始,当binlog_format设置为ROW或时MIXEDCREATE TEMPORARY TABLE以及DROP TEMPORARY TABLE使用GTID时,在事务,过程,函数或触发器中允许使用语句。该语句未写入二进制日志,因此不会复制到从属服务器。使用基于行的复制意味着从属保持同步,而无需复制临时表。如果从事务中删除这些语句导致空的事务,则该事务不会写入二进制日志。

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

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

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

    跳过交易。sql_slave_skip_counter使用GTID时不支持。如果需要跳过事务,请改用master gtid_executed变量的值。有关更多信息,请参见注入空事务。

    忽略服务器。CHANGE MASTER TO使用GTID时,不建议使用该语句的IGNORE_SERVER_IDS选项,因为已应用的事务将被自动忽略。在开始基于GTID的复制之前,请检查并清除以前在相关服务器上设置的所有忽略的服务器ID列表。该SHOW SLAVE STATUS语句可以针对各个通道发出,如果存在,则会显示被忽略的服务器ID的列表。如果没有列表,则该Replicate_Ignore_Server_Ids字段为空白。

    GTID模式和mysqldump。如果目标服务器的二进制日志中没有GTID ,则可以将使用mysqldump创建的转储导入到启用了GTID模式的MySQL服务器中。

    GTID模式和mysql_upgrade。在MySQL 8.0.16之前的版本中,当服务器在启用全局事务标识符(GTID)的情况下运行(gtid_mode=ON)时,请勿通过mysql_upgrade(该--write-binlog选项)启用二进制日志记录。从MySQL 8.0.16开始,服务器执行整个MySQL升级过程,但是在升级过程中禁用二进制日志记录,因此没有问题。