本節中描述的 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 9.0 之後),使用
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
設為FALSE
。當設定
binlog_gtid_simple_recovery=FALSE
時,計算gtid_executed
和gtid_purged
的方法(如「gtid_purged
系統變數」中所述)會變更為以下列方式迭代二進制日誌檔案:對於
gtid_executed
的計算,不是使用來自最新二進制日誌檔案的Previous_gtids_log_event
的值和 GTID 日誌事件,而是從最新的二進制日誌檔案開始迭代,並使用第一個找到Previous_gtids_log_event
值的二進制日誌檔案中的Previous_gtids_log_event
值和任何 GTID 日誌事件。如果伺服器的最新二進制日誌檔案沒有 GTID 日誌事件,例如,如果使用了gtid_mode=ON
,但伺服器稍後變更為gtid_mode=OFF
,則此過程可能需要很長時間。對於
gtid_purged
的計算,不是使用來自最舊的二進制日誌檔案的Previous_gtids_log_event
值,而是從最舊的二進制日誌檔案開始迭代,並使用第一個找到非空Previous_gtids_log_event
值或至少一個 GTID 日誌事件(表示 GTID 的使用從該點開始)的二進制日誌檔案中的Previous_gtids_log_event
值。如果伺服器的較舊二進制日誌檔案沒有 GTID 日誌事件,例如,如果僅在最近在伺服器上設定了gtid_mode=ON
,則此過程可能需要很長時間。
-
命令列格式 --enforce-gtid-consistency[=值]
系統變數 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
和資訊綱要的文字形式。 -
系統變數 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 個字元組成(包含 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 的清單,以及擁有它們的執行緒 ID。此變數主要對於多執行緒副本很有用,可檢查交易是否已在另一個執行緒上套用。套用程式執行緒會在處理交易期間持續擁有交易的 GTID,因此@@global.gtid_owned
會顯示 GTID 和擁有者,直到處理完成。當交易已提交(或回滾)時,套用程式執行緒會釋放 GTID 的所有權。當與連線範圍搭配使用時,
gtid_owned
會保存目前由此連線使用且擁有的單一 GTID。此變數主要用於測試和偵錯,當用戶端透過設定gtid_next
明確地為交易指派 GTID 時,GTID 的使用情況。在此情況下,@@session.gtid_owned
會持續顯示 GTID,直到用戶端處理交易,直到交易已提交(或回滾)。當用戶端完成交易處理時,會清除變數。如果連線使用gtid_next=AUTOMATIC
,則gtid_owned
只會在執行交易的 commit 陳述式期間短暫填入,因此無法從相關連線觀察到,但如果在正確的時間讀取@@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_purged
的值替換為您指定的 GTID 集,請使用以下語句: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 9.0 之後),在發出 SET @@GLOBAL.gtid_purged
語句後,您可能需要在重新啟動伺服器之前,在伺服器的組態檔案中設定 binlog_gtid_simple_recovery=FALSE
,否則可能會錯誤地計算 gtid_purged
。有關需要此設定的情況,請參閱 binlog_gtid_simple_recovery
的描述。