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.-
При использовании одной или нескольких системных переменных.
Исключение. Следующие системные переменные, когда используются в рамках области действия сессии (только), не вызывают переключения формата протоколирования:
Сведения о определении области действия системной переменной см. в Разделе 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.