データベース · 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.gzcd /misc/mysql-4.1.12./configure --prefix=/usr/local/mysql-mastermakemake installcd /usr/local/mysql-master/bin./mysql_install_db(これによりvarフォルダが作成されます)
cd ../varcp /misc/mysql-4.1.12/support-files/my-medium.cnf my.cnfcd ..groupadd mysqluseradd -g mysql mysqlchown -R root .chown -R mysql varchgrp -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-slavemakemake installcd /usr/local/mysql-slavecd bin./mysql_install_db(これによりvarフォルダが作成されます)
cd ../varcp /opt/mysql-4.1.12/support-files/my-medium.cnf my.cnfcd ..groupadd mysqluseradd -g mysql mysqlchown -R root .chown -R mysql varchgrp -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.sockmysql> 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.000001Slave_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;これにより、マスターと同期した値が表示されます。修正されました。
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。