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 이전에서는 명시적 트랜잭션 밖에서 임시 테이블을 생성·삭제한다.
같은 데이터베이스의 다른 항목
- 1267Illegal mix of collations
- 1030Got error N from storage engine
- 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 ... (변수를 해당 값으로 설정할 수 없음)