DBAtlas · Атлас эксплуатации баз данных

1785: Statement violates GTID consistency

MySQL

Что это значит?

При включённой репликации на основе GTID (Global Transaction Identifier) выполненный оператор нарушает правила согласованности GTID. Режим GTID не допускает некоторых типов операторов, которые невозможно безопасно назначить одному GTID.

Почему возникает?

1785 (ER_GTID_UNSAFE_NON_TRANSACTIONAL_TABLE) возникает именно тогда, когда нетранзакционные таблицы (например, MyISAM) обновляются в той же транзакции, что и транзакционные (InnoDB), или в многооператорной транзакции без autocommit. В старых версиях согласованность GTID также нарушают CREATE TABLE ... SELECT (до 8.0.21; в 8.0.21+ разрешено для движков с поддержкой атомарного DDL) и CREATE/DROP TEMPORARY TABLE внутри транзакции (до 8.0.13; в 8.0.13+ разрешено при binlog_format ROW/MIXED) (о них сообщается отдельными кодами ошибок). Они отклоняются при 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 →

Ещё по этой СУБД