データベース · 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に設定します。

このユーザーにグローバル権限SUPERRELOAD、およびREPLICATION SLAVEを付与します。これにより、レプリケーションユーザーはスーパーユーザーコマンドを実行し、データベースキャッシュをフラッシュし、マスターサーバーからの更新を取得できるようになります。

データベースのrootとしてMariaDBクライアントに入ります:

mysql -u root -p

MariaDBプロンプトで、次のコマンドを入力します:

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 |              |                  |
+-------------------+----------+--------------+------------------+

あなたの情報は異なるでしょうが、FilePositionの値をメモしてください。この情報はステップ7で使用します。

MariaDBクライアントを終了します:

\q

5. スレーブホスト用のデータベースのスナップショット

マスターに存在するデータベースまたはデータベースのアーカイブを作成します。これらのデータベースはそれぞれ/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]@slavehost

rootとして、スレーブで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=100

7. テーブルのロック解除とマスターおよびスレーブでのmysqldの開始/再起動

マスターサーバーで、データベースのrootとしてMariaDBクライアントに入り、テーブルのロックを解除します:

mysql -u root -p
UNLOCK TABLES;
\q

マスターでmysqldを再起動します:

service mysql restart

スレーブで開始します:

service mysql start

新しいserver-idの値が各ホストで適用されたことを確認できます。rootとして:

mysqld --verbose --help | grep server-id

8. スレーブでのマスターのアイデンティティを設定

スレーブで、マスターサーバーのアイデンティティを設定します。MariaDBクライアントに入ります:

mysql -u root -p

次のコマンドを実行し、MASTER_LOG_FILEMASTER_LOG_POSの値をステップ4で記録したバイナリログのFilePositionに置き換え、MASTER_HOSTMASTER_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 -p
USE repltest
SELECT * FROM test;
+-------+
| hello |
+-------+
| world |
+-------+
1 row in set (0.00 sec)

11. 追加のスレーブのためにプロセスを繰り返す

このプロセスを各追加のスレーブに対して繰り返すことができます。具体的には、次の手順を実行します:

11 ( a) . マスターで、データベースのrootとしてMariaDBクライアントに入り、テーブルをフラッシュしてロックします:

FLUSH TABLES WITH READ LOCK;

ロック後、マスターステータスを表示します:

**SHOW MASTER STATUS;

FilePositionの値をメモします。

11 ( b) . マスターで、rootとして:

tar cjvf /home/[username]/mysql-master.tar.bz2 /var/lib/mysql/dbname

11 ( c) . マスターで、通常のユーザーとして:

rsync -avP mysql-master.tar.bz2 [username]@slavehost2:~/.

11 ( d) . スレーブで、rootとして:

service mysql stop
tar xjvf /home/[username]/mysql-master.tar.bz2 -C /.

11 ( e) . スレーブホストの/etc/mysql/my.cnfで、[mysqld]グループのserver-id=行を追加または編集します。ここでserver-idの値は新しく一意である必要があります:

[mysqld]
server-id=200

11 ( f) . マスターで、データベースのrootとしてMariaDBクライアントに入り、テーブルのロックを解除します:

UNLOCK TABLES;

11 ( g) . マスターで、rootとしてmysqldを再起動します:

service mysql restart

11 ( 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.cnfbind-addressエントリを確認します。bind-address127.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
Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。