現(xiàn)有2臺DB服務(wù)器,分別用于A業(yè)務(wù)與B業(yè)務(wù),其中A業(yè)務(wù)比較重要,需要對A業(yè)務(wù)的1個DB(TaeOss)進行熱備,大概有40G的數(shù)據(jù),并用業(yè)務(wù)B的DB服務(wù)器作為備機,服務(wù)器分布如下:
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、成都微信小程序、集團企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了藍田免費建站歡迎大家使用!
10.137.143.151 A業(yè)務(wù)
10.137.143.152 B業(yè)務(wù)
開發(fā)那邊的要求是:
在導(dǎo)出A業(yè)務(wù)的DB(TaeOss)時,不能對A業(yè)務(wù)有影響。同時在B業(yè)務(wù)的DB服務(wù)器上進行恢復(fù)時,也不能有較大影響,盡量控制在1分鐘以內(nèi)。
采取的方案:
1、MySQLdump:屬于邏輯備份,會存在鎖表,但考慮到數(shù)據(jù)量比較大,鎖表的時間會比較長,業(yè)務(wù)不允許,pass掉;
2、xtrabackup:屬于物理備份,不存在鎖表,但考慮到2臺DB使用的都是共享表空間,同時在業(yè)務(wù)B的數(shù)據(jù)庫進行恢復(fù)時,一是時間比較長,二是數(shù)據(jù)肯定不正確,pass掉(測試過);
3、mydumper:屬于邏輯備份,是一個多線程、高性能的數(shù)據(jù)邏輯備份、恢復(fù)的工具,且鎖表的時間很短(40G數(shù)據(jù),10分鐘以內(nèi)),同時會記錄binlog file和pos,業(yè)務(wù)可以接受。
mydumper主要有如下特性:
(1)、任務(wù)速度要比mysqldump快6倍以上;
(2)、事務(wù)性和非事務(wù)性表一致的快照(適用于0.2.2以上版本);
(3)、快速的文件壓縮;
(4)、支持導(dǎo)出binlog;
(5)、多線程恢復(fù)(適用于0.2.1以上版本);
(6)、以守護進程的工作方式,定時快照和連續(xù)二進制日志(適用于0.5.0以上版本)。
mydumper安裝:
https://launchpad.net/mydumper/0.6/0.6.2/+download/mydumper-0.6.2.tar.gz
# yum install glib2-devel mysql-devel zlib-devel pcre-devel
# tar zxvf mydumper-0.6.2.tar.gz
# cd mydumper-0.6.2
# cmake .
# make
# make install
參數(shù)如下:
由于DB是部署在比較老的SuSE Linux 10服務(wù)器上,安裝mydumper時依賴的庫比較多,會比較繁瑣,同時采用本地備份的話,也會占用大量的磁盤I/O,所以我們選擇在同網(wǎng)段的另一臺centos 6.4(10.137.143.156)服務(wù)器進行備份。
步驟如下:
1、在“10.137.143.151、10.137.143.152”上對“10.137.143.156”進行臨時授權(quán)
# mysql -uroot -e "grant all privileges on *.* to 'backup'@'10.137.143.156' identified by 'backup2015';"
# mysql -uroot -e "flush privileges;"
2、在“10.137.143.156”上對“10.137.143.151”的DB(TaeOss)進行備份
# mydumper -h 10.137.143.151 -u backup -p backup2015 -B TaeOss -t 8 -o /data/rocketzhang
3、將備份數(shù)據(jù)恢復(fù)到“10.137.143.152”
# myloader -h 10.137.143.152 -u backup -p backup2015 -B TaeOss -t 8 -o -d /data/rocketzhang
4、主從關(guān)系建立:10.137.143.151(主)、10.137.143.152(從)
在“10.137.143.151”建立授權(quán)賬號:
# mysql -uroot -e "grant replication slave on *.* to 'repl'@'10.137.143.152' identified by 'repl123456';"
# mysql -uroot -e "flush privileges;"
在“10.137.143.156”查看記錄下的binlog信息:
在“10.137.143.152”如下操作:
# vim /etc/my.cnf
……
replicate-do-table = TaeOss.%
replicate-wild-do-table = TaeOss.%
……
# service mysqld reload
# mysql -uroot -e "change master to master_host='10.137.143.151',master_user='repl',master_password='repl123456',master_log_file='mysql-bin.002205',master_log_pos=456584891;"
# mysql -uroot -e "start slave;"
# mysql -uroot -e "show slave status\G;"
出現(xiàn)如下信息:
看來是存在主鍵沖突,導(dǎo)致主從復(fù)制失敗。
問題分析:
在主DB(10.137.143.151)上執(zhí)行:
# mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS mysql-bin.002205 > mysql-bin.002205.txt
# grep -C 8 529864938 mysql-bin.002205.txt
大概的意思是,在主DB上存在對t_evil_detect_uin_blacklist表的insert操作時,發(fā)生了主鍵沖突,當(dāng)在從端進行同步的時候,也出現(xiàn)了主鍵沖突,從而導(dǎo)致主從同步失敗。
臨時的解決辦法:
導(dǎo)出從端的表TaeOss.t_evil_detect_uin_blacklist
# mysqldump -uroot --opt TaeOss t_evil_detect_uin_blacklist > TaeOss.t_evil_detect_uin_blacklist.sql
去掉TaeOss.t_evil_detect_uin_blacklist.sql其中的主鍵語句:
然后再導(dǎo)入:
# mysql -uroot TaeOss < TaeOss.t_evil_detect_uin_blacklist.sql
# mysql -uroot -e "stop slave;"
# mysql -uroot -e "start slave;"
# mysql -uroot -e "show slave status\G;"