19.5.1.16 Репликация вызываемых функций
Репликация вызываемых функций, таких как загружаемые функции и хранимые программы (хранимые процедуры и функции, триггеры и события), обладает следующими характеристиками:
Эффекты функции всегда реплицируются.
-
Следующие операторы реплицируются с помощью репликации на основе операторов:
Однако, эффекты функций, созданных, измененных или удаленных с помощью этих операторов, реплицируются с помощью репликации на основе строк.
ПримечаниеПопытка репликации вызываемых функций с помощью репликации на основе операторов приводит к предупреждению Оператор не безопасен для протоколирования в формате оператора. Например, при попытке репликации загружаемой функции с помощью репликации на основе операторов генерируется это предупреждение, так как в настоящее время MySQL-сервер не может определить, является ли функция детерминированной. Если вы абсолютно уверены, что эффекты вызываемой функции детерминированы, вы можете безопасно проигнорировать такие предупреждения.
-
В случае
CREATE EVENTиALTER EVENT:Состояние события устанавливается в
REPLICA_SIDE_DISABLEDна реплике независимо от указанного состояния (это не относится кDROP EVENT).Источник, на котором было создано событие, идентифицируется на реплике по его идентификатору сервера. Столбец
ORIGINATORвINFORMATION_SCHEMA.EVENTSхранит эту информацию. Дополнительную информацию см. в разделе разделе 15.7.7.19, «Оператор 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.