MySQL支持兩種復(fù)制方式:基于行的復(fù)制和基于語句的復(fù)制。這兩種方式的工作步驟:
1.在主庫上把數(shù)據(jù)更改記錄到二進(jìn)制日志(Binary Log)中。
2.從庫將主庫上的日志復(fù)制到自己的中繼日志(Relay Log)中。
3.從庫讀取中繼日志中的事件,將其重放到從庫數(shù)據(jù)之上。
第一步,在主庫上記錄二進(jìn)制日志。在每次準(zhǔn)備提交事務(wù)完成數(shù)據(jù)更新前,主庫將數(shù)據(jù)更新的事件記錄到二進(jìn)制日志中。MySQL會(huì)按事務(wù)提交的順序而非每條語句的執(zhí)行順序來記錄二進(jìn)制日志。在記錄二進(jìn)制日志后,主庫會(huì)告訴存儲(chǔ)引擎可以提交事務(wù)了。
第二步,從庫將主庫的二進(jìn)制日志復(fù)制到其本地的中繼日志中。首先,從庫會(huì)啟動(dòng)一個(gè)工作線程,成為I/O線程,I/O線程跟主庫建立一個(gè)普通的客戶端連接。
然后在主庫上啟動(dòng)一個(gè)特殊的二進(jìn)制轉(zhuǎn)儲(chǔ)(binlog dump)線程(該線程沒有對(duì)應(yīng)的SQL命令),這個(gè)二進(jìn)制轉(zhuǎn)儲(chǔ)線程會(huì)讀取主庫上二進(jìn)制日志中的事件。
它不會(huì)對(duì)事件進(jìn)行輪詢。如果該線程追趕上了主庫,它將進(jìn)入睡眠狀態(tài),直到主庫發(fā)送信號(hào)通知其有新的事件產(chǎn)生時(shí)才會(huì)被喚醒,從庫I/O線程會(huì)將接收到的事件記錄到中繼日志中。
從庫的SQL線程執(zhí)行最后一步,該線程從中繼日志中讀取事件并在從庫執(zhí)行,從而實(shí)現(xiàn)從庫數(shù)據(jù)的更新。當(dāng)SQL線程追趕上I/O線程時(shí),中繼日志通常已經(jīng)在系統(tǒng)緩存中,所以中繼日志的開銷很低。SQL線程執(zhí)行的事件也可以通過配置選項(xiàng)來決定是否寫入其自己的二進(jìn)制日志中。
MySQL會(huì)賦予特殊權(quán)限給復(fù)制進(jìn)程。在從庫運(yùn)行I/O線程會(huì)建立一個(gè)到主庫的TCP/IP連接,這意味著必須在主庫創(chuàng)建一個(gè)用戶,并賦予其合適的權(quán)限。從庫I/O線程以該用戶名連接到主庫并讀取其二進(jìn)制日志。
通過如下語句創(chuàng)建用戶賬號(hào):
mysql>GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.*
->TO repl@'192.168.0.%' IDENTIFIED BY'123456',;
在主庫和從庫都創(chuàng)建該賬號(hào)。我們把這個(gè)賬號(hào)限制在本地網(wǎng)絡(luò),因?yàn)檫@是一個(gè)特權(quán)賬號(hào)。
下一步需要在主庫上開啟一些設(shè)置,假設(shè)主庫是服務(wù)器server1,需要打開二進(jìn)制日志并指定一個(gè)獨(dú)一無二的服務(wù)器ID(server ID),在主庫的 my.cnf文件中增加或修改如下內(nèi)容:

必須明確的指定一個(gè)唯一的服務(wù)器ID,默認(rèn)服務(wù)器ID通常為1,使用默認(rèn)值可能會(huì)導(dǎo)致和其他服務(wù)器ID沖突,因此這里我們選擇10來作為服務(wù)器ID。
如果之前沒有在MySQL的配置文件中指定logbin選項(xiàng),就需要重新啟動(dòng)MySQL.為了確認(rèn)二進(jìn)制日志文件是否已經(jīng)在主庫上創(chuàng)建,使用SHOW MASTER STATUS命令,檢查輸入是否與如下的一致,如圖1所示。
從庫上也需要在my.cnf中增加類似的配置,并且同樣需要重啟服務(wù)器。



圖1 使用SHOW MASTER STATUS命令

圖2 SHOW SLAVE STATUS命令
下一步是告訴從庫如何連接到主庫并重放其二進(jìn)制日志。這一步不要通過修改my.cnf來配置,而是使用CHANGE MASTER TO語句,該語句完全替代了my.cnf中相應(yīng)的設(shè)置,并且允許以后指向別的主庫時(shí)無需重啟從庫。下面是開始復(fù)制的基本命令:


MASTER_LOG_POS參數(shù)設(shè)置為0,因?yàn)橐獜娜罩镜拈_頭讀起。運(yùn)行下面的命令開始復(fù)制:

執(zhí)行該命令沒有顯示錯(cuò)誤,我們可用SHOW SLAVE STATUS命令來檢查復(fù)制是否正確執(zhí)行,如圖2所示。
在這里主要是看:

Slave的I/O和SQL線程都已經(jīng)開始運(yùn)行,而且Seconds_Behind_Master不再是NULL。日志的位置增加了,意味著一些事件被獲取并執(zhí)行了。如果你在主庫上進(jìn)行修改,你可以在從庫上看到各種日志文件的位置的變化,同樣,你也可以看到數(shù)據(jù)庫中數(shù)據(jù)的變化。
現(xiàn)在MySQL的主從架構(gòu)的復(fù)制模式已經(jīng)配置成功了,數(shù)據(jù)庫的承載能力得到進(jìn)一步提升。