Spec-Zone.ru › MySQL 9.2

7.4.4.3 Формат двоичного протоколирования смешанного типа

При работе в формате протоколирования MIXED сервер автоматически переключается с протоколирования на основе операторов на протоколирование на основе строк в следующих условиях:

  • Когда функция содержит UUID().

  • Когда одна или несколько таблиц с AUTO_INCREMENT столбцами обновляются, и вызывается триггер или хранимая функция. Как и все другие небезопасные операторы, это генерирует предупреждение, если binlog_format = STATEMENT.

    Для получения дополнительной информации см. Раздел 19.5.1.1, «Репликация и AUTO_INCREMENT».

  • Когда тело представления требует репликации на основе строк, оператор создания представления также использует её. Например, это происходит, когда оператор создания представления использует функцию UUID().

  • Когда участвует вызов загружаемой функции.

  • Когда используется FOUND_ROWS() или ROW_COUNT(). (Ошибка #12092, Ошибка #30244)

  • Когда используется USER(), CURRENT_USER() или CURRENT_USER. (Ошибка #28086)

  • Когда одна из участвующих таблиц является таблицей журнала в базе данных mysql.

  • Когда используется функция LOAD_FILE(). (Ошибка #39701)

  • Когда оператор ссылается на одну или несколько системных переменных. (Ошибка #31168)

    Исключение. Следующие системные переменные, используемые только в рамках области сеанса, не вызывают переключения формата протоколирования:

    • auto_increment_increment

    • auto_increment_offset

    • character_set_client

    • character_set_connection

    • character_set_database

    • character_set_server

    • collation_connection

    • collation_database

    • collation_server

    • foreign_key_checks

    • identity

    • last_insert_id

    • lc_time_names

    • pseudo_thread_id

    • sql_auto_is_null

    • time_zone

    • timestamp

    • unique_checks

    Для получения информации о определении области действия системных переменных, см. Раздел 7.1.9, «Использование системных переменных».

    Для получения информации о том, как репликация обрабатывает sql_mode, см. Раздел 19.5.1.40, «Репликация и переменные».

В версиях MySQL до 8.0, при использовании смешанного формата двоичного протоколирования, если оператор протоколировался на основе строк, и сеанс, выполнивший оператор, имел временные таблицы, все последующие операторы обрабатывались как небезопасные и протоколировались в формате на основе строк, пока все временные таблицы, используемые этим сеансом, не были удалены. В MySQL 9.2 операции с временными таблицами не протоколируются в смешанном формате двоичного протоколирования, и наличие временных таблиц в сеансе не влияет на режим протоколирования, используемый для каждого оператора.

Примечание

Генерируется предупреждение, если вы пытаетесь выполнить оператор с использованием протоколирования на основе операторов, который должен быть записан с использованием протоколирования на основе строк. Предупреждение отображается как в клиенте (в выводе SHOW WARNINGS), так и в журнале ошибок mysqld. Предупреждение добавляется в таблицу SHOW WARNINGS каждый раз, когда выполняется такой оператор. Однако в журнал ошибок записывается только первый оператор, который сгенерировал предупреждение для каждого сеанса клиента, чтобы избежать переполнения журнала.

В дополнение к вышеуказанным решениям, отдельные движки также могут определять формат протоколирования, используемый при обновлении информации в таблице. Возможности протоколирования отдельного движка могут быть определены следующим образом:

  • Если движок поддерживает протоколирование на основе строк, движок считается способным к протоколированию на основе строк.

  • Если движок поддерживает протоколирование на основе операторов, движок считается способным к протоколированию на основе операторов.

Данный движок хранения может поддерживать один или оба формата протоколирования. В следующей таблице перечислены форматы, поддерживаемые каждым движком.

Движок хранения Поддержка протоколирования на основе строк Поддержка протоколирования на основе операторов
ARCHIVE Да Да
BLACKHOLE Да Да
CSV Да Да
EXAMPLE Да Нет
FEDERATED Да Да
HEAP Да Да
InnoDB Да Да, когда уровень изоляции транзакции равен REPEATABLE READ или SERIALIZABLE; Нет в противном случае.
MyISAM Да Да
MERGE Да Да
NDB Да Нет

Определение оператора для протоколирования и режима протоколирования определяется типом оператора (безопасный, небезопасный или бинарный), форматом двоичного протоколирования (STATEMENT, ROW или MIXED), и возможностями протоколирования движка хранения (способный к протоколированию операторов, строк, обоих или ни одного). (Бинарная инъекция относится к протоколированию изменения, которое должно быть протоколировано в формате ROW.)

Операторы могут протоколироваться с или без предупреждения; неудачные операторы не протоколируются, но генерируют ошибки в журнале. Это показано в следующей таблице решений. Столбцы Тип, binlog_format, SLC и RLC описывают условия, а столбцы Ошибка / Предупреждение и Протоколировано как представляют соответствующие действия. SLC обозначает “способный к протоколированию операторов”, а RLC обозначает “способный к протоколированию на основе строк”.

END_OF_DOCUMENT_MARKER
Тип binlog_format SLC RLC Ошибка / Предупреждение Записано как
* * Нет Нет Ошибка: Невозможно выполнить оператор: Двоичная регистрация недоступна, поскольку по крайней мере один движок одновременно не поддерживает строковую и операторную запись. -
Безопасный STATEMENT Да Нет - STATEMENT
Безопасный MIXED Да Нет - STATEMENT
Безопасный ROW Да Нет Ошибка: Невозможно выполнить оператор: Двоичная регистрация недоступна, поскольку BINLOG_FORMAT = ROW и по крайней мере одна таблица использует движок хранения, не поддерживающий строковую регистрацию. -
Небезопасный STATEMENT Да Нет Предупреждение: Небезопасный оператор записан в формате оператора, поскольку BINLOG_FORMAT = STATEMENT STATEMENT
Небезопасный MIXED Да Нет Ошибка: Невозможно выполнить оператор: Двоичная регистрация небезопасного оператора невозможна, когда движок хранения ограничен операторной регистрацией, даже если BINLOG_FORMAT = MIXED. -
Небезопасный ROW Да Нет Ошибка: Невозможно выполнить оператор: Двоичная регистрация невозможна, поскольку BINLOG_FORMAT = ROW и по крайней мере одна таблица использует движок хранения, не поддерживающий строковую регистрацию. -
Строковая инъекция STATEMENT Да Нет Ошибка: Невозможно выполнить строковую инъекцию: Двоичная регистрация невозможна, поскольку по крайней мере одна таблица использует движок хранения, не поддерживающий строковую регистрацию. -
Строковая инъекция MIXED Да Нет Ошибка: Невозможно выполнить строковую инъекцию: Двоичная регистрация невозможна, поскольку по крайней мере одна таблица использует движок хранения, не поддерживающий строковую регистрацию. -
Строковая инъекция ROW Да Нет Ошибка: Невозможно выполнить строковую инъекцию: Двоичная регистрация невозможна, поскольку по крайней мере одна таблица использует движок хранения, не поддерживающий строковую регистрацию. -
Безопасный STATEMENT Нет Да Ошибка: Невозможно выполнить оператор: Двоичная регистрация невозможна, поскольку BINLOG_FORMAT = STATEMENT и по крайней мере одна таблица использует движок хранения, не поддерживающий операторную регистрацию. -
Безопасный MIXED Нет Да - ROW
Безопасный ROW Нет Да - ROW
Небезопасный STATEMENT Нет Да Ошибка: Невозможно выполнить оператор: Двоичная регистрация невозможна, поскольку BINLOG_FORMAT = STATEMENT и по крайней мере одна таблица использует движок хранения, не поддерживающий операторную регистрацию. -
Небезопасный MIXED Нет Да - ROW
Небезопасный ROW Нет Да - ROW
Строковая инъекция STATEMENT Нет Да Ошибка: Невозможно выполнить строковую инъекцию: Двоичная регистрация невозможна, поскольку BINLOG_FORMAT = STATEMENT. -
Строковая инъекция MIXED Нет Да - ROW
Строковая инъекция ROW Нет Да - ROW
Безопасный STATEMENT Да Да - STATEMENT
Безопасный MIXED Да Да - STATEMENT
Безопасный ROW Да Да - ROW
Небезопасный STATEMENT Да Да Предупреждение: Небезопасный оператор записан в формате оператора поскольку BINLOG_FORMAT = STATEMENT. STATEMENT
Небезопасный MIXED Да Да - ROW
Небезопасный ROW Да Да - ROW
Строковая инъекция STATEMENT Да Да Ошибка: Невозможно выполнить строковую инъекцию: Двоичная регистрация невозможна, потому что BINLOG_FORMAT = STATEMENT. -
Строковая инъекция MIXED Да Да - ROW
Строковая инъекция ROW Да Да - ROW

При возникновении предупреждения генерируется стандартное предупреждение MySQL (доступно с помощью SHOW WARNINGS). Информация также записывается в журнал ошибок mysqld. В журнал записывается только одна ошибка за каждый случай ошибки на соединение клиента, чтобы предотвратить переполнение журнала. Сообщение журнала включает в себя SQL-оператор, который был выполнен.

Если у реплики установлено значение log_error_verbosity для отображения предупреждений, реплика записывает сообщения в журнал ошибок, предоставляющие информацию о её состоянии, например, координаты двоичного журнала и журнала пересылок, с которых начинается работа, при переключении на другой журнал пересылок, при повторном подключении после отключения, операторы, которые небезопасны для операторной регистрации, и так далее.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/binary-log-mixed.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API