データベース · 2 min read · Jan 29, 2026
MariaDB 10を使用したDebian 8でのマスターデータベースのレプリケーション
データベースのレプリケーションは冗長性を生み出し、データ損失から保護し、アプリケーションのパフォーマンスを最適化することができます。このチュートリアルでは、既存のMariaDB 10.0マスターデータベースを1つ以上のスレーブにレプリケートする基本を説明します。以下の例では、ホストオペレーティングシステムはDebian 8です。
これらの手順は他のオペレーティングシステムにも適用できますが、いくつかのコマンドやデフォルトのファイルの場所が異なることに注意してください。具体的には、/etc/mysql/my.cnf、/var/lib/mysql、バイナリログファイルのデフォルト名とパス、およびmysqldの起動、停止、再起動のコマンドをシステムの仕様に応じて置き換える必要があります。
1. 接続性の確認
進む前に、マスターとスレーブがネットワーク上で互いに到達可能であり、それぞれの/etc/hostsファイルに相手のエントリがあることを確認してください。各ホストは互いにpingできる必要があり、通常のユーザーとして互いにsshできる必要があります。
2. マスターでのmysqldバイナリログの有効化
マスターホストで、バイナリログが有効になっていることを確認します。mysqldを–verbose –helpスイッチで呼び出すと、MariaDBデーモンの動作値が表示されます。rootとして:
mysqld --verbose --help | grep log-bin...
log-bin (No default value)
...エントリlog-binの値は、バイナリログファイルの命名規則を定義します。Debianでは、これらのファイルは/var/libにあります。log-binの値が(No default value)の場合、設定ファイルmy.cnfを修正してログ記録を有効にする必要があります。Debianでは、my.cnfは/etc/mysqlディレクトリにあります。
テキストエディタで/etc/mysql/my.cnfを開き、[mysqld]グループを見つけます。存在しない場合は作成し、単にlog-binと記載された行を追加します。
[mysqld]
log-binこのエントリを含めることで、mysqldが再起動されたときにバイナリログが有効になります。
log-binに値を設定することを選択できます。例えば、log-bin= filenameのように、バイナリログファイルのカスタム名を定義します。このチュートリアルでは値を設定せず、デフォルトのログファイル名が使用されます。
mysqldを再起動します:
service mysql restart変更が適用されたことを確認します:
mysqld --verbose --help | grep log-bin...
log-bin mysqld-bin
...ここに示されているように、Debianのデフォルトのバイナリログファイル名はmysqld-binで始まり、例えばmysqld-bin. nnnnnnのようになります。
3. レプリケーションユーザーへの権限付与
すべてのレプリケーションタスクを専用のレプリケーションユーザーに実行させることがベストプラクティスです。これらの例では、ユーザー名をrepluserとし、このユーザーのパスワードをreplpassに設定します。
このユーザーにグローバル権限SUPER、RELOAD、およびREPLICATION SLAVEを付与します。これにより、レプリケーションユーザーはスーパーユーザーコマンドを実行し、データベースキャッシュをフラッシュし、マスターサーバーからの更新を取得できるようになります。
データベースのrootとしてMariaDBクライアントに入ります:
mysql -u root -pMariaDBプロンプトで、次のコマンドを入力します:
GRANT SUPER, RELOAD, REPLICATION SLAVE ON *.* TO 'repluser'@'%' IDENTIFIED BY 'replpass';ここで、ホスト名のワイルドカード’ % ‘は、レプリケーションユーザーが任意のホストから接続できるようにします。
権限が付与されたことを確認します:
SHOW GRANTS FOR 'repluser'4. データベースキャッシュのフラッシュとテーブルの読み取り専用設定
データベースのスナップショットを作成する準備として、すべてのテーブルをフラッシュし、READ LOCKに設定します。これは迅速に行う必要があり、ピーク時間外またはシステムメンテナンス期間中に行うべきです。
マスターで:
FLUSH TABLES WITH READ LOCK;テーブルがロックされたので、マスターのステータスを確認します:
SHOW MASTER STATUS;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| mysqld-bin.000005 | 995 | | |
+-------------------+----------+--------------+------------------+あなたの情報は異なるでしょうが、FileとPositionの値をメモしてください。この情報はステップ7で使用します。
MariaDBクライアントを終了します:
\q5. スレーブホスト用のデータベースのスナップショット
マスターに存在するデータベースまたはデータベースのアーカイブを作成します。これらのデータベースはそれぞれ/var/lib/mysqlに独自のディレクトリを持っています。この例では、パス/var/lib/mysql/dbnameにある単一のデータベースをtarでアーカイブします。
このコマンドは単一のデータベースをアーカイブします。追加のデータベースをアーカイブする場合は、コマンドにその完全なパス名を追加します。例えば、/var/lib/mysql/dbname1 /var/lib/mysql/dbname2…
tar cjvf /home/[username]/mysql-master.tar.bz2 /var/lib/mysql/dbname次に、通常のユーザーusernameとして、このファイルをスレーブホストの通常のユーザーアカウントに転送します:
rsync -avP mysql-master.tar.bz2 [username]@slavehost:~/.または、scpを使用して:
scp mysql-master.tar.bz2 [username]@slavehost:~/.次に、スレーブホストにSSHします:
ssh [username]@slavehostrootとして、スレーブでmysqldを停止します:
service mysql stop…そしてアーカイブを抽出します:
tar xjvf /home/[username]/mysql-master.tar.bz2 -C /.6. マスターとスレーブのサーバーIDを設定
マスターの/etc/mysql/my.cnfを修正し、[mysqld]グループにserver-id= nのエントリを追加します。ここでnはサーバーを識別する一意の整数です。一般的に、n =1はマスターサーバー用ですが、nは[ 1, 2^32-1 ]の範囲内の任意の一意の整数であることができます。私たちはマスターをserver-id=1、スレーブをserver-id=100に設定します。
(スレーブにmy.cnfが存在しない場合は作成します。存在する場合は、既存のserver-idエントリを検索し、その行をコメント解除/編集します)。
マスターホストの/etc/mysql/my.cnf:
[mysqld]
server-id=1スレーブホストの/etc/mysql/my.cnf:
[mysqld]
server-id=1007. テーブルのロック解除とマスターおよびスレーブでのmysqldの開始/再起動
マスターサーバーで、データベースのrootとしてMariaDBクライアントに入り、テーブルのロックを解除します:
mysql -u root -pUNLOCK TABLES;\qマスターでmysqldを再起動します:
service mysql restartスレーブで開始します:
service mysql start新しいserver-idの値が各ホストで適用されたことを確認できます。rootとして:
mysqld --verbose --help | grep server-id8. スレーブでのマスターのアイデンティティを設定
スレーブで、マスターサーバーのアイデンティティを設定します。MariaDBクライアントに入ります:
mysql -u root -p次のコマンドを実行し、MASTER_LOG_FILEとMASTER_LOG_POSの値をステップ4で記録したバイナリログのFileとPositionに置き換え、MASTER_HOST、MASTER_USER、およびMASTER_PASSWORDの値を自分の値に置き換えます。
CHANGE MASTER TO MASTER_HOST='masterhost', MASTER_USER='repluser', MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysqld-bin.000005', MASTER_LOG_POS=995;9. スレーブをアクティブ化
スレーブで、データベースのrootとしてMariaDBクライアントに入ります:
START SLAVE;スレーブのステータスを確認できます:
SHOW SLAVE STATUS \G;************************* 1. row *************************
Slave_IO_State: Waiting for master to send event
Master_Host: masterhost
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysqld-bin.000009
Read_Master_Log_Pos: 1330
Relay_Log_File: mysqld-relay-bin.000008
Relay_Log_Pos: 1618
Relay_Master_Log_File: mysqld-bin.000009
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 1330
Relay_Log_Space: 2204
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_SSL_Crl:
Master_SSL_Crlpath:
Using_Gtid: No
Gtid_IO_Pos:レプリケーションプロセスにエラーがある場合、ここにリストされます。
10. マスターでの変更を行い、スレーブでのレプリケーションを確認
マスターで新しいデータベースを作成し、スレーブでの変更を確認することで、レプリケーションが行われていることを確認できます。
mysql -u root -p新しいデータベースを作成します:
CREATE DATABASE repltest;USE repltestテーブルを作成し、値を挿入します:
CREATE TABLE test (hello VARCHAR(10));INSERT INTO test VALUES ('world');\q次に、スレーブのMariaDBクライアントに入ります:
mysql -u root -pUSE repltestSELECT * FROM test;+-------+
| hello |
+-------+
| world |
+-------+
1 row in set (0.00 sec)11. 追加のスレーブのためにプロセスを繰り返す
このプロセスを各追加のスレーブに対して繰り返すことができます。具体的には、次の手順を実行します:
11 ( a) . マスターで、データベースのrootとしてMariaDBクライアントに入り、テーブルをフラッシュしてロックします:
FLUSH TABLES WITH READ LOCK;ロック後、マスターステータスを表示します:
**SHOW MASTER STATUS;FileとPositionの値をメモします。
11 ( b) . マスターで、rootとして:
tar cjvf /home/[username]/mysql-master.tar.bz2 /var/lib/mysql/dbname11 ( c) . マスターで、通常のユーザーとして:
rsync -avP mysql-master.tar.bz2 [username]@slavehost2:~/.11 ( d) . スレーブで、rootとして:
service mysql stoptar xjvf /home/[username]/mysql-master.tar.bz2 -C /.11 ( e) . スレーブホストの/etc/mysql/my.cnfで、[mysqld]グループのserver-id=行を追加または編集します。ここでserver-idの値は新しく一意である必要があります:
[mysqld]
server-id=20011 ( f) . マスターで、データベースのrootとしてMariaDBクライアントに入り、テーブルのロックを解除します:
UNLOCK TABLES;11 ( g) . マスターで、rootとしてmysqldを再起動します:
service mysql restart11 ( h) . スレーブで、rootとしてmysqldを開始します:
**service mysql start
11 ( i) . スレーブで、データベースのrootとしてMariaDBクライアントに入り、マスターのアイデンティティとステップ10(a)からのバイナリログファイル名と位置を設定します:
CHANGE MASTER TO MASTER_HOST='masterhost', MASTER_USER='repluser', MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysqld-bin.nnnnnn’, MASTER_LOG_POS=n;11 ( j) . スレーブで、データベースのrootとしてMariaDBクライアントに入り、レプリケーションをアクティブ化します:
START SLAVE;12. トラブルシューティング: スレーブがマスターに接続できない
マスターの/var/mysql/my.cnfでbind-addressエントリを確認します。bind-addressが127.0.0.1に設定されている場合、サーバーはローカルホストからの接続のみを受け入れます。この行をコメントアウトするか、値を*に設定してすべてのIPv4およびIPv6アドレスからの接続を許可します。my.cnfを変更した場合は、mysqldを再起動することを忘れないでください。
接続がまだ機能しない場合は、サーバーがポート3306での接続を許可していることを確認してください。マスターで、カーネルファイアウォールテーブルをリストします:
iptables -L次のコマンドを使用して、ポート3306での接続を許可することができます。必要に応じて、ネットワークインターフェースデバイス名をeth0に置き換えてください:
iptables -A INPUT -i eth0 -p tcp --destination-port 3306 -j ACCEPT新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。