在設定線上伺服器的複製模式之前,務必了解一些複製的關鍵概念。本節說明這些概念,在嘗試修改線上伺服器的複製模式之前,這是必要的閱讀。
MySQL 中可用的複製模式依賴不同的技術來識別已記錄的交易。複製使用的交易類型在此處列出
GTID 交易由全域交易識別碼 (GTID) 識別,該識別碼採用兩種形式之一:
UUID:NUMBER
或UUID:TAG:NUMBER
。二進位日誌中的每個 GTID 交易之前都有一個Gtid_log_event
。GTID 交易可以透過其 GTID 或透過記錄該交易的檔案名稱及其在該檔案中的位置來定址。匿名交易沒有 GTID;MySQL 8.4 確保日誌中的每個匿名交易之前都有一個
Anonymous_gtid_log_event
。(在舊版的 MySQL 中,匿名交易之前沒有任何特定事件。)匿名交易只能透過檔案名稱和位置來定址。
當使用 GTID 時,您可以利用 GTID 自動定位和自動容錯移轉,並使用 WAIT_FOR_EXECUTED_GTID_SET()
、session_track_gtids
和 Performance Schema 表格來監控複製的交易(請參閱第 29.12.11 節,「Performance Schema 複製表格」)。
來自執行舊版 MySQL 的來源的中繼日誌中的交易可能沒有任何特定事件,但在副本的二進位日誌中重新執行並記錄後,它會以 Anonymous_gtid_log_event
作為前導。
若要線上變更複製模式,必須使用具有足夠權限設定全域系統變數的帳戶來設定 gtid_mode
和 enforce_gtid_consistency
變數;請參閱第 7.1.9.1 節「系統變數權限」。這裡依序列出 gtid_mode
的允許值,以及它們的意義:
OFF
:僅可以複製匿名交易。OFF_PERMISSIVE
:新的交易是匿名的;複製的交易可能是 GTID 或匿名的。ON_PERMISSIVE
:新的交易使用 GTID;複製的交易可能是 GTID 或匿名的。ON
:所有交易都必須有 GTID;不能複製匿名交易。
在同一個複製拓撲中,有可能有使用匿名交易的伺服器和使用 GTID 交易的伺服器。例如,gtid_mode=ON
的來源可以複製到 gtid_mode=ON_PERMISSIVE
的複本。
從使用 gtid_mode=ON
的來源進行複製,可以利用 GTID 自動定位,使用 SOURCE_AUTO_POSITION
選項來設定 CHANGE REPLICATION SOURCE TO
陳述式。正在使用的複製拓撲會影響是否可以啟用自動定位,因為此功能依賴 GTID,且與匿名交易不相容。強烈建議在啟用自動定位之前,確保拓撲中沒有剩餘的匿名交易;請參閱第 19.1.4.2 節「線上啟用 GTID 交易」。
下表顯示來源和複本上 gtid_mode
和自動定位的有效組合。每個條目的意義如下:
表 19.1 來源和複本 gtid_mode 的有效組合
來源 |
來源 |
來源 |
來源 |
|
---|---|---|---|---|
複本 |
Y |
Y |
N |
N |
複本 |
Y |
Y |
Y |
Y* |
複本 |
Y |
Y |
Y |
Y* |
複本 |
N |
N |
Y |
Y* |
gtid_mode
的目前值也會影響 gtid_next
。下表顯示伺服器在 gtid_mode
和 gtid_next
不同值組合下的行為。每個條目的意義如下:
ANONYMOUS
:產生匿名交易。Error
:產生錯誤,且不執行SET GTID_NEXT
。UUID:NUMBER
:產生具有指定 UUID:NUMBER 的 GTID。UUID:TAG:NUMBER
:產生具有指定 UUID:TAG:NUMBER 的 GTID。New GTID
:產生具有自動產生數字的 GTID。
表 19.2 gtid_mode 和 gtid_next 的有效組合
gtid_next = AUTOMATIC (二進位日誌開啟) |
gtid_next = AUTOMATIC (二進位日誌關閉) |
gtid_next = AUTOMATIC:<TAG> |
gtid_next = ANONYMOUS |
gtid_next = <UUID>:<NUMBER> |
gtid_next = <UUID>:<TAG>:<NUMBER> |
|
---|---|---|---|---|---|---|
gtid_mode = OFF |
ANONYMOUS | ANONYMOUS | Error | ANONYMOUS | Error | Error |
gtid_mode = OFF_PERMISSIVE |
ANONYMOUS | ANONYMOUS | Error | ANONYMOUS | ANONYMOUS | Error |
gtid_mode = ON_PERMISSIVE |
New GTID | ANONYMOUS | New GTID | ANONYMOUS | ANONYMOUS | Error |
gtid_mode = ON |
New GTID | ANONYMOUS | New GTID | Error | ANONYMOUS | Error |
當未使用二進位日誌,且 gtid_next
為 AUTOMATIC
時,不會產生 GTID。