複製的工作原理是將數據庫修改事件記錄到bin log中並傳遞到slave,然後slave在本地還原的過程。MySql複製的粒度可以是主庫上的所有數據庫也可以是指定的一個或多個數據庫,也可以是一個數據庫中的某些表。事件記錄到bin log的格式有以下三種:
a、基於語句的複製statement(statement based replication):主庫將sql語句寫入到bin log中。
優勢:技術成熟,應用廣泛,節省空間,可以查看sql語句;
劣勢:某些特定的語句容易出問題,比如在語句中包含自定義函數或者不確定性的存儲過程,rand(),sysdate(),version()
b、基於行數據的複製row (row based replication):主庫將每一行的數據變化信息(修改前和修改後的數據信息)作爲事件寫入到bin log中。
優勢:所有的數據庫修改都可以被複制,是一種安全的複製方式,由於是行復制,某些語句在執行上需要較少的lock。
劣勢:bin log日誌數據量會更大,有可能延遲時間更長。建議只對InnoDB表做行復制,MyISAM可能會出現異常。
c、混合複製mixed(mixed based replication):上面兩者的結合,默認優先使用基於語句的複製,只有當部分語句如果基於語句複製不安全的情況下才會自動切換爲基於行數據的複製。例如:同一條語句執行多次的結果可能不一致。
1、MySql複製的用途:
a、擴展能力(高性能):通過複製實現一主多從架構,分擔主庫壓力;這要求所有的增刪改操作在主庫上操作。讀操作在從庫上執行,從而提升MySql的讀寫性能。
b、容災能力(高可用):通過複製實現主備架構,當主庫服務器宕機後立馬切換到備庫,從而降低對業務的影響。
c、數據庫備份:通過複製實現主備架構(延遲複製),當主庫誤操作之後,可以在延遲複製時間內在備庫找到原數據。
d、數據分析和報表:通過複製實現主從架構,將數據分析和報表等耗時、耗性能的操作在從庫上執行。
2、MySql複製的兩種方法:
a、傳統方式:基於主庫的bin log日誌事件和事件位置複製到從庫,從庫再加以應用以達到主從同步的目的。
b、Gtid方式:global transaction identifers是基於事務來複制數據,不依賴日誌文件,也能更好的保證主從庫數據一致性。
3、MySQL複製的類型:
a、異步複製:一主多從,數據異步同步到從庫。
b、同步複製:MySql Cluster中特有的複製方式,確保數據已經同步到至少一個從庫上了。
c、半同步複製:在異步複製的基礎上,確保任何一個主庫上的事務在提交之前至少有一個從庫已經收到該事務並以日誌記錄下來
d、延遲複製:在異步複製的基礎上,人爲設定主庫和從庫的數據同步延遲時間,即保證數據延遲至少是這個參數。如果不小心在主庫上刪了數據,可以在延遲時間之內根據從庫找到刪除掉的數據。