ユーザー定義関数 (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
ENABLEDevent_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;