マスタースレーブ構成でデータベースを賢くレプリケート!「binlog-do-db」と「replicate-do-db」を使いこなす
MySQL/MariaDBにおける「binlog-do-db」と「replicate-do-db」の違い
MySQLとMariaDBのマスタースレーブ構成において、バイナリログに基づくレプリケーションで重要な役割を果たすのが「binlog-do-db」と「replicate-do-db」というオプションです。これらのオプションは、レプリケーションに含めるデータベースを制御するために使用されます。
共通点
- 両方のオプションは、データベース名に基づいてレプリケーション対象となるデータベースを指定します。
- ワイルドカード(
%
)を使用して、複数のデータベースを指定することができます。 - オプションの指定方法は、MySQLとMariaDBで同じです。
相違点
オプション | 適用先 | 動作 |
---|---|---|
binlog-do-db | マスター | 指定されたデータベースの変更のみをバイナリログに記録します。 |
replicate-do-db | スレーブ | 指定されたデータベースの変更のみをスレーブに適用します。 |
詳細解説
binlog-do-db
- マスターサーバーでのみ設定します。
- 指定されたデータベースの変更のみをバイナリログに記録し、それ以外のデータベースの変更は記録しません。
- バイナリログは、スレーブサーバーへのデータ転送や、ポイントインタイムリカバリーに使用されます。
- 例:
-- マスターサーバーの設定
binlog-do-db = db1,db2
この設定の場合、マスターサーバーでは db1
と db2
の変更のみがバイナリログに記録されます。
replicate-do-db
- マスターサーバーから送信されたバイナリログから、指定されたデータベースの変更のみを適用します。
- 他のデータベースの変更は無視されます。
-- スレーブサーバーの設定
replicate-do-db = db1,db2
この設定の場合、スレーブサーバーではマスターサーバーから送信されたバイナリログから、db1
と db2
の変更のみが適用されます。
使用例
- 特定のデータベースのみをレプリケートしたい場合
- テスト環境や開発環境で本番環境のデータの一部のみをレプリケートしたい場合
- レプリケーションの負荷を軽減したい場合
注意事項
binlog-do-db
とreplicate-do-db
は互いに排他的です。- 両方のオプションを同時に設定すると、エラーが発生します。
- オプションの指定に誤りがあると、データの不整合が発生する可能性があります。
マスターサーバーの設定例
# マスターサーバーの設定ファイル
[mysqld]
...
# レプリケーションに含めるデータベースを指定
binlog-do-db = db1,db2
...
スレーブサーバーの設定例
# スレーブサーバーの設定ファイル
[mysqld]
...
# レプリケーションで適用するデータベースを指定
replicate-do-db = db1,db2
...
補足
- 上記のサンプルコードは、MySQL 8.0 および MariaDB 10.5 を想定しています。
- 設定ファイルの場所は、環境によって異なる場合があります。
- オプションの詳細は、上記の参考資料を参照してください。
# マスターサーバーの設定ファイル
[mysqld]
...
# レプリケーションから除外するデータベースを指定
binlog-ignore-db = excluded_db
...
# スレーブサーバーの設定ファイル
[mysqld]
...
# レプリケーションで適用しないデータベースを指定
replicate-ignore-db = excluded_db
...
# マスターサーバーの設定ファイル
[mysqld]
...
# テスト環境のすべてのデータベースをレプリケート
binlog-do-db = test_*
...
# スレーブサーバーの設定ファイル
[mysqld]
...
# テスト環境のすべてのデータベースを適用
replicate-do-db = test_*
...
- サンプルコードはあくまでも参考です。
- 環境に合わせて設定内容を調整する必要があります。
MySQL/MariaDBにおける「binlog-do-db」と「replicate-do-db」の代替方法
「binlog-do-db」と「replicate-do-db」は、データベースレベルでレプリケーションを制御する便利なオプションですが、いくつかの制限があります。
- 特定の条件に基づいてレプリケーションを制御したい場合
これらの制限を克服するために、以下の代替方法を使用することができます。
テーブルレベルフィルター
binlog-do-table
とreplicate-do-table
オプションを使用して、レプリケーションに含めるテーブルを指定できます。
# マスターサーバーの設定ファイル
[mysqld]
...
# 特定のテーブルのみをレプリケート
binlog-do-table = db1.table1,db2.table2
...
# スレーブサーバーの設定ファイル
[mysqld]
...
# 特定のテーブルのみを適用
replicate-do-table = db1.table1,db2.table2
...
レプリケーションフィルタープラグイン
# マスターサーバーの設定ファイル
[mysqld]
...
# レプリケーションフィルタープラグインを有効化
log_slave_updates = 1
binlog_format = ROW
# レプリケーションフィルタープラグインの設定
binlog-filter = mysql_replication_filter
...
# スレーブサーバーの設定ファイル
[mysqld]
...
# レプリケーションフィルタープラグインを有効化
log_slave_updates = 1
binlog_format = ROW
# レプリケーションフィルタープラグインの設定
replicate-filter = mysql_replication_filter
...
ストアドプロシージャ
DELIMITER //
CREATE PROCEDURE is_replicated(IN table_name VARCHAR(255), IN column_name VARCHAR(255))
RETURNS BOOLEAN
BEGIN
# レプリケーション対象かどうかを判断する処理
RETURN TRUE;
END //
DELIMITER ;
# UPDATE ステートメントの前にストアドプロシージャを呼び出す
UPDATE table_name
SET column_name = ...
WHERE is_replicated(table_name, column_name);
各方法の比較
方法 | 利点 | 欠点 |
---|---|---|
テーブルレベルフィルター | 設定が簡単 | 詳細な制御が難しい |
レプリケーションフィルタープラグイン | 詳細な制御が可能 | 設定が複雑 |
ストアドプロシージャ | 柔軟性が高い | 開発コストが高い |
- 上記の代替方法は、それぞれメリットとデメリットがあります。
mysql mariadb master-slave