DBAtlas · データベース運用アトラス

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 より前では一時テーブルの作成と削除を明示的なトランザクションの外で行う。

DBAtlas で開く →

同じデータベースの他の項目