文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  全域交易 ID 系統變數

19.1.6.5 全域交易 ID 系統變數

本節所述的 MySQL 伺服器系統變數用於監控和控制全域交易識別碼 (GTID)。如需更多資訊,請參閱第 19.1.3 節,「使用全域交易識別碼進行複製」

  • binlog_gtid_simple_recovery

    命令列格式 --binlog-gtid-simple-recovery[={OFF|ON}]
    系統變數 binlog_gtid_simple_recovery
    範圍 全域
    動態
    SET_VAR 提示語適用
    類型 布林值
    預設值 ON

    此變數控制在 MySQL 啟動或重新啟動時,搜尋 GTID 期間如何迭代二進制日誌檔案。

    binlog_gtid_simple_recovery=TRUE (預設值) 時,gtid_executedgtid_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_executedgtid_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_executedgtid_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

    命令列格式 --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 TABLEDROP 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=FALSE1=ON=TRUE2=WARN。這與其他枚舉類型不同,但保持與先前版本中使用的布林型別的相容性。這些變更會影響變數的傳回值。SELECT @@ENFORCE_GTID_CONSISTENCYSHOW VARIABLES LIKE 'ENFORCE_GTID_CONSISTENCY'SELECT * FROM INFORMATION_SCHEMA.VARIABLES WHERE 'VARIABLE_NAME' = 'ENFORCE_GTID_CONSISTENCY' 都會傳回文字形式,而不是數字形式。這是一個不相容的變更,因為 @@ENFORCE_GTID_CONSISTENCY 會傳回布林值的數字形式,但會為 SHOW 和 Information Schema 傳回文字形式。

  • gtid_executed

    系統變數 gtid_executed
    範圍 全域
    動態
    SET_VAR 提示語適用
    類型 字串
    單位 GTID 集

    與全域範圍一起使用時,此變數包含伺服器上執行的所有交易的集合表示形式,以及 SET gtid_purged 語句設定的 GTID。這與 SHOW BINARY LOG STATUSSHOW 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

    命令列格式 --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,則可以變更為 OFFON_PERMISSIVE,但不能變更為 ON

    gtid_purgedgtid_executed 的值是持久的,無論 gtid_mode 的值為何。因此,即使變更 gtid_mode 的值之後,這些變數仍會包含正確的值。

  • gtid_next

    系統變數 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:TAG:使用下一個自動產生的全域交易 ID,並以 UUID:TAG:NUMBER 格式新增使用者指定的標籤。

      標籤必須符合規則運算式 [a-z_][a-z0-9_]{0,7};換句話說,它必須符合下列規則

      • 標籤必須包含 1-8 個字元(含)。

      • 第一個字元可以是任何字母 az,或底線 (_)。

      • 其餘的每個字元可以是任何字母 az、數字 09,或底線 (_)。

      在複製來源上將 gtid_next 設定為 AUTOMATIC:TAGUUID:TAG:NUMBER,需要 TRANSACTION_GTID_TAG 權限,外加至少下列其中一項權限 SYSTEM_VARIABLES_ADMINSESSION_VARIABLES_ADMINREPLICATION_APPLIER。對於 REPLICATION_CHECKS_APPLIER,除了 REPLICATION_APPLIER 權限之外,也需要此權限才能將 gtid_next 設定為這兩個值之一;在啟動複製套用程式執行緒時會檢查這些權限。

    • ANONYMOUS:交易沒有全域識別碼,僅透過檔案和位置識別。

    • 格式為 UUID:NUMBERUUID:TAG:NUMBER 的全域交易 ID。

    剛才列出的選項中,哪些有效取決於 gtid_mode 的設定;如需詳細資訊,請參閱第 19.1.4.1 節,「複製模式概念」。如果 gtid_modeOFF,則設定此變數無效。

    將此變數設定為 UUID:NUMBERUUID:TAG:NUMBER,並提交或回溯交易後,必須再次發出明確的 SET gtid_next 陳述式,才能執行任何其他陳述式。

    當對非暫時性資料表與暫時性資料表,或使用交易式儲存引擎的暫時性資料表與使用非交易式儲存引擎的暫時性資料表組合使用時,DROP TABLEDROP TEMPORARY TABLE 會失敗並出現明確的錯誤。

    如需詳細資訊,請參閱gtid_next 系統變數,以及第 19.1.4 節,「在線上伺服器上變更 GTID 模式」

  • gtid_owned

    系統變數 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

    系統變數 gtid_purged
    範圍 全域
    動態
    SET_VAR 提示語適用
    類型 字串
    單位 GTID 集

    gtid_purged 系統變數的全域值 (@@GLOBAL.gtid_purged) 是一個 GTID 集合,包含伺服器上已提交,但伺服器上任何二進位日誌檔案中都不存在的全部交易的 GTID。gtid_purgedgtid_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_setgtid_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_executedgtid_purged

注意

如果伺服器上有來自 MySQL 5.7.7 或更舊版本的任何二進制日誌(例如,在將舊伺服器升級到 MySQL 8.4 之後),在發出 SET @@GLOBAL.gtid_purged 語句之後,你可能需要在重新啟動伺服器之前,在伺服器的組態檔案中設定 binlog_gtid_simple_recovery=FALSE,否則可能會錯誤計算 gtid_purged。請參閱 binlog_gtid_simple_recovery 的說明,以了解需要此設定的情況詳細資訊。