複製的運作原理是,寫入二進制日誌的事件會從來源讀取,然後在複本上處理。事件會根據事件類型,以不同的格式記錄在二進制日誌中。所使用的不同複製格式對應於事件記錄在來源二進制日誌中時所使用的二進制日誌格式。二進制日誌格式與複製期間使用的術語之間的關聯為
使用基於陳述式的二進制日誌時,來源會將 SQL 陳述式寫入二進制日誌。來源到複本的複製運作方式是在複本上執行 SQL 陳述式。這稱為基於陳述式的複製(可以簡寫為SBR),這對應於 MySQL 基於陳述式的二進制日誌格式。
使用基於列的日誌時,來源會將事件寫入二進制日誌,這些事件會指出如何變更個別資料表列。來源到複本的複製運作方式是將代表資料表列變更的事件複製到複本。這稱為基於列的複製(可以簡寫為RBR)。
基於列的日誌是預設方法。
您也可以將 MySQL 設定為同時使用基於陳述式和基於列的日誌,視記錄的變更最適合哪種方式而定。這稱為混合格式日誌。使用混合格式日誌時,預設會使用基於陳述式的日誌。根據某些陳述式,以及所使用的儲存引擎,日誌會在特定情況下自動切換為基於列的日誌。使用混合格式的複製稱為基於混合的複製或混合格式複製。如需更多資訊,請參閱第 7.4.4.3 節「混合二進制日誌格式」。
NDB 叢集。 在 MySQL NDB 叢集 9.0 中,預設二進制日誌格式為 ROW
。NDB 叢集複製使用基於列的複製;NDB
儲存引擎與基於陳述式的複製不相容。如需更多資訊,請參閱第 25.7.2 節「NDB 叢集複製的一般要求」。
當使用 MIXED
格式時,二進位日誌格式部分取決於所使用的儲存引擎和正在執行的語句。有關混合格式日誌記錄以及管理不同日誌格式支援的規則的更多資訊,請參閱第 7.4.4.3 節「混合二進位日誌格式」。
執行中 MySQL 伺服器中的日誌記錄格式由設定 binlog_format
伺服器系統變數來控制。這個變數可以使用會話或全域範圍設定。管理新設定何時以及如何生效的規則與其他 MySQL 伺服器系統變數相同。為目前會話設定變數僅持續到該會話結束,並且該變更對其他會話不可見。全域設定變數對變更後連線的用戶端生效,但對任何目前的用戶端會話(包括變數設定變更的會話)無效。要使全域系統變數設定永久生效,以便在伺服器重新啟動時套用,您必須在選項檔案中設定它。如需更多資訊,請參閱第 15.7.6.1 節「設定變數語法」。
在某些情況下,您無法在執行時變更二進位日誌格式,或這樣做會導致複製失敗。請參閱第 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.8 節「預存程式二進位日誌記錄」。