Spec-Zone.ru › MySQL 8.4

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, “Replication and System Functions”.

  • Ссылки на системные переменные. Большинство системных переменных не реплицируются правильно в формате, основанном на операторе. См. Раздел 19.5.1.39, “Replication and Variables”. Исключения см. в Разделе 7.4.4.3, “Mixed Binary Logging Format”.

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

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

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

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

    Для получения дополнительной информации см. Раздел 19.5.1.1, “Replication and AUTO_INCREMENT”.

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

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

  • Обновления с использованием LIMIT. Порядок извлечения строк не определен и поэтому считается небезопасным. См. Раздел 19.5.1.18, “Replication and LIMIT”.

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

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

    Для получения дополнительной информации см. Раздел 19.5.1.35, “Replication and Transactions”.

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

  • Операторы 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, “Replication Features and Issues”.

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

Spec-Zone.ru

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