2013年12月12日 星期四

[MySQL] Master/Slave Replication 同步設定

瀏覽數


參考: http://blog.longwin.com.tw/2008/03/mysql_replication_master_slave_set_2008/


MySQL 設定 Master 有異動後, 自動 Replication(複寫) 到 Slave 去,由於公司的主機已上線工作,不可能暫停下來設定。但是主機每天就會跑備份,研究了一下,寫了一個 shell script,讓Master主機備份後,自動倒資料到Slave備機,並經由Master主機自動設定並啟用 Master/Slave Replication 同步機制。

複寫機制注意事項:

  • MySQL 複寫機制預設就是用非同步的方式進行複寫。

  • MySQL 複寫機制是由 Slave 主動向 Master 要求資料庫的內容更新紀錄。

  • Slave 不需要一直連接 Master 才能運作,即便長時間中斷連線都還是能回復資料庫同步的狀態


主機與備機環境 CentOS 6.4-x86_64 + MySQL.5.5.18-x86_64

準備工作:
1. 設定 Master主機:
vi /etc/my.cnf
[mysqld]
server-id=1
log-bin=mysql-bin # 其實預設已經啟用日誌檔
# 若是 innodb, 且有用 transaction 的話, 需再加入下面兩行
innodb_flush_log_at_trx_commit=1
sync_binlog=1

自己找適合的時間重啟 mysql:
service mysql restart

2. 設定 Slave備機:
vi /etc/my.cnf
[mysqld]
server-id=2
log-bin=mysql-bin # 其實預設已經啟用日誌檔

重啟 mysql:
service mysql restart

3.並且假設Master主機與Slave備機(IP:192.168.1.2),都有root帳號且密碼相同,並可互相登入。

4.上述工作完成後,將底下的 shell script 加入Master主機的排程即可。
#!/bin/bash
pwd='密碼'
master_ip=$(LC_ALL=C ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}')
slave_ip='192.168.1.2'

sql="GRANT REPLICATION SLAVE ON *.* TO 'root'@'%' IDENTIFIED BY '$pwd';"
mysql -uroot -p$pwd -e "$sql"

sql="FLUSH TABLES WITH READ LOCK;"
mysql -uroot -p$pwd -e "$sql"

logbin=$(mysql -uroot -p$pwd -e "show master status \G;" | grep -i file | awk '{print $2}')
logpos=$(mysql -uroot -p$pwd -e "show master status \G;" | grep -i pos | awk '{print $2}')

# 同步資料庫 dump master #####################
mysqldump -uroot -p$pwd DB > dbdump.sql
###############################################

sql="UNLOCK TABLES;"
mysql -uroot -p$pwd -e "$sql"

sql="STOP SLAVE;"
mysql -h$slave_ip -uroot -p$pwd -e "$sql"

# 同步資料庫 restore to slave #################
mysql -h$slave_ip -uroot -p$pwd < dbdump.sql
###############################################

sql="RESET MASTER;"
mysql -h$slave_ip -uroot -p$pwd -e "$sql"

sql="RESET SLAVE;CHANGE MASTER TO MASTER_HOST=' ';"
mysql -h$slave_ip -uroot -p$pwd -e "$sql"

sql="CHANGE MASTER TO MASTER_HOST='$master_ip',MASTER_USER='root',MASTER_PASSWORD='$pwd',MASTER_LOG_FILE='$logbin',MASTER_LOG_POS=$logpos;"
mysql -h$slave_ip -uroot -p$pwd -e "$sql"

sql="START SLAVE;"
mysql -h$slave_ip -uroot -p$pwd -e "$sql"

# OK, show master/slave status ################
sql="show master status \G;"
mysql -uroot -p$pwd -e "$sql" > /tmp/_mysql_slave.log
sql="show slave status \G;"
mysql -h$slave_ip -uroot -p$pwd -e "$sql" > /tmp/_mysql_slave.log

沒有留言: