16.4.1.16 Репликация вызываемых функций
Репликация вызываемых функций, таких как загружаемые функции и хранимые программы (хранимые процедуры и функции, триггеры и события), обладает следующими характеристиками:
Эффекты функции всегда реплицируются.
-
Следующие операторы реплицируются с помощью репликации на основе операторов:
Однако, эффекты функций, созданных, изменённых или удалённых с помощью этих операторов, реплицируются с использованием репликации на основе строк.
ПримечаниеПопытка репликации вызываемых функций с помощью репликации на основе операторов приводит к предупреждению Оператор не безопасен для протоколирования в формате оператора. Например, попытка репликации загружаемой функции с помощью репликации на основе операторов генерирует это предупреждение, поскольку 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 ENABLEevent_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.