1197: Multi-statement transaction required more than 'max_binlog_cache_size' (다중 문장 트랜잭션이 'max_binlog_cache_size'보다 많은 공간을 요구함)
MySQL의미
단일 트랜잭션이 생성한 binlog 데이터가 max_binlog_cache_size로 정의된 메모리/캐시 한도를 초과했다. 트랜잭션이 binary log에 들어가지 않아 실패하고 롤백되었다.
원인
매우 큰 트랜잭션(수백만 행의 단일 INSERT/UPDATE/DELETE 또는 거대한 bulk load)이 binlog 캐시를 채웠다. binary logging이 활성화된 경우(복제/시점 복구) 큰 트랜잭션은 이 한도를 쉽게 초과할 수 있다.
해결 방법
큰 트랜잭션을 작은 배치로 나누고 배치마다 COMMIT한다. 정말 큰 트랜잭션을 피할 수 없다면 max_binlog_cache_size(필요하면 binlog_cache_size도)를 늘린다. ETL/bulk load에서는 중간 COMMIT을 포함한 분할 로드로 이 오류와 장시간 락 보유를 모두 방지한다.
같은 데이터베이스의 다른 항목
- 1055Expression not in GROUP BY (only_full_group_by) (GROUP BY에 없는 표현식)
- 1267Illegal mix of collations
- 1030Got error N from storage engine
- 1785Statement violates GTID consistency
- 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 중 어느 것도 없음)