[MySQL] 實做 MySQL Master-Master Replication 同步

今天無聊實做了 MySQL 資料庫同步化,那可以先看看 MySQL Master Slave Replication,中文網站可以上 google 查詢或者是看看這一篇:MySQL 設定 Replication (Master – Slave),基本上設定還蠻容易的,如果會 Master 同步到 Slave 的話,那 MySQL Master-Master 只是在用相同的方法在做一遍,如果不懂 MMM 的可以先參考這一篇:MySQL Master-Master Replication Manager(1) – 簡介,這篇寫的很清楚,今天看了文章,我實做起來,遇到一些問題,其實還蠻奇怪的,所以底下就來紀錄一下步驟,順便也說明一下。 實做兩台 Ubuntu 機器: db1:192.168.1.1 db2:192.168.1.2 先設定 db1: 目前我都是在 Ubuntu 7.10 底下實做的,那基本上只要有支援 MySQL 的 Linux 或者 FreeBSD 機器都可以實做這個方法: 步驟一:先修改 my.cnf 這個檔案: FreeBSD 的話在:/var/db/mysql/my.cnf Ubuntu:/etc/mysql/my.cnf 有的版本是在 /etc/my.cnf 所以不太一定,請依照自己的作業系統 修改:

#
# bind-address 請 mark 起來,因為我們必須讓 MySQL Listen 各個不同的 IP Address
#bind-address           = 127.0.0.1
#
# server id 請記得每台機器都設定不同喔
#
server-id               = 1
log_bin                 = /var/log/mysql/mysql-bin.log

步驟一的部份也請先在 db2 的機器先設定一次,然後重新啟動 mysql

步驟二:設定 mysql 權限

mysql -u root -p
#
# 先設定 replication 這個帳號密碼是 slave 這個可以自己改掉
#
mysql> GRANT replication slave on *.* to 'replication'@'%' identified by 'slave';
#
#  這個是官方的寫法,可以按照這底下去寫就可以了
# 
mysql> change master to master_host='192.168.1.2', master_port=3306, master_user='replication', master_password='slave';
#
# 底下是 Master 機器的 bin log file
# master_log_file='mysql-bin.000004',
# master_log_pos=98;
# 可以利用 SHOW MASTER STATUS; 來取得這兩個的值
mysql> change master to master_host='192.168.1.2', master_port=3306, master_user='replication', master_password='slave', master_log_file='mysql-bin.000004', master_log_pos=98;
先到 db2 執行 SHOW MASTER STATUS; 會得到底下結果
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      189 |              |                  |
+------------------+----------+--------------+------------------+
那這樣就可以知道 master\_log\_file=’mysql-bin.000001′, master\_log\_pos=189;

步驟三:測試觀看 mysql slave 重新啟動 mysql

/etc/init.d/mysql restart
#
# 啟動 slave 
#
mysql> START slave;
#
# 觀看 slave 狀態 
#
mysql> show slave status \G;

1 (by appleboy46) 請注意下面這兩行必須為 YES

Slave_IO_Running: Yes
Slave_SQL_Running: Yes
這樣才算代表成功了,不然就是失敗的。 先設定 db2:

步驟一:先修改 my.cnf 這個檔案: FreeBSD 的話在:/var/db/mysql/my.cnf Ubuntu:/etc/mysql/my.cnf 有的版本是在 /etc/my.cnf 所以不太一定,請依照自己的作業系統 修改:

#
# bind-address 請 mark 起來,因為我們必須讓 MySQL Listen 各個不同的 IP Address
#bind-address           = 127.0.0.1
#
# server id 請記得每台機器都設定不同喔
#
server-id               = 1
log_bin                 = /var/log/mysql/mysql-bin.log

步驟二:設定 mysql 權限

mysql -u root -p
#
# 先設定 replication 這個帳號密碼是 slave 這個可以自己改掉
#
mysql> GRANT replication slave on *.* to 'replication'@'%' identified by 'slave';
#
#  這個是官方的寫法,可以按照這底下去寫就可以了
# 
mysql> change master to master_host='192.168.1.1', master_port=3306, master_user='replication', master_password='slave';
#
# 底下是 Master 機器的 bin log file
# master_log_file='mysql-bin.000004',
# master_log_pos=98;
# 可以利用 SHOW MASTER STATUS; 來取得這兩個的值
mysql> change master to master_host='192.168.1.1', master_port=3306, master_user='replication', master_password='slave', master_log_file='mysql-bin.000004', master_log_pos=98;

步驟三:測試觀看 mysql slave 重新啟動 mysql

/etc/init.d/mysql restart
#
# 啟動 slave 
#
mysql> START slave;
#
# 觀看 slave 狀態 
#
mysql> show slave status \G;
如果遇到
Slave_IO_Running: no
Slave_SQL_Running: no
這樣的話請依照下面步驟:
#
# 停止跟清除 SLAVE 
#
mysql> STOP SLAVE;
mysql> RESET SLAVE;
#
# 停止 mysql
#
/etc/init.d/mysql stop
#
# 刪除 bin log 檔案
#
rm -rf /var/log/mysql/mysql-bin.*
#
# 啟動 mysql 
#
/etc/init.d/mysql start
#
# 在設定一次 master ip 資訊
#
mysql> change master to master_host='192.168.1.1', master_port=3306, master_user='replication', master_password='slave';
#
# 啟動 slave
#
mysql> START SLAVE;
參考網站:

How To Set Up Database Replication In MySQL MySQL Master Master Replication MySQL Master-Master Replication Manager(2) – 環境建置、架設


See also