Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.1Mb
HTML Download (Zip) - 7.2Mb


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

ユーザー定義関数 (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 カラムおよび mysql.event 内の originator カラムにこの情報が格納されます。詳しくは、セクション21.7「INFORMATION_SCHEMA EVENTS テーブル」およびセクション13.7.5.19「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 ENABLED を使用して各イベントを有効にする必要があります。ここで、event_name はイベントの名前です。

複数のマスターがこのスレーブ上でイベントを作成することに使用され、サーバー ID master_id を持つマスター上で作成されたイベントのみを識別したい場合は、ここで示すように、EVENTS テーブルに対する先ほどのクエリーを変更して ORIGINATOR カラムを追加してください。

SELECT EVENT_SCHEMA, EVENT_NAME, ORIGINATOR
    FROM INFORMATION_SCHEMA.EVENTS
    WHERE STATUS = 'SLAVESIDE_DISABLED'
    AND   ORIGINATOR = 'master_id'

同じような方法で SHOW EVENTS ステートメントで ORIGINATOR を使用できます。

SHOW EVENTS
    WHERE STATUS = 'SLAVESIDE_DISABLED'
    AND   ORIGINATOR = 'master_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;