Spec-Zone.ru › MySQL 5.7

16.4.1.16 Репликация вызываемых функций

Репликация вызываемых функций, таких как загружаемые функции и хранимые программы (хранимые процедуры и функции, триггеры и события), обладает следующими характеристиками:

  • Эффекты функции всегда реплицируются.

  • Следующие операторы реплицируются с помощью репликации на основе операторов:

    • CREATE EVENT

    • ALTER EVENT

    • DROP EVENT

    • CREATE PROCEDURE

    • DROP PROCEDURE

    • CREATE FUNCTION

    • DROP FUNCTION

    • CREATE TRIGGER

    • DROP TRIGGER

    Однако, эффекты функций, созданных, изменённых или удалённых с помощью этих операторов, реплицируются с использованием репликации на основе строк.

    Примечание

    Попытка репликации вызываемых функций с помощью репликации на основе операторов приводит к предупреждению Оператор не безопасен для протоколирования в формате оператора. Например, попытка репликации загружаемой функции с помощью репликации на основе операторов генерирует это предупреждение, поскольку MySQL-сервер в настоящее время не может определить, является ли функция детерминированной. Если вы абсолютно уверены, что эффекты вызываемой функции являются детерминированными, вы можете безопасно проигнорировать такие предупреждения.

  • В случае CREATE EVENT и ALTER EVENT:

    • Статус события устанавливается в SLAVESIDE_DISABLED на реплике независимо от указанного состояния (это не относится к DROP EVENT).

    • Источник, на котором было создано событие, определяется на реплике по его идентификатору сервера. Столбец ORIGINATOR в таблице Информационной схемы EVENTS и столбец originator в mysql.event хранят эту информацию. См. Раздел 24.3.8, «Таблица INFORMATION_SCHEMA EVENTS» и Раздел 13.7.5.18, «Оператор SHOW EVENTS» для получения дополнительной информации.

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

Чтобы определить, есть ли запланированные события на MySQL-сервере, которые были созданы на другом сервере (выступавшем в роли сервера источника репликации), запросите таблицу Информационной схемы EVENTS аналогичным образом:

SELECT EVENT_SCHEMA, EVENT_NAME
    FROM INFORMATION_SCHEMA.EVENTS
    WHERE STATUS = 'SLAVESIDE_DISABLED';

В качестве альтернативы можно использовать оператор SHOW EVENTS, например:

SHOW EVENTS
    WHERE STATUS = 'SLAVESIDE_DISABLED';

При повышении статуса реплики с такими событиями до сервера источника репликации необходимо включить каждое событие, используя ALTER EVENT event_name ENABLE, где event_name - имя события.

Если в создании событий на этой реплике участвовало более одного источника, и вы хотите определить события, созданные только на заданном источнике с идентификатором сервера source_id, измените предыдущий запрос к таблице EVENTS , включив столбец ORIGINATOR, как показано здесь:

SELECT EVENT_SCHEMA, EVENT_NAME, ORIGINATOR
    FROM INFORMATION_SCHEMA.EVENTS
    WHERE STATUS = 'SLAVESIDE_DISABLED'
    AND   ORIGINATOR = 'source_id'

Аналогичным образом, вы можете использовать ORIGINATOR с оператором SHOW EVENTS:

SHOW EVENTS
    WHERE STATUS = 'SLAVESIDE_DISABLED'
    AND   ORIGINATOR = 'source_id'

Перед включением событий, которые были реплицированы из источника, необходимо отключить планировщик событий MySQL на реплике (используя оператор, подобный SET GLOBAL event_scheduler = OFF;), выполнить все необходимые операторы ALTER EVENT, перезапустить сервер, а затем снова включить планировщик событий на реплике (используя оператор, подобный SET GLOBAL event_scheduler = ON;).

Если вы позже понизите новый источник обратно до реплики, вам необходимо вручную отключить все события, включенные операторами ALTER EVENT. Вы можете сделать это, сохранив в отдельной таблице имена событий из оператора SELECT, показанного ранее, или используя операторы ALTER EVENT для переименования событий с общим префиксом, например, replicated_, чтобы идентифицировать их.

Если вы переименовали события, то при понижении этого сервера обратно до реплики вы можете идентифицировать события, запросив таблицу EVENTS, как показано здесь:

SELECT CONCAT(EVENT_SCHEMA, '.', EVENT_NAME) AS 'Db.Event'
      FROM INFORMATION_SCHEMA.EVENTS
      WHERE INSTR(EVENT_NAME, 'replicated_') = 1;

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

Spec-Zone.ru

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