本節所述的 MySQL 伺服器系統變數用於監控和控制全域交易識別碼 (GTID)。如需更多資訊,請參閱第 19.1.3 節,「使用全域交易識別碼進行複製」。
-
命令列格式 --binlog-gtid-simple-recovery[={OFF|ON}]
系統變數 binlog_gtid_simple_recovery
範圍 全域 動態 否 SET_VAR
提示語適用否 類型 布林值 預設值 ON
此變數控制在 MySQL 啟動或重新啟動時,搜尋 GTID 期間如何迭代二進制日誌檔案。
當
binlog_gtid_simple_recovery=TRUE
(預設值) 時,gtid_executed
和gtid_purged
的值會在啟動時根據最近和最舊二進位日誌檔案中的Previous_gtids_log_event
值計算得出。有關計算的說明,請參閱「gtid_purged
系統變數」。此設定在伺服器重新啟動期間僅存取兩個二進位日誌檔案。如果伺服器上的所有二進位日誌都是使用 MySQL 5.7.8 或更高版本產生的,則始終可以安全地使用binlog_gtid_simple_recovery=TRUE
。如果伺服器上存在來自 MySQL 5.7.7 或更早版本的任何二進位日誌 (例如,在將較舊伺服器升級到 MySQL 8.4 之後),且設定
binlog_gtid_simple_recovery=TRUE
,則在以下兩種情況下,gtid_executed
和gtid_purged
可能會初始化不正確:最新的二進位日誌是由 MySQL 5.7.5 或更早版本產生的,且
gtid_mode
對於某些二進位日誌為ON
,但對於最新的二進位日誌為OFF
。在 MySQL 5.7.7 或更早版本上發出了
SET @@GLOBAL.gtid_purged
語句,並且在SET @@GLOBAL.gtid_purged
語句發出時處於活動狀態的二進位日誌尚未清除。
如果在任何一種情況下計算出的 GTID 集不正確,即使伺服器稍後以
binlog_gtid_simple_recovery=FALSE
重新啟動,它仍然不正確。如果這些情況中的任何一種適用或可能適用於伺服器,請在啟動或重新啟動伺服器之前設定binlog_gtid_simple_recovery=FALSE
。當設定
binlog_gtid_simple_recovery=FALSE
時,如「gtid_purged
系統變數」中所述的gtid_executed
和gtid_purged
計算方法會更改為依序讀取二進位日誌檔案,如下所示:對於
gtid_executed
的計算,它會從最新的二進位日誌檔案開始迭代,並使用Previous_gtids_log_event
的值和第一個找到Previous_gtids_log_event
值的二進位日誌檔案中的任何 GTID 日誌事件,而不是使用來自最新的二進位日誌檔案中的Previous_gtids_log_event
值和 GTID 日誌事件。如果伺服器的最新二進位日誌檔案沒有 GTID 日誌事件,例如,如果使用了gtid_mode=ON
,但伺服器稍後更改為gtid_mode=OFF
,則此過程可能需要很長時間。對於
gtid_purged
的計算,它會從最舊的二進位日誌檔案開始迭代,並使用第一個找到非空Previous_gtids_log_event
值或至少一個 GTID 日誌事件 (表示 GTID 的使用從該點開始) 的二進位日誌檔案中的Previous_gtids_log_event
值,而不是使用來自最舊的二進位日誌檔案中的Previous_gtids_log_event
值。如果伺服器的較舊二進位日誌檔案沒有 GTID 日誌事件,例如,如果僅在最近才在伺服器上設定gtid_mode=ON
,則此過程可能需要很長時間。
-
命令列格式 --enforce-gtid-consistency[=value]
系統變數 enforce_gtid_consistency
範圍 全域 動態 是 SET_VAR
提示語適用否 類型 枚舉 預設值 OFF
有效值 OFF
ON
WARN
根據此變數的值,伺服器會強制執行 GTID 一致性,僅允許執行可以使用 GTID 安全記錄的語句。您必須在啟用基於 GTID 的複製之前,將此變數設定為
ON
。enforce_gtid_consistency
可以配置的值為:OFF
:允許所有交易違反 GTID 一致性。ON
:不允許任何交易違反 GTID 一致性。WARN
:允許所有交易違反 GTID 一致性,但在這種情況下會產生警告。
僅當語句發生二進位日誌記錄時,
--enforce-gtid-consistency
才會生效。如果伺服器上禁用了二進位日誌記錄,或者如果語句因為被篩選器刪除而未寫入二進位日誌,則不會檢查或強制執行未記錄語句的 GTID 一致性。當
enforce_gtid_consistency
設定為ON
時,只能記錄可以使用 GTID 安全語句記錄的語句,因此此處列出的操作不能與此選項一起使用:交易內的
CREATE TEMPORARY TABLE
或DROP TEMPORARY TABLE
語句。更新交易表和非交易表的交易或語句。如果所有非交易表都是暫時的,則允許在與交易 DML 相同的交易或語句中使用非交易 DML,但有一個例外。
對於支援原子 DDL 的儲存引擎,支援
CREATE TABLE ... SELECT
語句。
有關更多資訊,請參閱「第 19.1.3.7 節,使用 GTID 進行複製的限制」。
在 MySQL 5.7 之前以及該版本系列的早期版本中,布林值
enforce_gtid_consistency
的預設值為OFF
。為了保持與這些早期版本的相容性,枚舉的預設值為OFF
,並且不帶值的設定--enforce-gtid-consistency
會被解釋為將值設定為ON
。該變數還具有多個用於值的文字別名:0=OFF=FALSE
、1=ON=TRUE
、2=WARN
。這與其他枚舉類型不同,但保持與先前版本中使用的布林型別的相容性。這些變更會影響變數的傳回值。SELECT @@ENFORCE_GTID_CONSISTENCY
、SHOW VARIABLES LIKE 'ENFORCE_GTID_CONSISTENCY'
和SELECT * FROM INFORMATION_SCHEMA.VARIABLES WHERE 'VARIABLE_NAME' = 'ENFORCE_GTID_CONSISTENCY'
都會傳回文字形式,而不是數字形式。這是一個不相容的變更,因為@@ENFORCE_GTID_CONSISTENCY
會傳回布林值的數字形式,但會為SHOW
和 Information Schema 傳回文字形式。 -
系統變數 gtid_executed
範圍 全域 動態 否 SET_VAR
提示語適用否 類型 字串 單位 GTID 集 與全域範圍一起使用時,此變數包含伺服器上執行的所有交易的集合表示形式,以及
SET
gtid_purged
語句設定的 GTID。這與SHOW BINARY LOG STATUS
和SHOW REPLICA STATUS
輸出中Executed_Gtid_Set
資料行的值相同。此變數的值是一個 GTID 集,有關更多資訊,請參閱「GTID 集」。伺服器啟動時,會初始化
@@GLOBAL.gtid_executed
。有關如何依序讀取二進位日誌以填入gtid_executed
的更多資訊,請參閱binlog_gtid_simple_recovery
。然後,在執行交易時,或在執行任何SET
gtid_purged
語句時,會將 GTID 新增到集合中。可以在任何給定時間在二進位日誌中找到的交易集合等於
GTID_SUBTRACT(@@GLOBAL.gtid_executed, @@GLOBAL.gtid_purged)
;也就是說,二進位日誌中所有尚未清除的交易。發出
RESET BINARY LOGS AND GTIDS
會導致此變數重設為空字串。GTID 不會以其他方式從此集合中移除,除非由於RESET BINARY LOGS AND GTIDS
而清除集合。 gtid_executed_compression_period
命令列格式 --gtid-executed-compression-period=#
系統變數 gtid_executed_compression_period
範圍 全域 動態 是 SET_VAR
提示語適用否 類型 整數 預設值 0
最小值 0
最大值 4294967295
每次處理這麼多交易時,壓縮
mysql.gtid_executed
表。當伺服器上啟用二進位日誌記錄時,不會使用此壓縮方法,而是每次二進位日誌輪換時都會壓縮mysql.gtid_executed
表。當伺服器上禁用二進位日誌記錄時,壓縮執行緒會休眠,直到執行指定數量的交易,然後喚醒以執行mysql.gtid_executed
表的壓縮。將此系統變數的值設定為 0 表示執行緒永遠不會喚醒,因此不會使用此明確的壓縮方法。相反,會根據需要隱式地進行壓縮。InnoDB
交易由單獨的程序寫入mysql.gtid_executed
表,非InnoDB
交易也是如此。如果伺服器混合使用InnoDB
交易和非InnoDB
交易,則由此系統變數控制的壓縮會干擾此程序的工作,並可能顯著降低其速度。因此,從該版本開始,建議您將gtid_executed_compression_period
設定為 0。所有交易(無論儲存引擎如何)都由相同的程序寫入
mysql.gtid_executed
表,並且gtid_executed_compression_period
的預設值為 0。有關更多資訊,請參閱「mysql.gtid_executed 表壓縮」。
-
命令列格式 --gtid-mode=MODE
系統變數 gtid_mode
範圍 全域 動態 是 SET_VAR
提示語適用否 類型 枚舉 預設值 OFF
有效值 OFF
OFF_PERMISSIVE
ON_PERMISSIVE
ON
控制是否啟用基於 GTID 的記錄,以及日誌可以包含哪種類型的交易。您必須擁有足夠的權限來設定全域系統變數。請參閱第 7.1.9.1 節,「系統變數權限」。
enforce_gtid_consistency
必須設定為ON
,您才能設定gtid_mode=ON
。在修改此變數之前,請參閱第 19.1.4 節,「在線上伺服器上變更 GTID 模式」。記錄的交易可以是匿名的或使用 GTID。匿名交易依靠二進位日誌檔案和位置來識別特定交易。GTID 交易具有用於參考交易的唯一識別碼。不同的模式如下
OFF
:新的和複製的交易都必須是匿名的。OFF_PERMISSIVE
:新的交易是匿名的。複製的交易可以是匿名的或 GTID 交易。ON_PERMISSIVE
:新的交易是 GTID 交易。複製的交易可以是匿名的或 GTID 交易。ON
:新的和複製的交易都必須是 GTID 交易。
從一個值變更為另一個值一次只能執行一個步驟。例如,如果
gtid_mode
目前設定為OFF_PERMISSIVE
,則可以變更為OFF
或ON_PERMISSIVE
,但不能變更為ON
。gtid_purged
和gtid_executed
的值是持久的,無論gtid_mode
的值為何。因此,即使變更gtid_mode
的值之後,這些變數仍會包含正確的值。 -
系統變數 gtid_next
範圍 工作階段 動態 是 SET_VAR
提示語適用否 類型 枚舉 預設值 AUTOMATIC
有效值 AUTOMATIC
AUTOMATIC:<TAG>
ANONYMOUS
<UUID>:<NUMBER>
<UUID>:<TAG>:<NUMBER>
此變數用於指定是否以及如何取得下一個 GTID(請參閱第 19.1.3 節,「使用全域交易識別碼進行複製」)。
設定此系統變數的工作階段值是受限的操作。工作階段使用者必須擁有
REPLICATION_APPLIER
權限(請參閱第 19.3.3 節,「複製權限檢查」),或足以設定受限工作階段變數的權限(請參閱第 7.1.9.1 節,「系統變數權限」)。gtid_next
可以採用下列任何值AUTOMATIC
:使用下一個自動產生的全域交易 ID。AUTOMATIC:
:使用下一個自動產生的全域交易 ID,並以 UUID:TAG
TAG
:NUMBER 格式新增使用者指定的標籤。標籤必須符合規則運算式
[a-z_][a-z0-9_]{0,7}
;換句話說,它必須符合下列規則標籤必須包含 1-8 個字元(含)。
第一個字元可以是任何字母
a
到z
,或底線 (_
)。其餘的每個字元可以是任何字母
a
到z
、數字0
到9
,或底線 (_
)。
在複製來源上將
gtid_next
設定為AUTOMATIC:
或TAG
,需要UUID
:TAG
:NUMBER
TRANSACTION_GTID_TAG
權限,外加至少下列其中一項權限SYSTEM_VARIABLES_ADMIN
、SESSION_VARIABLES_ADMIN
或REPLICATION_APPLIER
。對於REPLICATION_CHECKS_APPLIER
,除了REPLICATION_APPLIER
權限之外,也需要此權限才能將gtid_next
設定為這兩個值之一;在啟動複製套用程式執行緒時會檢查這些權限。ANONYMOUS
:交易沒有全域識別碼,僅透過檔案和位置識別。格式為
UUID
:NUMBER
或UUID
:TAG
:NUMBER
的全域交易 ID。
剛才列出的選項中,哪些有效取決於
gtid_mode
的設定;如需詳細資訊,請參閱第 19.1.4.1 節,「複製模式概念」。如果gtid_mode
為OFF
,則設定此變數無效。將此變數設定為
或UUID
:NUMBER
,並提交或回溯交易後,必須再次發出明確的UUID
:TAG
:NUMBER
SET gtid_next
陳述式,才能執行任何其他陳述式。當對非暫時性資料表與暫時性資料表,或使用交易式儲存引擎的暫時性資料表與使用非交易式儲存引擎的暫時性資料表組合使用時,
DROP TABLE
或DROP TEMPORARY TABLE
會失敗並出現明確的錯誤。如需詳細資訊,請參閱gtid_next 系統變數,以及第 19.1.4 節,「在線上伺服器上變更 GTID 模式」。
-
系統變數 gtid_owned
範圍 全域、工作階段 動態 否 SET_VAR
提示語適用否 類型 字串 單位 GTID 集 此唯讀變數主要供內部使用。其內容取決於其範圍。
搭配全域範圍使用時,
gtid_owned
會保留伺服器上目前使用的所有 GTID 的清單,以及擁有這些 GTID 的執行緒 ID。此變數主要適用於多執行緒複本,以檢查是否已在另一個執行緒上套用交易。套用程式執行緒在處理交易時會一直取得交易的 GTID 的所有權,因此@@global.gtid_owned
會顯示處理期間的 GTID 和擁有者。提交(或回溯)交易後,套用程式執行緒會釋放 GTID 的所有權。搭配工作階段範圍使用時,
gtid_owned
會保留目前由此工作階段使用和擁有的單一 GTID。此變數主要適用於測試和偵錯用戶端透過設定gtid_next
明確指派交易的 GTID 時的 GTID 使用情況。在此情況下,@@session.gtid_owned
會在用戶端處理交易期間一直顯示 GTID,直到提交(或回溯)交易為止。用戶端完成交易處理後,變數會清除。如果工作階段使用gtid_next=AUTOMATIC
,則僅會在執行交易的提交陳述式期間短暫填入gtid_owned
,因此無法從相關的工作階段中觀察到,不過如果在正確的時間讀取@@global.gtid_owned
,則會列出它。如果您需要追蹤工作階段中用戶端處理的 GTID,您可以啟用由session_track_gtids
系統變數控制的工作階段狀態追蹤器。
-
系統變數 gtid_purged
範圍 全域 動態 是 SET_VAR
提示語適用否 類型 字串 單位 GTID 集 gtid_purged
系統變數的全域值 (@@GLOBAL.gtid_purged
) 是一個 GTID 集合,包含伺服器上已提交,但伺服器上任何二進位日誌檔案中都不存在的全部交易的 GTID。gtid_purged
是gtid_executed
的子集。gtid_purged
中包含以下類別的 GTID在複本上停用二進位記錄時提交的複製交易的 GTID。
已寫入二進位日誌檔案,且現在已清除的交易的 GTID。
透過陳述式
SET @@GLOBAL.gtid_purged
明確新增至集合的 GTID。
伺服器啟動時,
gtid_purged
的全域值會初始化為 GTID 集合。如需此 GTID 集合計算方式的相關資訊,請參閱gtid_purged
系統變數。如果伺服器上存在 MySQL 5.7.7 或更舊版本的二進位日誌,您可能需要在伺服器的組態檔案中設定binlog_gtid_simple_recovery=FALSE
,以產生正確的計算結果。如需需要此設定的情況詳細資訊,請參閱binlog_gtid_simple_recovery
的描述。您必須擁有
TRANSACTION_GTID_TAG
才能設定gtid_purged
。發出
RESET BINARY LOGS AND GTIDS
會導致gtid_purged
的值重設為空字串。您可以設定
gtid_purged
的值,以便在伺服器上記錄已套用特定 GTID 集合中的交易,即使它們不存在於伺服器上的任何二進位日誌中。此動作的一個範例用途是當您在伺服器上還原一或多個資料庫的備份,但您沒有伺服器上包含交易的相關二進位日誌時。重要GTID 僅在伺服器執行個體上可用,上限為帶正負號的 64 位元整數的非負值個數 (263 - 1)。如果將
gtid_purged
的值設定為接近此限制的數字,則後續提交可能會導致伺服器耗盡 GTID,並採取binlog_error_action
指定的動作。當伺服器執行個體接近限制時,會發出警告訊息。有兩種方式可以設定
gtid_purged
的值。你可以將gtid_purged
的值替換為你指定的 GTID 集合,或者你可以將你指定的 GTID 集合附加到gtid_purged
已持有的 GTID 集合中。如果伺服器沒有現有的 GTID,例如一個空伺服器,你要用現有資料庫的備份來佈建它,那麼這兩種方法的效果相同。如果你要還原的備份與伺服器上已有的交易重疊,例如用使用 mysqldump 從來源資料庫製作的部分傾印來替換損壞的表格(其中包含伺服器上所有交易的 GTID,即使傾印是部分的),請使用第一種方法,即替換gtid_purged
的值。如果你要還原的備份與伺服器上已有的交易不相關,例如使用來自兩個不同伺服器的傾印來佈建多來源複本,請使用第二種方法,即將值新增到gtid_purged
中。要用你指定的 GTID 集合替換
gtid_purged
的值,請使用以下語句SET @@GLOBAL.gtid_purged = 'gtid_set'
gtid_set
必須是gtid_purged
當前值的超集合,且不得與gtid_subtract(gtid_executed,gtid_purged)
相交。換句話說,新的 GTID 集合必須包含gtid_purged
中已有的任何 GTID,且不得包含gtid_executed
中尚未清除的任何 GTID。gtid_set
也不能包含@@global.gtid_owned
中的任何 GTID,也就是伺服器上目前正在處理的交易的 GTID。結果是
gtid_purged
的全域值會設定為等於gtid_set
,而gtid_executed
的值會變成gtid_set
和gtid_executed
先前值的聯集。要將你指定的 GTID 集合附加到
gtid_purged
,請在 GTID 集合之前使用加號 (+) 使用以下語句SET @@GLOBAL.gtid_purged = '+gtid_set'
gtid_set
不得與gtid_executed
的當前值相交。換句話說,新的 GTID 集合不得包含gtid_executed
中的任何 GTID,包括已經在gtid_purged
中的交易。gtid_set
也不能包含@@global.gtid_owned
中的任何 GTID,也就是伺服器上目前正在處理的交易的 GTID。結果是
gtid_set
會新增到gtid_executed
和gtid_purged
。
如果伺服器上有來自 MySQL 5.7.7 或更舊版本的任何二進制日誌(例如,在將舊伺服器升級到 MySQL 8.4 之後),在發出 SET @@GLOBAL.gtid_purged
語句之後,你可能需要在重新啟動伺服器之前,在伺服器的組態檔案中設定 binlog_gtid_simple_recovery=FALSE
,否則可能會錯誤計算 gtid_purged
。請參閱 binlog_gtid_simple_recovery
的說明,以了解需要此設定的情況詳細資訊。