2009年9月17日 星期四

mysql replication setup

實作版本
OS: CentOS 5.3
mysql : 5.1.37

實作目標:

Slave server 資料與 Master server 同步.

設定步驟:

1. 修改 Master Server my.cnf 檔:
#vi /etc/my.cnf
(預設路徑)

[mysqld]
.
.
server-id = 1 #設定id(與slave server區別)

log-slave-updates #啟動覆寫機制

log-bin=dba-master-bin #設定repilation binlog 檔名

存檔跳出後 restart mysql


2. 設定mysql replication 的帳號權限:
#mysql -uroot -p
(登入mysql console)
mysql> grant replication slave on *.* to userrepl@'172.16.%'identified by 'password';
( 帳號 userrepl 密碼 password, 允許172.16.0.0/16的區段連線 )
mysql> flush privileges;
(使帳號權限生效)

3. Master Server 的 lock DB 與dump DB:

3.1 lock DB:
#mysql -uroot -p
( 登入mysql console)
mysql> flush tables with read lock;
(lock db 確保來源檔案在dump的過程中不會再異動)

3.2 查看master log position資訊:

mysql> show master status\G;
*************************** 1. row ***************************
File: dba-master-bin.000005
Position: 845
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
ERROR:No query specified

(上面資訊把binlog的檔名:dba-master-bin.000005及位置:845記下來)

3.3 dump DB:
( system console)
#mysqldump -uroot -p --all-database --master-data > ALL_DB.sql
( 將lock中的DB全部dump到ALL_DB.sql)
再把ALL_DB.sql 傳送到slave server上

4. 修改 Slave Server my.cnf 檔:

#vi /etc/my.cnf
(預設路徑)

[mysqld]
.
.
server-id = 2 #設定id(與master server區別)


存檔跳出後 restart mysql

5. Store DB file:

#mysql -uroot -p < ALL_DB.sql ( 將master 的sql檔 store進slave server)


6. Slave mysql setting:

#mysql -uroot -p ( 登入slave mysql console)
mysql> CHANGE MASTER TO
MASTER_HOST='172.16.1.2', ( 示範的master server IP 位置)
MASTER_USER='userrepl',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='dba-master-bin.000005',
MASTER_LOG_POS=845;

mysql> slave start;

( 啟動replication )

7. unlock master db:

回到master server 的mysql console

mysql>unlock tables;
(讓db可以正常寫入)


8. 檢查replication是否正常:

到slave server的mysql console

mysql>show slave status\G;

*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event .
.
.
Last_Errno: 0
Last_Error: ( 沒有錯誤訊息, 正常運作中 )
.
.

如果發生幾個不重要的query錯誤造成停止,
可使用下面命令跳過該query, 繼續運作replication.

mysql>slave stop; (先停止replication)
mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; (跳過的query數)
mysql>slave start; (重啟replication)

沒有留言: