天天看點

[SHELL]mysql主從+keepalived線上恢複解決方案

最近一個項目需要做一個mysql+keepalived高可用主從同步,配起來當然輕車熟路,但想到如何在主庫挂掉,從庫接管後,以最快的速度恢複資料,并讓主庫重新接管,是以整理了下思路,編寫了如下腳本,供大家參考

mysql主從,以及keepalived高可用配置本博傳送門:

<a href="http://showerlee.blog.51cto.com/2047005/1220801" target="_blank">http://showerlee.blog.51cto.com/2047005/1220801</a>

<a href="http://showerlee.blog.51cto.com/2047005/1188549" target="_blank">http://showerlee.blog.51cto.com/2047005/1188549</a>

一.備份從庫目前資料庫

注:以下的所有配置需要在資料庫未運轉狀态下進行,建議做一個iptables規則禁止非管理者IP通路主從伺服器IP,以及VIP,這樣既能保證管理者可SSH遠端登陸配置,又能恢複主從環境,待配置完成後解除禁止即可。

# vi /etc/rc.d/mysql_bak.sh

-------------------------

#!/bin/bash

# 環境變量

PATH=/bin:/usr/bin:/sbin:/usr/sbin; export PATH

export LANG=C

# 日常備份目錄

basedir=/backup/daily/

# 資料庫賬戶

user=root

passwd=123456

# mysql備份目錄

mysql_db_bak=$basedir/$(date +%F_%H%M)

[ ! -d "$mysql_db_bak" ] &amp;&amp; mkdir -p $mysql_db_bak

# mysql下所有庫名稱

db_name=("information_schema" "mysql" "test_db1" "test_db2" "test_db3" "test_db4")

# 1.備份MySQL資料庫

for((i=0; i!=${#db_name[@]}; ++i))

{

mysqldump -u $user -p$passwd --opt --skip-lock-tables --flush-logs --database ${db_name[i]} &gt; $mysql_db_bak/${db_name[i]}.sql

}

二.複制從(192.168.7.12)資料庫備份到主庫(192.168.7.9)

# vi /etc/rc.d/scp_mysql.sh

----------------------

#/bin/bash

scp /backup/daily/2013-09-10_1258/* 192.168.7.9:/tmp

三.恢複主庫(192.168.7.9)

版本一:

# vi /etc/rc.d/recover_mysql.sh

------------------------------------

# 恢複MySQL資料庫

cd /tmp

mysql -u $user -p$passwd -e "drop database \`${db_name[i]}\`;"

mysql -u $user -p$passwd -e "create database \`${db_name[i]}\`;"

mysql -u $user -p$passwd ${db_name[i]} &lt; ${db_name[i]}.sql

# 開啟從庫

mysql -u $user -p$passwd -e "stop slave;"

mysql -u $user -p$passwd -e "reset slave;"

# 設定從庫連接配接主庫的相關參數,可利用相關指令檢視

mysql -u $user -p$passwd -e "change master to master_host='192.168.7.9',master_user='slave',master_password='123456#',master_log_file='bin.000029',master_log_pos=106 ";

mysql -u $user -p$passwd -e "start slave;"

# 檢視主從是否連接配接成功

mysql -u $user -p$passwd -e "show slave status\G;"

版本二:

(自動擷取主庫binlog檔案,和偏移值,優化參數,推薦):

# 資料庫參數

master_ip=192.168.7.9

mysql_master_user=root

mysql_slave_user=root

mysql_passwd=123456

master_user=slave

master_passwd=123456#

master_log_file=$(mysql -h$master_ip -u$mysql_master_user -p$mysql_passwd -e "show master status" |sed -n '2p' |awk '{print $1}')

master_log_pos=$(mysql -h$master_ip -u$mysql_master_user -p$mysql_passwd -e "show master status" |sed -n '2p' |awk '{print $2}')

# mysql庫

cd /tmp/mysql_bak

mysql -u $mysql_slave_user -p$mysql_passwd -e "drop database \`${db_name[i]}\`;"

mysql -u $mysql_slave_user -p$mysql_passwd -e "create database \`${db_name[i]}\`;"

mysql -u $mysql_slave_user -p$mysql_passwd ${db_name[i]} &lt; ${db_name[i]}.sql

mysql -u $mysql_slave_user -p$mysql_passwd -e "stop slave;"

mysql -u $mysql_slave_user -p$mysql_passwd -e "reset slave;"

mysql -u $mysql_slave_user -p$mysql_passwd -e "change master to master_host='${master_ip}',master_user='${master_user}',master_password='${master_passwd}',master_log_file='${master_log_file}',master_log_pos=${master_log_pos};"

mysql -u $mysql_slave_user -p$mysql_passwd -e "start slave;"

mysql -u $mysql_slave_user -p$mysql_passwd -e "show slave status\G;"

-----------------------------------

四.檢視主從同步資訊

1.檢視主庫binlog日志以及偏移量

# mysql -u root -p123456 -e "show master status"

2.檢視從庫是否連接配接到主庫

# mysql -u root -p123456 -e " show slave status\G;"

注:實際操作中發現,一旦VIP切換後有一定幾率造成主從伺服器都會同時擷取到該虛IP,導緻主從資料庫沖突,無論重新開機keepalived與否都無法幹掉該VIP,目前我的臨時解決方案是将兩台伺服器均重新啟動,大家如果有更好的方法請留言告知我,不勝感謝。

後續:

在網上翻閱大量資料,初步判斷VIP切換後造成的沖突是因為在觸發切換動作時使用的pkill keepalived 來殺掉keepaliaved程序,造成系統隻是殺掉keepalived自身程序,并未來得及切換VIP,

目前的解決方案是使用正規的keepalived啟動腳本/etc/init.d/keepalived stop 來關閉

初步測試未發現異常。。。

如果出現主從在切換VIP時,出現了主的VIP未自動關閉,從的正常開啟,導緻都擷取到VIP,造成互相沖突的情況,可手動輸入如下指令删除一方的VIP位址

# ip addr del "虛拟ip" dev eth0

但此方法隻是一個臨時的解決方案,當手動删除VIP後,重新開機keepalived服務會無法正常開啟vip,需要重新開機伺服器方能恢複。

     本文轉自 showerlee 51CTO部落格,原文連結:http://blog.51cto.com/showerlee/1298160,如需轉載請自行聯系原作者