デフォルトのレプリケーション フォーマットは、使用している MySQL のバージョンによって異なります。
MySQL 5.1.11 以前の場合は、ステートメント ベース レプリケーションがデフォルトです。
MySQL 5.1.12 以降の場合は、ミックス ベース レプリケーションがデフォルトです。
--binlog-format=
オプションにフォーマットを指定すると、デフォルトのレプリケーション
フォーマットを強制できます。その場合、サーバに接続しているすべてのレプリケーション
スレーブは、そのセッティングに従ってイベントを読み込みます。サポートされているオプションは次の通りです。
type
ROW
— は行ベース
レプリケーションをデフォルトに設定。
STATEMENT
—
はステートメント ベース
レプリケーションをデフォルトに設定。
MySQL 5.1.11 以前のフォーマット。
MIXED
— はミックス ベース
レプリケーションをデフォルトに設定。
MySQL 5.1.12 以降のフォーマット。
ロギング
フォーマットはランタイムでも変更できます。すべてのクライアントに対して、グローバル
フォーマットを指定するには、binlog_format
システム変数のグローバル値を設定します。グローバル変数を変更するには、SUPER
権限が必要です。
ステートメント ベース フォーマットに切り替えるには、次のステートメントのどれかを使用します。
mysql>SET GLOBAL binlog_format = 'STATEMENT';
mysql>SET GLOBAL binlog_format = 1;
行ベース フォーマットに切り替えるには、次のステートメントのどれかを使用します。
mysql>SET GLOBAL binlog_format = 'ROW';
mysql>SET GLOBAL binlog_format = 2;
ミックス ベース フォーマットに切り替えるには、次のステートメントのどれかを使用します。
mysql>SET GLOBAL binlog_format = 'MIXED';
mysql>SET GLOBAL binlog_format = 3;
それぞれのクライアントは、それぞれのステートメントのロギング
フォーマットをコントロールできます。それには、binlog_format
のセッション値を設定します。次はその例です。
mysql>SET SESSION binlog_format = 'STATEMENT';
mysql>SET SESSION binlog_format = 'ROW';
mysql>SET SESSION binlog_format = 'MIXED';
ロギング
フォーマットの手動による切り替えのほかに、スレーブ
サーバが 自動的に
そのフォーマットを変更する場合もあります。これは、サーバが
STATEMENT
または MIXED
のフォーマットのどちらかで実行てているときに生じ、ROW
ロギング フォーマットでバイナリ
ログの書き込みをしている行と衝突します。この場合、スレーブは一時的にそのイベントに合わせて行ベース レプリケーションに移行し、その後は元のフォーマットに戻ります。
接続毎でのレプリケーション ロギングの設定には、2 つの検討事項があります。
データベースに多少の変更を加えるスレッドには、行ベース
ロギングが妥当である。WHERE
節に一致するアップデートを行うスレッドには、数の多い行をログするよりもステートメントでの方が効率的であるためステートメント
ベース ロギングが妥当である。
マスタにおいて多くの実行を必要とするステートメントがあり、それによる修正行が少ない場合、それらを行ベース ロギングで複製する方が有益である。
ランタイムでレプリケーション フォーマットを切り替えることができない場合があります。
格納関数またはトリガ内からの場合
NDB
が有効な場合
セッションが行ベース レプリケーション モードであり、一時テーブルを開いている場合
これらのケースでフォーマットを変更すると、エラーになります。
一時テーブル
が存在する場合に、ランタイムでのレプリケーション
フォーマットの切り替えることはしないでください。ステートメント
ベース
レプリケーションを使用しているときにだけ一時テーブルはログでき、行ベース
レプリケーションの場合にはログできません。ミックス
レプリケーションの場合は、一時テーブルはログできますが、ユーザ定義関数
(UDF) および UUID()
関数を使用している場合はこの限りではありません。
ROW
にセットした binlog
フォーマットでは、行ベースのフォーマットを使用してバイナリ
ログに多くの変更が書き込まれます。しかし、変更の一部はステートメント
ベース
フォーマットである場合があります。たとえば、CREATE
TABLE
、ALTER TABLE
、DROP
TABLE
など DLL (データ定義言語)
ステートメントを含む場合がこれに該当します。
--binlog-row-event-max-size
オプションは行ベース
レプリケーションができるサーバで使用できます。行はオプション値を越えないバイト
サイズを一塊としてバイナリ
ログに格納されます。この値は 256
の倍数です。デフォルト値は 1024 です。
データ修正が non-deterministic であるようにステートメントがデザインされていた場合、行ベース レプリケーション を使用するとき、マスタとスレーブにあるデータをそれぞれ異なるものにすることができます。つまり、クエリ オプティマイザの意向次第ということです。レプリケーション以外の目的で、これを行うこは一般的ではありません。詳細は、項B.1.8.1. 「Open Issues in MySQL」 を参照してください。