DBAtlas · 数据库运维图谱

1785: Statement violates GTID consistency(语句违反 GTID 一致性)

MySQL

含义

在启用基于 GTID(全局事务标识符)的复制时,所执行的语句违反了 GTID 一致性规则。GTID 模式不允许某些无法安全分配到单个 GTID 的语句类型。

原因

1785(ER_GTID_UNSAFE_NON_TRANSACTIONAL_TABLE)专门出现在同一事务中同时更新非事务型(例如 MyISAM)表和事务型(InnoDB)表时,或在未启用 autocommit 的多语句事务中。在旧版本中,CREATE TABLE ... SELECT(8.0.21 之前;在 8.0.21+ 中对支持原子 DDL 的引擎允许)以及在事务中执行 CREATE/DROP TEMPORARY TABLE(8.0.13 之前;在 8.0.13+ 中当 binlog_format 为 ROW/MIXED 时允许)也违反 GTID 一致性(这些以单独的错误代码报告)。当 enforce_gtid_consistency=ON 时它们会被拒绝。

解决方法

不要在同一事务中混用非事务型引擎表和事务型表;用单条 autocommit 语句更新 MyISAM 表,或将所有表迁移到 InnoDB:ALTER TABLE my_table ENGINE=InnoDB; 在旧版本中(8.0.21 之前),将 CREATE TABLE ... SELECT 拆为两步(先 CREATE TABLE,再 INSERT ... SELECT);在 8.0.13 之前,在显式事务之外创建和删除临时表。

在 DBAtlas 中打开 →

同一数据库的其他条目