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, «Репликация и системные функции».
Ссылаясь на системные переменные. Большинство системных переменных не реплицируются корректно с помощью формата, основанного на операторах. См. Раздел 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=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, «Функции и проблемы репликации».
© 2025 Oracle
Licensed under the GPLv2 License.