19.2.1.3 Определение безопасных и небезопасных операторов в двоичном журналировании
«Безопасность» оператора в MySQL Replication относится к возможности правильной репликации оператора и его эффектов с использованием формата на основе операторов. Если это верно для оператора, мы называем его безопасным; в противном случае — небезопасным.
В общем случае, оператор считается безопасным, если он детерминированный, и небезопасным, если нет. Однако некоторые недетерминированные функции не считаются небезопасными (см. Недетерминированные функции, не считающиеся небезопасными в этом разделе). Кроме того, операторы, использующие результаты от функций с плавающей точкой, зависящих от аппаратного обеспечения, всегда считаются небезопасными (см. Раздел 19.5.1.12, «Репликация и значения с плавающей точкой»).
Обработка безопасных и небезопасных операторов. Оператор обрабатывается по-разному в зависимости от того, считается ли он безопасным и в отношении формата двоичного журналирования (то есть текущего значения binlog_format).
При использовании журналирования на основе строк нет различия в обработке безопасных и небезопасных операторов.
При использовании смешанного формата журналирования операторы, помеченные как небезопасные, записываются в журнале в формате на основе строк; операторы, считающиеся безопасными, записываются в формате на основе операторов.
При использовании журналирования на основе операторов операторы, помеченные как небезопасные, генерируют предупреждение об этом. Безопасные операторы записываются в журнал обычно.
Каждый оператор, помеченный как небезопасный, генерирует предупреждение. Если большое количество таких операторов было выполнено на источнике, это может привести к чрезмерно большим файлам журнала ошибок. Чтобы предотвратить это, MySQL имеет механизм подавления предупреждений. Всякий раз, когда 50 последних предупреждений были сгенерированы более 50 раз в течение любого 50-секундного периода, подавление предупреждений включается. При активации это приводит к тому, что такие предупреждения не записываются в журнал ошибок; вместо этого для каждых 50 предупреждений этого типа в журнал ошибок записывается заметка The
last warning was repeated . Это продолжается до тех пор, пока 50 последних таких предупреждений не были выпущены в течение 50 секунд или меньше; как только скорость снизится ниже этого порога, предупреждения снова записываются в журнал обычно. Подавление предупреждений не влияет на то, как определяется безопасность операторов для журналирования на основе операторов, а также на то, как предупреждения отправляются клиенту. Клиенты MySQL по-прежнему получают одно предупреждение для каждого такого оператора.N times in
last S seconds
Для получения дополнительной информации, см. Раздел 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=STATEMENTLOAD 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.