Spec-Zone.ru › MySQL 5.7

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

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

  • При выполнении оператора DML, обновляющего таблицу NDBCLUSTER.

  • Если функция содержит UUID().

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

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

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

  • При вовлечении вызова загружаемой функции.

  • Если оператор записывается на основе строки, и сессия, выполнившая оператор, имеет временные таблицы, протоколирование на основе строки используется для всех последующих операторов (кроме тех, которые обращаются к временным таблицам), пока все временные таблицы, используемые этой сессией, не будут удалены.

    Это верно независимо от того, были ли фактически записаны временные таблицы.

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

  • При использовании FOUND_ROWS() или ROW_COUNT().

  • При использовании USER(), CURRENT_USER() или CURRENT_USER.

  • При использовании одной или нескольких системных переменных.

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

    • 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

    Сведения о определении области действия системной переменной см. в Разделе 5.1.8, «Использование системных переменных».

    Сведения о том, как репликация обрабатывает sql_mode, см. в Разделе 16.4.1.37, «Репликация и переменные».

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

  • При использовании функции LOAD_FILE().

Примечание

Генерируется предупреждение, если вы пытаетесь выполнить оператор с протоколированием на основе операторов, который должен быть записан с протоколированием на основе строк. Предупреждение отображается как в клиенте (в выводе 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 равно 2 или больше на реплике, реплика печатает сообщения в журнал ошибок, чтобы предоставить информацию о своем состоянии, такие как координаты двоичного журнала и журнала пересылки, где она начинает свою работу, когда переключается на другой журнал пересылки, когда подключается снова после разъединения, операторы, небезопасные для протоколирования по операторам, и так далее.

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

Spec-Zone.ru

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