參考網(wǎng)址:http://blog.csdn.net/yjf2013/article/details/38321609
A、MySQL雙機(jī)熱備份概述
雙機(jī)熱備就是使用MySQL提供的一種主從備份機(jī)制實(shí)現(xiàn)。所謂雙機(jī)熱備其實(shí)是一個(gè)復(fù)制的過程,復(fù)制過程中一個(gè)服務(wù)器充當(dāng)主服務(wù)器,一個(gè)或多個(gè)服務(wù)器充當(dāng)從服務(wù)乖寒。這個(gè)復(fù)制的過程實(shí)質(zhì)上是從服務(wù)器復(fù)制主服務(wù)器上MySQL的二進(jìn)制日志(bin-log),并在從服務(wù)器上還原主服務(wù)器上的操作。
雙機(jī)熱備的實(shí)現(xiàn)需要MySQL的版本高于3.2钉蒲。另外由于這種備份是基于MySQL二進(jìn)制日志實(shí)現(xiàn),所以主從服務(wù)器上的MySQL版本最好能夠一樣彻坛,至少?gòu)姆?wù)器的MySQL版本不可以低于主服務(wù)器的數(shù)據(jù)庫版本顷啼。因?yàn)镸ySQL不同的版本之間二進(jìn)制日志可能不一樣。
假設(shè)主服務(wù)器A(master)钙蒙、從服務(wù)器為B(slave)。兩服務(wù)器Ip為:A——192.168.0.2间驮,B——192.168.0.3躬厌。本文服務(wù)器A采用windows操作系統(tǒng),服務(wù)器B采用centos 6.4竞帽,目的是為了一次說明windows和Linux不同環(huán)境中的配置扛施。
在主服務(wù)器A上創(chuàng)建一個(gè)username和password供從服務(wù)器B訪問時(shí)使用。在MySQL命令行下輸入mysql>GRANT FILE,SELECT,REPLICATION SLAVE ON *.* TO backup@192.168.0.3 IDENTIFIED BY'123456';
將A上已有的數(shù)據(jù)備份到B上屹篓,以便主從數(shù)據(jù)庫建立的時(shí)候兩個(gè)數(shù)據(jù)庫的數(shù)據(jù)保持一致(這里復(fù)制的方法有很多疙渣,但必須保證兩個(gè)數(shù)據(jù)庫的數(shù)據(jù)完全相同)。
主服務(wù)器A是windows操作系統(tǒng)堆巧,其mysql配置文件在mysql安裝目錄下的my.ini文件妄荔。我們對(duì)主服務(wù)器的配置都在my.ini中。
停止A服務(wù)器上的mysql服務(wù)恳邀,打開my.ini配置文件懦冰。在my.ini中找到[mysqld],并在[mysqld]區(qū)域內(nèi)做如下修改:
[mysqld]
server-id=1#是1~2^23-1內(nèi)的唯一值且不能與B或其它slave服務(wù)中的配置相同
log-bin = bin_log#日志文件以bin_log為前綴,如果不給log-bin賦值,日志文件將以#master-server-hostname為前綴
binlog-ignore-db= test#日志文件跳過的數(shù)據(jù)庫(可選屬性 ),如果有多個(gè)數(shù)據(jù)庫谣沸,可以重復(fù)配置這個(gè)屬性
binlog-do-db= qxpt_demo#日志文件操作的數(shù)據(jù)庫(可選屬性 刷钢,默認(rèn)所有數(shù)據(jù)庫的相關(guān)操作都寫入二進(jìn)制日志文件) ,如果有多個(gè)數(shù)據(jù)庫,可以重復(fù)配置這個(gè)屬性
配置完上面選項(xiàng)后乳附,重啟A上的MySQL服務(wù)内地,這時(shí)候A上所有對(duì)qxpt_demo數(shù)據(jù)庫的更新操作都會(huì)被記錄到二進(jìn)制日志中伴澄。
本文中slave所在的B服務(wù)器是linux環(huán)境,其MySQL配置文件在/etc/my.cnf中阱缓。
在slave的my.cnf中 [mysqld]非凌,并在其中做如下配置:
[mysqld]
server-id=2#唯一并與主服務(wù)器上的server-id不同。
replicate-do-db= qxpt_demo#復(fù)制操作要針對(duì)的數(shù)據(jù)庫(可選荆针,默認(rèn)為全部)敞嗡,同樣如果有多個(gè)數(shù)據(jù)庫則可配置多次本屬性。
步驟六:重啟并對(duì)slave進(jìn)行設(shè)置
重啟B服務(wù)器上的MySQL服務(wù)航背,用mysql -uroot -p 登錄MySQL喉悴,并執(zhí)行如下命令:
mysql> change master to \
-> master_host='192.168.0.2',//主服務(wù)器的IP地址
-> master_user='backup',//同步數(shù)據(jù)庫的用戶
-> master_password=’123456’;//同步數(shù)據(jù)庫的密碼
注:MySQL 5.1.7之前上面命令中的參數(shù)都可以在my.cnf配置文件的[mysqld]區(qū)域中配置。
步驟七:重啟并對(duì)slave進(jìn)行設(shè)置
MySQL中執(zhí)行show slavestatus玖媚;命令查看slave狀態(tài):
這時(shí)候slave還未啟動(dòng)箕肃,我們只要在MySQL中執(zhí)行slave start; 即可啟動(dòng)slave。這時(shí)候slave_io_running和slave_sql_runing的值都應(yīng)該變?yōu)閥es今魔。
經(jīng)過以上六個(gè)步驟我們就可以實(shí)現(xiàn)從A到B的單向熱備份勺像。這時(shí)候我們對(duì)A中qxpt_demo數(shù)據(jù)庫進(jìn)行修改等影響數(shù)據(jù)庫數(shù)據(jù)及結(jié)構(gòu)的操作會(huì)被復(fù)制到B中。
MySQL的雙機(jī)熱備份是一個(gè)異步的復(fù)制(replication)吟宦,slave的備份數(shù)據(jù)實(shí)際上就是從master端獲取其binlog日志后,在自己身上完全順序的執(zhí)行日志中記錄的各種操作涩维。實(shí)現(xiàn)整個(gè)復(fù)制操作主要由三個(gè)步驟:
(1) master將改變記錄到二進(jìn)制日志(bin-log)中督函;
(2)slave將master的bin-log拷貝到它的中繼日志(relay log);
(3) slave重做中繼日志中的事件激挪,將改變反映它自己的數(shù)據(jù)辰狡。
在網(wǎng)上找了一個(gè)個(gè)人感覺比較好的圖,如下:
結(jié)合本圖可以看出雙機(jī)熱備的具體步驟如下:
(1)在每個(gè)事務(wù)更新數(shù)據(jù)完成之前垄分,master在二日志記錄這些改變宛篇。MySQL將事務(wù)串行的寫入二進(jìn)制日志,在事件寫入二進(jìn)制日志完成后薄湿,提交事物叫倍。
(2)slave開始一個(gè)工作線程——I/O線程。slave的io進(jìn)程鏈接到master后豺瘤,向master請(qǐng)求指定位置的日志內(nèi)容吆倦。
(3) master接受到slave的請(qǐng)求后,通過master的io讀取指定日志內(nèi)容及bin-log文件的相關(guān)信息(slave status中Master_Log_File和Read_Master_Log_Pos屬性)坐求,并返回給slave的io進(jìn)程蚕泽。
(4)slave接收到信息后,將接受到的日志內(nèi)容依次添加到slave端的relay-log(在MySQLdata目錄中)的最末端,并讀取master傳過來的bin-log文件信息须妻,將bin-log的文件信息存到master.info文件中仔蝌,以便下一次請(qǐng)求能夠清楚的告訴master需要讀取bin-log的哪個(gè)位置開始往后的日志內(nèi)容。
(5)slave的sql進(jìn)程檢測(cè)到relay-log中新增內(nèi)容后荒吏,會(huì)立刻解析relay-log的內(nèi)容敛惊,將其解析成在master端真實(shí)執(zhí)行的那些可執(zhí)行內(nèi)容,并在slave自身執(zhí)行绰更。