MySQL支持兩種復制方式:基于行的復制和基于語句的復制。這兩種方式的工作步驟:
1.在主庫上把數(shù)據(jù)更改記錄到二進制日志(Binary Log)中。
2.從庫將主庫上的日志復制到自己的中繼日志(Relay Log)中。
3.從庫讀取中繼日志中的事件,將其重放到從庫數(shù)據(jù)之上。
第一步,在主庫上記錄二進制日志。在每次準備提交事務完成數(shù)據(jù)更新前,主庫將數(shù)據(jù)更新的事件記錄到二進制日志中。MySQL會按事務提交的順序而非每條語句的執(zhí)行順序來記錄二進制日志。在記錄二進制日志后,主庫會告訴存儲引擎可以提交事務了。
第二步,從庫將主庫的二進制日志復制到其本地的中繼日志中。首先,從庫會啟動一個工作線程,成為I/O線程,I/O線程跟主庫建立一個普通的客戶端連接。
然后在主庫上啟動一個特殊的二進制轉(zhuǎn)儲(binlog dump)線程(該線程沒有對應的SQL命令),這個二進制轉(zhuǎn)儲線程會讀取主庫上二進制日志中的事件。
它不會對事件進行輪詢。如果該線程追趕上了主庫,它將進入睡眠狀態(tài),直到主庫發(fā)送信號通知其有新的事件產(chǎn)生時才會被喚醒,從庫I/O線程會將接收到的事件記錄到中繼日志中。
從庫的SQL線程執(zhí)行最后一步,該線程從中繼日志中讀取事件并在從庫執(zhí)行,從而實現(xiàn)從庫數(shù)據(jù)的更新。當SQL線程追趕上I/O線程時,中繼日志通常已經(jīng)在系統(tǒng)緩存中,所以中繼日志的開銷很低。SQL線程執(zhí)行的事件也可以通過配置選項來決定是否寫入其自己的二進制日志中。
MySQL會賦予特殊權(quán)限給復制進程。在從庫運行I/O線程會建立一個到主庫的TCP/IP連接,這意味著必須在主庫創(chuàng)建一個用戶,并賦予其合適的權(quán)限。從庫I/O線程以該用戶名連接到主庫并讀取其二進制日志。
通過如下語句創(chuàng)建用戶賬號:
mysql>GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.*
->TO repl@'192.168.0.%' IDENTIFIED BY'123456',;
在主庫和從庫都創(chuàng)建該賬號。我們把這個賬號限制在本地網(wǎng)絡,因為這是一個特權(quán)賬號。
下一步需要在主庫上開啟一些設置,假設主庫是服務器server1,需要打開二進制日志并指定一個獨一無二的服務器ID(server ID),在主庫的 my.cnf文件中增加或修改如下內(nèi)容:
必須明確的指定一個唯一的服務器ID,默認服務器ID通常為1,使用默認值可能會導致和其他服務器ID沖突,因此這里我們選擇10來作為服務器ID。
如果之前沒有在MySQL的配置文件中指定logbin選項,就需要重新啟動MySQL.為了確認二進制日志文件是否已經(jīng)在主庫上創(chuàng)建,使用SHOW MASTER STATUS命令,檢查輸入是否與如下的一致,如圖1所示。
從庫上也需要在my.cnf中增加類似的配置,并且同樣需要重啟服務器。
圖1 使用SHOW MASTER STATUS命令
圖2 SHOW SLAVE STATUS命令
下一步是告訴從庫如何連接到主庫并重放其二進制日志。這一步不要通過修改my.cnf來配置,而是使用CHANGE MASTER TO語句,該語句完全替代了my.cnf中相應的設置,并且允許以后指向別的主庫時無需重啟從庫。下面是開始復制的基本命令:
MASTER_LOG_POS參數(shù)設置為0,因為要從日志的開頭讀起。運行下面的命令開始復制:
執(zhí)行該命令沒有顯示錯誤,我們可用SHOW SLAVE STATUS命令來檢查復制是否正確執(zhí)行,如圖2所示。
在這里主要是看:
Slave的I/O和SQL線程都已經(jīng)開始運行,而且Seconds_Behind_Master不再是NULL。日志的位置增加了,意味著一些事件被獲取并執(zhí)行了。如果你在主庫上進行修改,你可以在從庫上看到各種日志文件的位置的變化,同樣,你也可以看到數(shù)據(jù)庫中數(shù)據(jù)的變化。
現(xiàn)在MySQL的主從架構(gòu)的復制模式已經(jīng)配置成功了,數(shù)據(jù)庫的承載能力得到進一步提升。