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.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.