ストアドルーチンとトリガのバイナリログ

バイナリログには、データベースの中身を修正するSQLステートメントに関する情報が含まれていす。この情報は改良を説明する「イベント」の形で記憶されます。バイナリログは2つの重要な目的を持っています。

このセクションで、MySQL 5.1がストアドルーチン(プロシージャとファンクション)およびトリガの為のバイナリログを取り扱う方法について説明します。ここで、その実装がストアドルーチンの使用上に置かれる現在の条件も説明し、これらの条件が必要とされる理由に関する追加情報を提供します。

一般に、ここで述べた問題はバイナリログがSQLステートメントレベルにおいて起こる時生じます。ユーザが行をベースとするバイナリログを使用する場合、ログには、SQLステートメントを実行した結果として個別の行に施した変更が含まれます。行をベースとするログに関する一般情報については、 項 「レプリケーション フォーマット」 を参照してください。

行をベースとするログを使用する時、ストアドルーチンとトリガの定義がステートメントとして複製されます。ルーチンやトリガを実行する時、行に施した変更は登録されますが、これらを実行するステートメントは登録されません。ストアドプロシージャに対して、これはCALLステートメントは登録されないことを意味します。保存されたファンクションに対して、ファンクション内で行に施した変更は登録されますが、ファンクション起動は登録されません。トリガの場合、トリガが行に対して行った変更は登録されます。スレーブ側では、行の変更のみ現れ、ルーチンまたはトリガ起動は現れません。

特に注記しない限り、ここに示した備考はユーザが既に--log-binオプションを使ってサーバを立ち上げることによって、バイナリログを有効化しているものと見なします。(項 「バイナリ ログ」を参照してください。)バイナリログが有効化されていない場合、複製は不可能なばかりでなく、データリカバリ用に、バイナリログも利用できません。

MySQL5.1は以下の通り総括することができます:これらの条件はストアドプロシージャには適用されず、これらはバイナリログが有効化されない限り、適用されません。

トリガは保存されたファンクションと同等であるため、ファンクションに関する前の備考は、以下の場合を除き、トリガには適用されません。CREATE TRIGGERには、オプションの DETERMINISTIC 特徴は含まれていないので、トリガは常に決定論的であると見なします。しかし、この仮定は場合によっては無効です。例えば、UUID()機能は非決定論的です(複製されません)。このような機能のトリガ中での使用に関して、注意すべきです。

CREATE TRIGGERトリガはテーブルを更新することができるので、ユーザがTRIGGER権限(MySQL 5.1.6より前の版ではSUPER)を持っておらず、 log_bin_trust_function_creators が0でる場合、保存されたファンクションに起こるこれらと同等なエラーメッセージが発生します。(スレーブ側では、スレーブはトリガDEFINER属性を使って、どのユーザがトリガ生成者であるか査定します。)

以下のディスカッションで、ログの実装とその意味に関する追加詳細を提供します。このディスカッションは最初のアイテムを除き、ステートメントをベースとするログだけを対象とし、行をベースとするログには適用されません。CREATEステートメントおよびDROPステートメントはログモードと関係なく、ステートメントとして登録されます。