DBAtlas · 데이터베이스 운영 아틀라스

1785: Statement violates GTID consistency

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+에서는 atomic 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를 두 단계로 나누고(CREATE TABLE 후 INSERT ... SELECT), 8.0.13 이전에서는 명시적 트랜잭션 밖에서 임시 테이블을 생성·삭제한다.

DBAtlas에서 열기 →

같은 데이터베이스의 다른 항목