Spec-Zone.ru › MySQL 8.4

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.39 «Репликация и переменные».

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

Примечание

Генерируется предупреждение, если вы попытаетесь выполнить оператор с протоколированием на основе операторов, который должен быть записан с использованием протоколирования на основе строк. Предупреждение отображается как в клиенте (в выводе 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-8.4-en/binary-log-mixed.html

Spec-Zone.ru

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