データベース · 3 min read · Jan 31, 2026

同じマシン上のMySQLレプリケーション

この方法は、同じマシン上のMySQLのレプリケーションを説明します。

あなたは、大規模なヒットを持つデータベース駆動のサイトとパフォーマンス、冗長性、セキュリティを考慮する必要があります。DBAは、幸せな顔を作るための良い解決策を求めるために多くの手を借りています。そこで、クラスター、レプリケーション、バックアップ、フェイルオーバーなどの言葉が出てきます。これらは何でしょうか?私たちは現在、大規模なヒットのためのウェブベースのデータベース駆動サイトにおけるレプリケーションについて議論しています。

レプリケーションとは何か、なぜ必要なのか?

レプリケーションは、DBAがマスターのデータベースを別のデータベースサーバーにクローンすることを可能にします。それには、マスターとスレーブのアイデンティティが含まれます。スレーブは、マスターデータベースサーバーおよびそのデータベースの正確なコピーを作成します。マスターとスレーブの間には、一対一、一対多、多対一の関係がある場合があります。スレーブは、マスターのバイナリログを継続的に読み取り(binlogはマスターデータベースサーバーに書き込まれたクエリを保存します)、そのスレーブデータベースサーバーに入力を取得します。

レプリケーションが何でないか:

バックアップ、パフォーマンス、セキュリティ、冗長性のためのソリューションとして考えないでください。これには他の技術があります。

現在、同じマシン上でのMySQLサーバーのレプリケーション、すなわちマスターとスレーブが同じマシンで動作しているのを見ています。レプリケーションに関するいくつかの問題についても議論します。

前提条件:

ソース形式のMySQLサーバー4.1.12以上。http://mysql.comからソース形式でダウンロードしてください。 簡単のために、http://mysql.comからmysqlクライアントをダウンロードするか、mysqlを環境変数に追加してください。そうでなければ、mysqlはそれぞれのマスター/スレーブディレクトリから呼び出される必要があります。 いくつかのLinuxディストリビューション。(私はFedora Core 2を使用しました)。 mysqlサーバーの依存関係を削除します。

MySQLマスターのインストールと設定:

/miscフォルダにmysql-4.1.12ソースをダウンロードします。

tar xzvf mysql-4.1.12.tar.gz
cd /misc/mysql-4.1.12
./configure --prefix=/usr/local/mysql-master
make
make install
cd /usr/local/mysql-master/bin
./mysql_install_db

(これによりvarフォルダが作成されます)

cd ../var
cp /misc/mysql-4.1.12/support-files/my-medium.cnf my.cnf
cd ..
groupadd mysql
useradd -g mysql mysql
chown -R root .
chown -R mysql var
chgrp -R mysql .
[mysqld]  

port = 3306  

socket = /usr/local/mysql-master/mysql.sock  

  
#skip-networking // この場合、マスターとスレーブを同じマシンで実行しているため、これをスキップします。  

  
# レプリケーションマスターサーバー(デフォルト)  

# バイナリログはレプリケーションに必要です  

log-bin  

  
# 1から2^32 - 1の間で一意のIDが必要です  

# master-hostが設定されていない場合はデフォルトで1になります  

# ただし、省略するとマスターとして機能しません  

server-id = 1  

他の設定を必要に応じて構成するか、そのままにしておけば動作します!! :)
今、mysqlサーバーを起動します:

cd /usr/local/mysql-master/bin
./mysqld_safe --defaults-file=/usr/local/mysql-master/var/my.cnf &;

MySQLスレーブ:

次に、別のディレクトリにmysql-4.1.12.tar.gzを抽出します。

cd /opt/mysql-4.1.12
./configure --prefix=/usr/local/mysql-slave
make
make install
cd /usr/local/mysql-slave
cd bin
./mysql_install_db

(これによりvarフォルダが作成されます)

cd ../var
cp /opt/mysql-4.1.12/support-files/my-medium.cnf my.cnf
cd ..
groupadd mysql
useradd -g mysql mysql
chown -R root .
chown -R mysql var
chgrp -R mysql .

varフォルダ内のmy.cnfを編集します。

[mysqld]  

port  = 3307  

socket  = /usr/local/mysql-slave/var/mysql.sock  

  
#skip-networking  

  
server-id = 2  

  
# このスレーブのレプリケーションマスター - 必須  

master-host = localhost  

master-user = slavedb  

master-password = q1w2e3r4t5  

master-port = 3306  

今、mysqlサーバーを起動します:

cd /usr/local/mysql-slave/bin
./mysqld_safe --defaults-file=/usr/local/mysql-slave/var/my.cnf &

レプリケーションの設定:

mysqlマスターに接続します:

mysql --sock=/usr/local/mysql-master/mysql.sock

スレーブ用のマスターでアカウントを作成:

mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO slavedb@"192.168.1.27/255.255.255.0" identified by 'q1w2e3r4t5'; Query OK, 0 rows affected (0.28 sec)

mysqlスレーブに接続します:

mysql --sock=/usr/local/mysql-slave/mysql.sock
mysql> slave start;

Query OK, 0 rows affected, 1 warning (0.04 sec)

テスト:

マスターでmysql接続:

mysql> show master status\G;
************************* 1. row ***********************  
 File: adam-bin.000001  
 Position: 227  
 Binlog_Do_DB:  
Binlog_Ignore_DB:  
1 row in set (0.01 sec)  
  
ERROR:  
No query specified  

スレーブでmysql接続

mysql> show slave status\G;
*********************** 1. row *************************
 Slave_IO_State: Connecting to master  
 Master_Host: localhost  
 Master_User: slavedb  
 Master_Port: 3306  
 Connect_Retry: 60

Master_Log_File: adam-bin.000001

 Read_Master_Log_Pos: 4  
 Relay_Log_File: adam-relay-bin.000001  
 Relay_Log_Pos: 4  
 Relay_Master_Log_File: adam-bin.000001

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: 4  
 Relay_Log_Space: 4  
 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: NULL  
1 row in set (0.00 sec)  
  
ERROR:  
No query specified  

マスターのbinlogファイルとその位置は、mysqlスレーブでshow slave status\G;によって同じでなければなりません。
すべてが正常であれば、同じシステム上での一対一のマスターとスレーブの関係が動作しています。

いくつかの問題:

レプリケーションは、さまざまな問題により失敗する可能性があります。私はレプリケーションに関するいくつかの経験を共有します。

問題:レプリケーションが失敗し、マスターがダウンした。

マスターは多くの理由でダウンしている可能性があります。データベースのファイル制限、SQLクエリ、ディスク使用量を確認してください。いずれかの理由が表示された場合は、それを修正し、mysqldを再起動してマスターステータスを確認してください:

mysql> show master status\G;

* 1. row *

adam-bin.000003

Position: 227

Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.01 sec)

今、スレーブを確認します:show slave status:

mysql> show slave status\G;

* 1. row *
Slave_IO_State: Connecting to master
Master_Host: localhost
Master_User: slavedb
Master_Port: 3306
Connect_Retry: 60

Master_Log_File: adam-bin.000001

Read_Master_Log_Pos: 4

Relay_Log_File: adam-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: adam-bin.000001

Slave_IO_Running: No

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: 4
Relay_Log_Space: 4
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: NULL
1 row in set (0.00 sec)

上記の値は、マスターが3番目のbinlogに増加している一方で、スレーブはまだbinlog1を指していることを示しています。したがって、mysqlスレーブに接続してこの値を変更します。

mysql>; stop slave;
mysql> change master to master_log_file='adam-bin.000003', master_log_pos=227;
mysql> start slave;

今、show slave status\G;で確認すると、正常に動作しています。

問題2:スレーブで重複エラーキーが表示される場合

すなわち
スレーブで

Mysql> show slave status\G;

* 1. row *
Slave_IO_State: Waiting for master to send event
Master_Host: 10.0.0.152
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: adam-bin.000048
Read_Master_Log_Pos: 317714810
Relay_Log_File: db4-relay-bin.000001
Relay_Log_Pos: 290512385
Relay_Master_Log_File: adam-bin.000048
Slave_IO_Running: Yes

Slave_SQL_Running: No

Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 1062

Last_Error: Error ‘Duplicate entry ‘dekq5g820avnfdmar5qi9dkhv3’ for key 1’ on query. Default database:’session_sql’. Query: ‘INSERT INTO sessi ons5 VALUES (‘dekq5g820avnfdmar5qi9dkhv3’, UNIX_TIMESTAMP(NOW()) + 18000, ‘redir ect|i:1;’)’

Skip_Counter:0
Exec_Master_Log_Pos: 290512419
Relay_Log_Space: 317714776
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: NULL
1 row in set (0.00 sec)

それは、マスターの利用不可によってスレーブが読み取られたか、スレーブの利用不可によってマスターが更新されたことを意味します。したがって、1つのエントリに対して2つのプライマリキーが見つかり、混乱が生じました。

それを修正するには:
スレーブで:

Mysql> set global sql_slave_skip_counter=1;
Mysql> start slave;
Mysql> show slave status\G;

これにより、マスターと同期した値が表示されます。修正されました。

Share: X/Twitter LinkedIn

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

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