複製之所以運作,是因為寫入二進位日誌的事件會從來源讀取,然後在複本上處理。事件會根據事件的類型以不同的格式記錄在二進位日誌中。所使用的不同複製格式對應於在來源的二進位日誌中記錄事件時所使用的二進位日誌記錄格式。二進位日誌記錄格式與複製期間所用術語之間的關聯如下
當使用基於語句的二進位日誌記錄時,來源會將 SQL 陳述式寫入二進位日誌。來源到複本的複製會透過在複本上執行 SQL 陳述式來運作。這稱為基於語句的複製(可簡稱為 SBR),這對應於 MySQL 基於語句的二進位日誌記錄格式。
當使用基於列的日誌記錄時,來源會將事件寫入二進位日誌,以指示個別資料表列如何變更。來源到複本的複製會透過將代表資料表列變更的事件複製到複本來運作。這稱為基於列的複製(可簡稱為 RBR)。
基於列的日誌記錄是預設方法。
您也可以設定 MySQL 以使用基於語句和基於列的日誌記錄的混合,具體取決於哪種最適合要記錄的變更。這稱為混合格式日誌記錄。當使用混合格式日誌記錄時,預設會使用基於語句的日誌。根據某些陳述式,以及所使用的儲存引擎,日誌會自動在特定情況下切換為基於列的日誌。使用混合格式的複製稱為混合式複製或混合格式複製。如需詳細資訊,請參閱第 7.4.4.3 節「混合二進位日誌記錄格式」。
NDB叢集。在 MySQL NDB 叢集 8.4 中,預設的二進位日誌格式為 ROW
。NDB 叢集複製使用以列為基礎的複製;NDB
儲存引擎與以陳述式為基礎的複製不相容。如需更多資訊,請參閱第 25.7.2 節,「NDB 叢集複製的一般需求」。
當使用 MIXED
格式時,二進位日誌格式部分取決於所使用的儲存引擎和正在執行的陳述式。如需有關混合格式日誌記錄以及有關支援不同日誌格式的規則的更多資訊,請參閱第 7.4.4.3 節,「混合二進位日誌格式」。
執行中的 MySQL 伺服器中的日誌格式,是由設定 binlog_format
伺服器系統變數來控制的。這個變數可以設定為會話或全域範圍。新設定何時生效以及如何生效的規則,與其他 MySQL 伺服器系統變數相同。為目前會話設定變數僅持續到該會話結束,並且變更對其他會話不可見。全域設定變數對變更後連線的用戶端生效,但不適用於任何目前的用戶端會話,包括變更變數設定的會話。若要使全域系統變數設定永久生效,以便在伺服器重新啟動後仍然適用,您必須在選項檔案中設定它。如需更多資訊,請參閱第 15.7.6.1 節,「用於變數指派的 SET 語法」。
在某些條件下,您無法在執行期間變更二進位日誌格式,否則會導致複製失敗。請參閱第 7.4.4.2 節,「設定二進位日誌格式」。
變更全域 binlog_format
值,需要有足夠的權限來設定全域系統變數。變更會話 binlog_format
值,需要有足夠的權限來設定受限制的會話系統變數。請參閱第 7.1.9.1 節,「系統變數權限」。
變更二進位日誌格式 (binlog_format
系統變數) 在 MySQL 8.0 中已棄用;在未來版本的 MySQL 中,您可以預期 binlog_format
將完全移除,而以列為基礎的格式將成為 MySQL 使用的唯一日誌記錄格式。
以陳述式為基礎和以列為基礎的複製格式有不同的問題和限制。如需比較它們的相對優缺點,請參閱第 19.2.1.1 節,「以陳述式為基礎和以列為基礎的複製的優缺點」。
使用以陳述式為基礎的複製時,您可能會遇到複製預存常式或觸發程式的問題。您可以改用以列為基礎的複製來避免這些問題。如需更多資訊,請參閱第 27.7 節,「預存程式二進位日誌記錄」。