Spec-Zone.ru › MySQL 9.2

19.2.1.3 Определение безопасных и небезопасных операторов в двоичном журналировании

«Безопасность» оператора в MySQL Replication относится к возможности правильной репликации оператора и его эффектов с использованием формата на основе операторов. Если это верно для оператора, мы называем его безопасным; в противном случае — небезопасным.

В общем случае, оператор считается безопасным, если он детерминированный, и небезопасным, если нет. Однако некоторые недетерминированные функции не считаются небезопасными (см. Недетерминированные функции, не считающиеся небезопасными в этом разделе). Кроме того, операторы, использующие результаты от функций с плавающей точкой, зависящих от аппаратного обеспечения, всегда считаются небезопасными (см. Раздел 19.5.1.12, «Репликация и значения с плавающей точкой»).

Обработка безопасных и небезопасных операторов. Оператор обрабатывается по-разному в зависимости от того, считается ли он безопасным и в отношении формата двоичного журналирования (то есть текущего значения binlog_format).

  • При использовании журналирования на основе строк нет различия в обработке безопасных и небезопасных операторов.

  • При использовании смешанного формата журналирования операторы, помеченные как небезопасные, записываются в журнале в формате на основе строк; операторы, считающиеся безопасными, записываются в формате на основе операторов.

  • При использовании журналирования на основе операторов операторы, помеченные как небезопасные, генерируют предупреждение об этом. Безопасные операторы записываются в журнал обычно.

Каждый оператор, помеченный как небезопасный, генерирует предупреждение. Если большое количество таких операторов было выполнено на источнике, это может привести к чрезмерно большим файлам журнала ошибок. Чтобы предотвратить это, MySQL имеет механизм подавления предупреждений. Всякий раз, когда 50 последних предупреждений были сгенерированы более 50 раз в течение любого 50-секундного периода, подавление предупреждений включается. При активации это приводит к тому, что такие предупреждения не записываются в журнал ошибок; вместо этого для каждых 50 предупреждений этого типа в журнал ошибок записывается заметка The last warning was repeated N times in last S seconds. Это продолжается до тех пор, пока 50 последних таких предупреждений не были выпущены в течение 50 секунд или меньше; как только скорость снизится ниже этого порога, предупреждения снова записываются в журнал обычно. Подавление предупреждений не влияет на то, как определяется безопасность операторов для журналирования на основе операторов, а также на то, как предупреждения отправляются клиенту. Клиенты MySQL по-прежнему получают одно предупреждение для каждого такого оператора.

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

Операторы, считающиеся небезопасными. Операторы со следующими характеристиками считаются небезопасными:

  • Заявления, содержащие системные функции, которые могут возвращать разное значение на реплике. К этим функциям относятся FOUND_ROWS(), GET_LOCK(), IS_FREE_LOCK(), IS_USED_LOCK(), LOAD_FILE(), RAND(), RELEASE_LOCK(), ROW_COUNT(), SESSION_USER(), SLEEP(), SOURCE_POS_WAIT(), SYSDATE(), SYSTEM_USER(), USER(), UUID() и UUID_SHORT().

    Недетерминированные функции, не считающиеся небезопасными. Хотя эти функции не являются детерминированными, они считаются безопасными для целей ведения журнала и репликации: CONNECTION_ID(), CURDATE(), CURRENT_DATE(), CURRENT_TIME(), CURRENT_TIMESTAMP(), CURTIME(), LAST_INSERT_ID(), LOCALTIME(), LOCALTIMESTAMP(), NOW(), UNIX_TIMESTAMP(), UTC_DATE(), UTC_TIME() и UTC_TIMESTAMP().

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

  • Ссылаясь на системные переменные. Большинство системных переменных не реплицируются корректно с помощью формата, основанного на операторах. См. Раздел 19.5.1.40, «Репликация и переменные». Исключение см. в Разделе 7.4.4.3, «Смешанный формат двоичного протокола ведения журнала».

  • Загружаемые функции. Поскольку у нас нет контроля над тем, что делает загружаемая функция, мы должны предположить, что она выполняет небезопасные операторы.

  • Плагин fulltext. Этот плагин может вести себя по-разному на разных серверах MySQL; поэтому операторы, зависящие от него, могут иметь разные результаты. По этой причине все операторы, использующие плагин fulltext, считаются небезопасными в MySQL.

  • Триггер или хранимая процедура обновляет таблицу с столбцом AUTO_INCREMENT. Это небезопасно, так как порядок обновления строк может отличаться на источнике и реплике.

    Кроме того, INSERT в таблицу, имеющую составной первичный ключ, содержащий столбец AUTO_INCREMENT, который не является первым столбцом этого составного ключа, небезопасен.

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

  • Операторы INSERT ... ON DUPLICATE KEY UPDATE для таблиц с несколькими первичными или уникальными ключами. При выполнении на таблице, содержащей более одного первичного или уникального ключа, этот оператор считается небезопасным, поскольку зависит от порядка, в котором движок хранения проверяет ключи (он не детерминирован), и от выбора строк, обновленных сервером MySQL.

    Оператор INSERT ... ON DUPLICATE KEY UPDATE для таблицы с более чем одним уникальным или первичным ключом считается небезопасным для репликации на основе операторов. (Ошибка #11765650, Ошибка #58637)

  • Обновления с использованием LIMIT. Порядок извлечения строк не задан и поэтому считается небезопасным. См. Раздел 19.5.1.19, «Репликация и LIMIT».

  • Доступ или ссылки на таблицы журналов. Содержимое системной таблицы журнала может отличаться между источником и репликой.

  • Нетранзакционные операции после транзакционных операций. В пределах транзакции любая нетранзакционная операция чтения или записи, выполняемая после любой транзакционной операции чтения или записи, считается небезопасной.

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

  • Доступ или ссылки на самозаписывающие таблицы. Все операции чтения и записи в самозаписывающие таблицы считаются небезопасными. В пределах транзакции любой оператор, следующий за операцией чтения или записи в самозаписывающие таблицы, также считается небезопасным.

  • Операторы LOAD DATA. LOAD DATA считается небезопасным, когда binlog_format=MIXED оператор записывается в формате на основе строк. Когда binlog_format=STATEMENT LOAD DATA не генерирует предупреждение, в отличие от других небезопасных операторов.

  • XA-транзакции. Если две XA-транзакции, завершенные параллельно на источнике, готовятся на реплике в обратном порядке, могут возникнуть зависимости блокировки при репликации на основе операторов, которые нельзя безопасно разрешить, и репликация может завершиться тупиком на реплике. Когда binlog_format=STATEMENT установлено, операторы DML в XA-транзакциях отмечаются как небезопасные и генерируют предупреждение. Когда binlog_format=MIXED или binlog_format=ROW установлены, операторы DML внутри XA-транзакций регистрируются с помощью репликации на основе строк, и потенциальная проблема отсутствует.

  • DEFAULT-оператор, ссылающийся на недетерминированную функцию. Если значение по умолчанию выражения ссылается на недетерминированную функцию, любой оператор, вызывающий оценку выражения, небезопасен для репликации на основе операторов. Это включает операторы, такие как INSERT, UPDATE и ALTER TABLE. В отличие от большинства других небезопасных операторов, этот тип операторов не может быть безопасно реплицирован в формате на основе строк. При установке binlog_format в значение STATEMENT оператор регистрируется и выполняется, но сообщение об ошибке записывается в журнал ошибок. При установке binlog_format в значение MIXED или ROW оператор не выполняется, и сообщение об ошибке записывается в журнал ошибок. Дополнительную информацию об обработке явных значений по умолчанию см. в Разделе «Обработка явных значений по умолчанию».

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

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/replication-rbr-safe-unsafe.html

Spec-Zone.ru

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