ユーザー定義関数 (UDF) やストアドプログラム (ストアドプロシージャーと関数、トリガー、およびイベント) などの呼び出される機能のレプリケーションには、次の特徴があります。
機能の影響は常に複製されます。
-
次のステートメントはステートメントベースレプリケーションを使用して複製されます。
CREATE EVENT
ALTER EVENT
DROP EVENT
CREATE PROCEDURE
DROP PROCEDURE
CREATE FUNCTION
DROP FUNCTION
CREATE TRIGGER
DROP TRIGGER
ただし、これらのステートメントを使用して作成、変更、または削除される機能の影響は、行ベースレプリケーションを使用して複製されます。
注記呼び出される機能をステートメントベースレプリケーションを使用して複製しようとすると、警告が生成されます: Statement is not safe to log in statement format。 たとえば、ステートメントベースプリケーションで UDF を複製しようとすると、MySQL サーバーは現在 UDF が決定的かどうかを判断できないため、この警告が生成されます。 呼び出される機能の影響が決定的であることを確実にわかっている場合は、このような警告を安全に無視できます。
-
CREATE EVENT
およびALTER EVENT
の場合:イベントのステータスは、指定された状態に関係なくレプリカ上で
SLAVESIDE_DISABLED
に設定されます (これはDROP EVENT
には適用されません)。イベントが作成されたソースは、レプリカ上でそのサーバー ID によって識別されます。
INFORMATION_SCHEMA.EVENTS
のORIGINATOR
カラムには、この情報が格納されます。 詳細は、セクション26.14「INFORMATION_SCHEMA EVENTS テーブル」およびセクション13.7.7.18「SHOW EVENTS ステートメント」を参照してください。
機能実装は、ソースに障害が発生した場合にイベント処理を失うことなくレプリカをソースとして使用できるように、更新可能な状態のレプリカに存在します。
(ソースとして機能していた) 別のサーバーで作成されたスケジュール済イベントが MySQL サーバーにあるかどうかを確認するには、次に示すような方法で INFORMATION_SCHEMA.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
はイベントの名前です。
このレプリカでのイベントの作成に複数のソースが関与しており、サーバー ID source_id
を持つ特定のソースでのみ作成されたイベントを識別する場合は、次に示すように、EVENTS
テーブルで前のクエリーを変更して ORIGINATOR
カラムを含めます:
SELECT EVENT_SCHEMA, EVENT_NAME, ORIGINATOR
FROM INFORMATION_SCHEMA.EVENTS
WHERE STATUS = 'SLAVESIDE_DISABLED'
AND ORIGINATOR = 'source_id'
同じような方法で SHOW EVENTS
ステートメントで ORIGINATOR
を使用できます。
SHOW EVENTS
WHERE STATUS = 'SLAVESIDE_DISABLED'
AND ORIGINATOR = 'source_id'
ソースからレプリケートされたイベントを有効にする前に、(SET GLOBAL event_scheduler = OFF;
などのステートメントを使用して) レプリカで MySQL イベントスケジューラを無効にし、必要な 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;