MySQL中的複製

mi_zy發表於2012-03-04

MySQL複製基於主伺服器在二進位制日誌中跟蹤所有對資料庫的更改(更新、刪除等等)。因此,要進行復制,必須在主伺服器上啟用二進位制日誌。

MySQL支援單向、非同步複製,複製過程中一個伺服器充當主伺服器,而一個或多個其它伺服器充當從伺服器。

主伺服器將更新寫入二進位制日誌檔案,並維護檔案的一個索引以跟蹤日誌迴圈。這些日誌可以記錄傳送到從伺服器的更新。當一個從伺服器連線主伺服器時,它通知主伺服器從伺服器在日誌中讀取的最後一次成功更新的位置。從伺服器接收從那時起發生的任何更新,然後封鎖並等待主伺服器通知新的更新。

每個從伺服器從主伺服器接收主伺服器已經記錄到其二進位制日誌的儲存的更新,以便從伺服器可以對其資料複製執行相同的更新。

認識到二進位制日誌只是一個從啟用二進位制日誌的固定時間點開始的記錄非常重要。任何設定的從伺服器需要主伺服器上的在主伺服器上啟用二進位制日誌時的資料庫複製。如果啟動從伺服器時,其資料庫與主伺服器上的啟動二進位制日誌時的狀態不相同,從伺服器很可能失敗。

從伺服器設定為複製主伺服器的資料後,它連線主伺服器並等待更新過程。如果主伺服器失敗,或者從伺服器失去與主伺服器之間的連線,從伺服器保持定期嘗試連線,直到它能夠繼續幀聽更新。由--master-connect-retry選項控制重試間隔。 預設為60秒。

將主伺服器的資料複製到從伺服器的一個途徑是使用LOAD DATA FROM MASTER語句。請注意LOAD DATA FROM MASTER目前只在所有表使用MyISAM儲存引擎的主伺服器上工作。並且,該語句將獲得全域性讀鎖定,因此當表正複製到從伺服器上時,不可能在主伺服器上進行更新。當我們執行表的無鎖熱備份時,則不再需要全域性讀鎖定。由於這些限制,我們建議只有主伺服器上的資料集相對較小,或者主伺服器上延遲讀鎖定已經被接受,才可以使用LOAD DATA FROM MASTER

如果你想要設定鏈式複製伺服器,從伺服器本身也可以充當主伺服器。

請注意當你進行復制時,所有對複製中的表的更新必須在主伺服器上進行。否則,你必須要小心,以避免使用者對主伺服器上的表進行的更新與對從伺服器上的表所進行的更新之間的衝突。

單向複製有利於健壯性、速度和系統管理

日誌檔案

記入檔案中的資訊型別

錯誤日誌

記錄啟動、執行或停止mysqld時出現的問題。

查詢日誌

記錄建立的客戶端連線和執行的語句。

更新日誌

記錄更改資料的語句。不贊成使用該日誌。

二進位制日誌

記錄所有更改資料的語句。還用於複製。

慢日誌

記錄所有執行時間超過long_query_time秒的所有查詢或不使用索引的查詢。

如果你正使用MySQL複製功能,從複製伺服器將維護更多日誌檔案,被稱為接替日誌。

二進位制日誌的主要目的是在恢復使能夠最大可能地更新資料庫,因為二進位制日誌包含備份後進行的所有更新。二進位制日誌還用於在主複製伺服器上記錄所有將傳送給從伺服器的語句。

MySQL使用3個執行緒來執行復制功能(其中1個在主伺服器上,另兩個在從伺服器上。當發出START SLAVE時,從伺服器建立一個I/O執行緒,以連線主伺服器並讓它傳送記錄在其二進位制日誌中的語句。主伺服器建立一個執行緒將二進位制日誌中的內容傳送到從伺服器。該執行緒可以識別為主伺服器上SHOW PROCESSLIST的輸出中的Binlog Dump執行緒。從伺服器I/O執行緒讀取主伺服器Binlog Dump執行緒傳送的內容並將該資料複製到從伺服器資料目錄中的本地檔案中,即中繼日誌。第3個執行緒是SQL執行緒,是從伺服器建立用於讀取中繼日誌並執行日誌中包含的更新。

在前面的描述中,每個從伺服器有3個執行緒。有多個從伺服器的主伺服器建立為每個當前連線的從伺服器建立一個執行緒;每個從伺服器有自己的I/OSQL執行緒。

這樣讀取和執行語句被分成兩個獨立的任務。如果語句執行較慢則語句讀取任務沒有慢下來。例如,如果從伺服器有一段時間沒有執行了,當從伺服器啟動時,其I/O執行緒可以很快地從主伺服器索取所有二進位制日誌內容,即使SQL執行緒遠遠滯後。如果從伺服器在SQL執行緒執行完所有索取的語句前停止,I/O 執行緒至少已經索取了所有內容,以便語句的安全複製儲存到本地從伺服器的中繼日誌中,供從伺服器下次啟動時執行。這樣允許清空主伺服器上的二進位制日誌,因為不再需要等候從伺服器來索取其內容。

SHOW PROCESSLIST語句可以提供在主伺服器上和從伺服器上發生的關於複製的資訊。

如果MySQL伺服器為從複製伺服器,則無論選擇什麼備份方法,當備份從機資料時,還應備份master.inforelay-log.info檔案。恢復了從機資料後,需要這些檔案來繼續複製。如果從機執行復制LOAD DATA INFILE命令,你應還備份用--slave-load-tmpdir選項指定的目錄中的SQL_LOAD-*檔案。(如果未指定,該位置預設為tmpdir變數值)從機需要這些檔案來繼續複製中斷的LOAD DATA INFILE操作。

如果必須恢復MyISAM表,先使用REPAIR TABLEmyisamchk -r來恢復。99.9%的情況下該方法可以工作。如果myisamchk失敗,試試下面的方法。請注意只有用--log-bin選項啟動了MySQL從而啟用二進位制日誌它才工作.

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7970627/viewspace-717661/,如需轉載,請註明出處,否則將追究法律責任。

相關文章