在設定線上伺服器的複寫模式之前,了解複寫的一些關鍵概念非常重要。本節說明這些概念,並且在嘗試修改線上伺服器的複寫模式之前必須閱讀。
MySQL 中可用的複寫模式依賴於不同的技術來識別已記錄的交易。此處列出了複寫所使用的交易類型
GTID 交易由全域交易識別碼 (GTID) 識別,它採用兩種形式之一:
UUID:NUMBER
或UUID:TAG:NUMBER
。二進位記錄檔中的每個 GTID 交易都以Gtid_log_event
開頭。GTID 交易可以透過其 GTID 或透過記錄它的檔案名稱及其在該檔案中的位置來定址。匿名交易沒有 GTID;MySQL 9.0 確保日誌中的每個匿名交易之前都有一個
Anonymous_gtid_log_event
。(在舊版本的 MySQL 中,匿名交易之前沒有任何特定的事件。)匿名交易只能透過檔案名稱和位置來定址。
當使用 GTID 時,您可以利用 GTID 自動定位和自動容錯移轉,並使用 WAIT_FOR_EXECUTED_GTID_SET()
、session_track_gtids
和效能架構資料表來監控複製的交易 (請參閱第 29.12.11 節「效能架構複寫資料表」)。
來自執行舊版 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 自動定位,並使用 CHANGE REPLICATION SOURCE TO
陳述式的 SOURCE_AUTO_POSITION
選項進行設定。使用中的複寫拓撲會影響是否可以啟用自動定位,因為此功能依賴 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 | 錯誤 | ANONYMOUS | 錯誤 | 錯誤 |
gtid_mode = OFF_PERMISSIVE |
ANONYMOUS | ANONYMOUS | 錯誤 | ANONYMOUS | <UUID>:<NUMBER> | <UUID>:<TAG>:<NUMBER> |
gtid_mode = ON_PERMISSIVE |
新的 GTID | ANONYMOUS | 新的 GTID | ANONYMOUS | <UUID>:<NUMBER> | <UUID>:<TAG>:<NUMBER> |
gtid_mode = ON |
新的 GTID | ANONYMOUS | 新的 GTID | 錯誤 | <UUID>:<NUMBER> | <UUID>:<TAG>:<NUMBER> |
當未使用二進制日誌,且 gtid_next
是 AUTOMATIC
時,則不會產生 GTID。