マスタースレーブ構成でデータベースを賢くレプリケート!「binlog-do-db」と「replicate-do-db」を使いこなす

2024-04-02

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

この設定の場合、マスターサーバーでは db1db2 の変更のみがバイナリログに記録されます。

replicate-do-db

  • マスターサーバーから送信されたバイナリログから、指定されたデータベースの変更のみを適用します。
  • 他のデータベースの変更は無視されます。
-- スレーブサーバーの設定
replicate-do-db = db1,db2

この設定の場合、スレーブサーバーではマスターサーバーから送信されたバイナリログから、db1db2 の変更のみが適用されます。

使用例

  • 特定のデータベースのみをレプリケートしたい場合
  • テスト環境や開発環境で本番環境のデータの一部のみをレプリケートしたい場合
  • レプリケーションの負荷を軽減したい場合

注意事項

  • binlog-do-dbreplicate-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-tablereplicate-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


もう「ファイルサイズが大きすぎる」エラーに悩まない!phpMyAdminでのデータベースインポートを成功させる秘訣

phpMyAdmin でデータベースをインポートしようとすると、「ファイルサイズが大きすぎる」というエラーメッセージが表示されることがあります。このエラーは、インポートしようとしているファイルが、phpMyAdmin や MySQL サーバーで設定されている最大アップロードサイズを超えていることを意味します。...


MySQLトリガー | 複数のイベント処理 | 詳細解説とサンプルコード

MySQL、MariaDBなどのデータベースでは、トリガーを使用して、特定の操作が発生したときに自動的にアクションを実行することができます。トリガーは、INSERT、UPDATE、DELETEなどの操作をトリガーとして実行できます。また、BEFORE、AFTER、INSTEAD OFなどのタイミングを指定して、アクションを実行するタイミングを制御することもできます。...


MySQL/MariaDB でストアドプロシージャとユーザー定義関数を使ってフロー結果を累積する

この方法は、サブクエリを使用して、前のレコードの累積値を取得し、現在のレコードに足すことで累積値を計算します。このクエリは、transactions テーブルのすべてのレコードを id 順に処理し、各レコードの transaction_amount と、そのレコードまでの累積 transaction_amount を計算します。...


【Mariadb】SQLでテーブル内のすべてのレコードをカウントする方法とは?ゼロカウントも網羅!

このチュートリアルでは、SELECT クエリを使用して、テーブル内のすべてのレコードをカウントする方法と、ゼロを含むカウントを表示する方法について説明します。例customers テーブルがあると仮定します。このテーブルには、顧客 ID、名前、およびメール アドレスに関する情報が含まれています。次のクエリは、テーブル内のすべてのレコードをカウントします。...


MariaDBデータベースにおける「SHOW PACKAGE STATUS」クエリ:詳細解説と「Couldn't execute 'SHOW PACKAGE STATUS WHERE Db='db_name'」エラーのトラブルシューティング

エラー発生状況このエラーは、MariaDBデータベースを操作する際に、SHOW PACKAGE STATUS クエリを実行しようとしたときに発生します。これは、データベースのパッケージ情報を取得するためのクエリです。エラー原因このエラーが発生する主な原因は2つあります。...