MySQL 8.0 リファレンスマニュアル


17.5.1.16 呼び出される機能のレプリケーション

ユーザー定義関数 (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 の場合:

  • 機能実装は、ソースに障害が発生した場合にイベント処理を失うことなくレプリカをソースとして使用できるように、更新可能な状態のレプリカに存在します。

(ソースとして機能していた) 別のサーバーで作成されたスケジュール済イベントが 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 ENABLE を使用して各イベントを有効にする必要があります。ここで、event_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;

関連キーワード:  ソース, ステートメント, EVENT, イベント, EVENTS, 機能, サーバー, ベース, テーブル, SCHEMA