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