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 之前,在显式事务之外创建和删除临时表。
同一数据库的其他条目
- 1267Illegal mix of collations(非法的排序规则混用)
- 1030Got error N from storage engine(从存储引擎收到错误 N)
- 1197Multi-statement transaction required more than 'max_binlog_cache_size'(多语句事务所需空间超过了 'max_binlog_cache_size')
- 3024Query execution was interrupted, maximum statement execution time exceeded(查询执行被中断,超出最大语句执行时间)
- 1298Unknown or incorrect time zone(未知或不正确的时区)
- 1418Function has none of DETERMINISTIC, NO SQL, or READS SQL DATA (binary logging enabled)(函数未声明 DETERMINISTIC、NO SQL 或 READS SQL DATA 中的任何一项)
- 1231Variable can't be set to the value of ...(变量不能设置为 ... 的值)