MySQL支援單向、非同步複製,複製過程中一個Linux伺服器充當主伺服器,而一個或多個其它伺服器充當從伺服器。主伺服器將更新寫入二進位記錄檔,並維護記錄檔的一個索引以追蹤記錄檔迴圈。當一個從伺服器串連到主伺服器時,它通知主伺服器從伺服器在日誌中讀取的最後一次成功更新的位置。從伺服器接收從那時起發生的任何更新,然後封鎖並等待主伺服器通知下一次更新。
為什麼使用主從複製?
1、主伺服器/從伺服器設定增加了健壯性。主伺服器出現問題時,你可以切換到從伺服器作為備份。
2、通過在主伺服器和從伺服器之間切分處理客戶查詢的負荷,可以得到更好的客戶回應時間。但是不要同時在主從伺服器上進行更新,這樣可能引起衝突。
3、使用複製的另一個好處是可以使用一個從伺服器執行備份,而不會干擾主伺服器。在備份過程中主伺服器可以繼續處理更新。
MySQL使用3個線程來執行複製功能(其中1個在主伺服器上,另兩個在從伺服器上。當發出START SLAVE時,從伺服器建立一個I/O線程,以串連主伺服器並讓主伺服器發送二進位日誌。主伺服器建立一個線程將二進位日誌中的內容發送到從伺服器。從伺服器I/O線程讀取主伺服器Binlog Dump線程發送的內容並將該資料拷貝到從伺服器資料目錄中的本地檔案中,即中繼日誌。第3個線程是SQL線程,從伺服器使用此線程讀取中繼日誌並執行日誌中包含的更新。SHOW PROCESSLIST語句可以查詢在主伺服器上和從伺服器上發生的關於複製的資訊。
預設中繼日誌使用host_name-relay-bin.nnnnnn形式的檔案名稱,其中host_name是從伺服器主機名稱,nnnnnn是序號。用連續序號來建立連續中繼記錄檔,從000001開始。從伺服器跟蹤中繼日誌索引檔案來識別目前正使用的中繼日誌。預設中繼日誌索引檔案名稱為host_name-relay-bin.index。在預設情況,這些檔案在從伺服器的資料目錄中被建立。中繼日誌與二進位日誌的格式相同,並且可以用MySQLbinlog讀取。當SQL線程執行完中繼日誌中的所有事件後,中繼日誌將會被自動刪除。
從伺服器在資料目錄中另外建立兩個狀態檔案--master.info和relay-log.info。狀態檔案儲存在硬碟上,從伺服器關閉時不會丟失。下次從伺服器啟動時,讀取這些檔案以確定它已經從主伺服器讀取了多少二進位日誌,以及處理自己的中繼日誌的程度。
設定主從複製:
1、確保在主伺服器和從伺服器上安裝的MySQL版本相同,並且最好是MySQL的最新穩定版本。
2、在主伺服器上為複製設定一個串連賬戶。該賬戶必須授予REPLICATION SLAVE許可權。如果賬戶僅用於複製(推薦這樣做),則不需要再授予任何其它許可權。
MySQL> GRANT REPLICATION SLAVE ON *.*
-> TO 'replication'@'%.yourdomain.com' IDENTIFIED BY 'slavepass';
3、執行FLUSH TABLES WITH READ LOCK語句清空所有表和塊寫入語句:
MySQL> FLUSH TABLES WITH READ LOCK;
保持MySQL用戶端程式不要退出。開啟另一個終端對主伺服器資料目錄做快照。
shell> cd /usr/local/MySQL/
shell> tar -cvf /tmp/MySQL-snapshot.tar ./data
如果從伺服器的使用者賬戶與主伺服器的不同,你可能不想複製MySQL資料庫。在這種情況下,應從歸檔中排除該資料庫。你也不需要在歸檔中包括任何記錄檔或者master.info或relay-log.info檔案。
當FLUSH TABLES WITH READ LOCK所置讀鎖定有效時(即MySQL用戶端程式不退出),讀取主伺服器上當前的二進位日誌名和位移量值:
MySQL > SHOW MASTER STATUS;
+---------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| MySQL-bin.003 | 73 | test | manual,MySQL |
+---------------+----------+--------------+------------------+
File列顯示日誌名,而Position顯示位移量。在該例子中,二進位日誌值為MySQL-bin.003,位移量為73。記錄該值。以後設定從伺服器時需要使用這些值。它們表示複製座標,從伺服器應從該點開始從主伺服器上進行新的更新。