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 | +-----------------+-------------+---------------------------+----------------------------+
まとめ
スレーブにおいて設定できるレプリケーションフィルターを紹介しました。今回は説明はしませんでしたが、