MySQLのレプリケーションにはフィルター機能が古くから存在しています。特定のデータベースのみやテーブルのみ、
レプリケーションフィルターオプション
レプリケーションフィルターを設定するには、
- replicate-do-db=dbname …レプリケーションするデータベースを指定
- replicate-ignore-db=dbname …レプリケーションを除外するデータベースを指定
- replicate-do-table=dbname.
table …レプリケーションをするテーブルを指定 - replicate-ignore-table=dbname.
table …レプリケーションを除外するテーブルを指定 - replicate-rewrite-db=from_
name->to_ …from_name name のデータベースをto_name のデータベースへ書き換えてレプリケーションする - replicate-wild-do-table=dbname.
table …レプリケーションをするテーブルを%や_のワイルドカード文字を含めて指定 - replicate-wild-ignore-table=dbname.
table …レプリケーションを除外するテーブルを%や_のワイルドカード文字を含めて指定
レプリケーションタイプによる挙動の注意点
データベース単位でのフィルター
replicate-do-dbやreplicate-ignore-dbは、
SBRの場合、replicate-do-db=db1と設定されている状態で、
mysql> USE db1; mysql> UPDATE t0 SET col2=3 WHERE col1=1; mysql> UPDATE db4.t0 SET col2=3 WHERE col1=1;
mysql> USE db2; mysql> UPDATE db1.t0 SET col2=3 WHERE col1=1; mysql> UPDATE db4.t0 SET col2=3 WHERE col1=1;
SBRの場合、UPDATE db4.といった別のデータベースのテーブルへも更新もレプリケーションされてしまいます。例2においては、UPDATE db1.を含めたステートメントはレプリケーションされません。
RBRの場合、UPDATE t0 SET col2=3 WHERE col1=1;が、UPDATE db1.がレプリケーションされます。
RBRでのフィルターの方が、
テーブル単位でのフィルター
replicate-do-tableやreplicate-ignore-tableのテーブル単位でのフィルターではデータベース単位とは異なり、
replicate-do-table=db1.と設定した場合は、UPDATE t0 SET col2=3 WHERE col1=1;が、UPDATE db1.がレプリケーションされます。
データベース単位やテーブル単位のフィルターでの動作に違いがあるため、
フィルター設定方法
フィルターを設定するには、CHANGE REPLICATION FILTER コマンド を使用します。
mysql> STOP SLAVE SQL_THREAD; mysql> CHANGE REPLICATION FILTER replicate_do_db=(db1); mysql> START SLAVE SQL_THREAD;
しかしながら、CHANGE REPLICATION FILTER コマンドで設定したフィルターは、
フィルターの設定確認方法
MySQL5.SHOW SLAVE STATUSの項目から確認できます。
mysql> SHOW SLAVE STATUS\G
〈表示一部割愛〉
Replicate_Do_DB: db1
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
MySQL8.performance_のテーブルから確認することもできます。詳しくは後述します。
マルチソースレプリケーションでのフィルター
マルチソースレプリケーション環境によるレプリケーションフィルターは、
MySQL8.CHANGE REPLICATION FILTERコマンドにFOR CHANNELでチャネル名を指定することで設定できます。
mysql80> CHANGE REPLICATION FILTER replicate_do_db=(db1) FOR CHANNEL channel;
MySQL8.performance_のreplication_とreplication_テーブルが新たに追加され、
replication_テーブルapplier_ global_ filters - すべてのレプリケーションチャネルに適用されるグローバルレプリケーションフィルターに関する情報を提供します。
replication_テーブルapplier_ filters - 特定のレプリケーションチャネルに設定されているレプリケーションフィルターに関する情報を提供します。
mysql80> select * FROM replication_applier_global_filters; +-----------------+-------------+---------------------------+----------------------------+ | FILTER_NAME | FILTER_RULE | CONFIGURED_BY | ACTIVE_SINCE | +-----------------+-------------+---------------------------+----------------------------+ | REPLICATE_DO_DB | db1 | CHANGE_REPLICATION_FILTER | 2019-01-04 17:01:29.056613 | +-----------------+-------------+---------------------------+----------------------------+
まとめ
スレーブにおいて設定できるレプリケーションフィルターを紹介しました。今回は説明はしませんでしたが、