19.5.1.16 Репликация вызываемых функций
Репликация вызываемых функций, таких как загружаемые функции и хранимые программы (хранимые процедуры и функции, триггеры и события), обладает следующими характеристиками:
Эффекты функции всегда реплицируются.
-
Следующие операторы реплицируются с помощью репликации на основе операторов:
Однако, эффекты функций, созданных, изменённых или удалённых с помощью этих операторов, реплицируются с помощью репликации на основе строк.
ПримечаниеПопытка репликации вызываемых функций с помощью репликации на основе операторов генерирует предупреждение Оператор не подходит для протоколирования в формате оператора. Например, попытка репликации загружаемой функции с помощью репликации на основе операторов генерирует это предупреждение, поскольку в настоящее время сервер MySQL не может определить, является ли функция детерминированной. Если вы абсолютно уверены, что эффекты вызываемой функции детерминированы, вы можете безопасно проигнорировать такие предупреждения.
-
В случае
CREATE EVENTиALTER EVENT:Состояние события устанавливается в
REPLICA_SIDE_DISABLEDна реплике независимо от указанного состояния (это не относится кDROP EVENT).Источник, на котором было создано событие, идентифицируется на реплике по его идентификатору сервера. Столбец
ORIGINATORвINFORMATION_SCHEMA.EVENTSхранит эту информацию. См. Раздел 15.7.7.20, «Оператор SHOW EVENTS», для получения дополнительной информации.
Реализация функции находится на реплике в обновляемом состоянии, поэтому если источник откажет, реплика может быть использована в качестве источника без потери обработки событий.
Чтобы определить, есть ли запланированные события на сервере MySQL, которые были созданы на другом сервере (который действовал как источник), запросите таблицу Информационной схемы EVENTS аналогичным образом:
SELECT EVENT_SCHEMA, EVENT_NAME
FROM INFORMATION_SCHEMA.EVENTS
WHERE STATUS = 'REPLICA_SIDE_DISABLED';
В качестве альтернативы можно использовать оператор SHOW
EVENTS, например:
SHOW EVENTS
WHERE STATUS = 'REPLICA_SIDE_DISABLED';
При продвижении реплики с такими событиями до источника необходимо включить каждое событие с помощью ALTER EVENT
, где event_name ENABLEevent_name — имя события.
Если в создании событий на этой реплике участвовало более одного источника, и вы хотите определить события, созданные только на определенном источнике с идентификатором сервера source_id, измените предыдущий запрос к таблице EVENTS, включив столбец ORIGINATOR, как показано ниже:
SELECT EVENT_SCHEMA, EVENT_NAME, ORIGINATOR
FROM INFORMATION_SCHEMA.EVENTS
WHERE STATUS = 'REPLICA_SIDE_DISABLED'
AND ORIGINATOR = 'source_id'
Аналогично можно использовать ORIGINATOR с оператором SHOW EVENTS:
SHOW EVENTS
WHERE STATUS = 'REPLICA_SIDE_DISABLED'
AND ORIGINATOR = 'source_id'
REPLICA_SIDE_DISABLED заменяет SLAVESIDE_DISABLED, который устарел.
Перед включением событий, реплицированных из источника, необходимо отключить планировщик событий 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.