文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  全域交易 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 9.0 之後),使用 binlog_gtid_simple_recovery=TRUE 時,gtid_executedgtid_purged 可能在以下兩種情況下初始化不正確:

    • 最新的二進制日誌是由 MySQL 5.7.5 或更早版本產生的,並且對於某些二進制日誌,gtid_modeON,但對於最新的二進制日誌,則為 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_executedgtid_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[=值]
    系統變數 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 和資訊綱要的文字形式。

  • 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 個字元組成(包含 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 的清單,以及擁有它們的執行緒 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

    系統變數 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_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_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 9.0 之後),在發出 SET @@GLOBAL.gtid_purged 語句後,您可能需要在重新啟動伺服器之前,在伺服器的組態檔案中設定 binlog_gtid_simple_recovery=FALSE,否則可能會錯誤地計算 gtid_purged。有關需要此設定的情況,請參閱 binlog_gtid_simple_recovery 的描述。