2014年6月23日 星期一

Mysql 主從式主機自動同步 (MySQL Replication)

上級長官交代要研究一下MySQL 主從式資料庫自動同步的方式,找了一下網路上的資料並實際實作OK,特別紀錄一下流程

參考資料:

  1. MySQL設定Replication (Master - Slave) http://blog.longwin.com.tw/2008/03/mysql_replication_master_slave_set_2008/
  2. How to Set Up Replication
    http://dev.mysql.com/doc/refman/5.0/en/replication-howto.html
流程:

1. 設定Master主機,找到 /etc/my.cnf,找到[[mysqld]加入以下兩行 
log-bin=mysql-bin
server-id=1

並且重啟資料庫。


2. mysql -u root -p # 進入 mysql
加入連線主機的使用者,可利用以下指令去做
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'140.129.X.X' IDENTIFIED BY '123456';
#這段指令是說要加入一個user叫做repl,來源的IP為140.129.X.X,密碼為 123456
如果有安裝phpMyAdmin,可以在資料庫中的資料庫 mysql - 資料表 user 發現新增了一個user 叫repl
3. FLUSH TABLES WITH READ LOCK; # 先讓 DB 不要再寫資料進去
4.SHOW MASTER STATUS; 記好框起來的資料 


5. 至此大致上Master的資料庫設定完畢,接下來把Master的資料庫的資料倒出來,因為我是測試用的,所以我透過phpMyAdmin的介面把資料倒出來,如果資料量比較大我才考慮用Command Line的方式來做

接下來是設定Slave資料庫
6. 設定Slave DB,找到 /etc/my.cnf,找到[[mysqld]加入 server-id=2

加入後記得重新啟動MySQL

7.把Master資料庫的資料倒進去,方法不贅述...

倒完資料後,記得把Master 主機唯讀的Table解除唯讀
在Master的資料庫中下以下命令: UNLOCK TABLES;
8.資料寫入完畢後,再下Command, 
     CHANGE MASTER TO
     MASTER_HOST='140.129.X.X',  //Master IP
     MASTER_USER='repl', //剛剛新增的USER
     MASTER_PORT=3306, //MySQL的阜號,如果沒改阜號的話此參數不用加
     MASTER_PASSWORD='123456', //密碼
     MASTER_LOG_FILE='mysql-bin.000001', //用剛剛抄下的資料
     MASTER_LOG_POS=3518; //用剛剛抄下的資料

9. START SLAVE; # 開始 Replication

10.注意!!如果Master主機有開啟防火牆, 請記得開放Mysql連接阜 3306 ,否則Slave 主機連線時會被防火牆擋住...

附註說明:
1. 兩部資料庫的版本最好一樣,上述測試的過程都是透過MySQL  version  5.1.73,而我在工作上的主機卻是 4.0.23,
兩者差異太大會出現以下的問題而無法進行同步..

2.如果發現無法同步,可以在/var/log/mysqld.log 去查詢原因