1785: Statement violates GTID consistency(文が GTID 整合性に違反)
MySQL意味
GTID (Global Transaction Identifier) ベースのレプリケーションが有効な状態で、実行された文が 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 の場合に拒否される。
対処方法
同じトランザクション内で非トランザクションエンジンのテーブルとトランザクションテーブルを混在させない。MyISAM テーブルは autocommit の単一文で更新するか、すべてのテーブルを InnoDB に移行する: ALTER TABLE my_table ENGINE=InnoDB; 古いバージョン (8.0.21 より前) では CREATE TABLE ... SELECT を 2 段階 (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 ...(変数を ... の値に設定できない)