Spec-Zone.ru › MySQL 5.7

16.2.1.3 Определение безопасных и небезопасных инструкций в двоичном протоколировании

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

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

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

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

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

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

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

Более подробную информацию см. в Разделе 16.2.1, «Форматы репликации».

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

  • Заявления, содержащие системные функции, которые могут возвращать разное значение на реплике. К этим функциям относятся FOUND_ROWS(), GET_LOCK(), IS_FREE_LOCK(), IS_USED_LOCK(), LOAD_FILE(), MASTER_POS_WAIT(), PASSWORD(), RAND(), RELEASE_LOCK(), ROW_COUNT(), SESSION_USER(), SLEEP(), 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().

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Операторы 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-транзакций регистрируются с помощью репликации на основе строк, и потенциальная проблема отсутствует.

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

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

Spec-Zone.ru

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