文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 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 參考手冊  /  ...  /  全域交易識別碼 (GTID) 的相關函數

14.18.2 全域交易識別碼 (GTID) 的相關函數

本節所述的函數用於以 GTID 為基礎的複寫。請務必記住,所有這些函數都將 GTID 集的字串表示形式作為引數。因此,使用它們時,GTID 集必須始終加上引號。如需更多資訊,請參閱GTID 集

兩個 GTID 集的聯集只是它們的字串表示形式,以逗號分隔連在一起。換句話說,您可以定義一個非常簡單的函數來取得兩個 GTID 集的聯集,類似於此處建立的函數

CREATE FUNCTION GTID_UNION(g1 TEXT, g2 TEXT)
    RETURNS TEXT DETERMINISTIC
    RETURN CONCAT(g1,',',g2);

如需更多有關 GTID 以及如何在實務中使用這些 GTID 函數的資訊,請參閱第 19.1.3 節「使用全域交易識別碼的複寫」

表 14.26 GTID 函數

名稱 描述
WAIT_FOR_EXECUTED_GTID_SET() 等待,直到給定的 GTID 在複本上執行。

  • GTID_SUBSET(set1,set2)

    給定兩組全域交易識別碼 set1set2,如果 set1 中的所有 GTID 也都在 set2 中,則傳回 true。如果 set1set2NULL,則傳回 NULL。否則傳回 false。

    此函數使用的 GTID 集表示為字串,如下列範例所示

    mysql> SELECT GTID_SUBSET('3E11FA47-71CA-11E1-9E33-C80AA9429562:23',
        ->     '3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57')\G
    *************************** 1. row ***************************
    GTID_SUBSET('3E11FA47-71CA-11E1-9E33-C80AA9429562:23',
        '3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57'): 1
    1 row in set (0.00 sec)
    
    mysql> SELECT GTID_SUBSET('3E11FA47-71CA-11E1-9E33-C80AA9429562:23-25',
        ->     '3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57')\G
    *************************** 1. row ***************************
    GTID_SUBSET('3E11FA47-71CA-11E1-9E33-C80AA9429562:23-25',
        '3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57'): 1
    1 row in set (0.00 sec)
    
    mysql> SELECT GTID_SUBSET('3E11FA47-71CA-11E1-9E33-C80AA9429562:20-25',
        ->     '3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57')\G
    *************************** 1. row ***************************
    GTID_SUBSET('3E11FA47-71CA-11E1-9E33-C80AA9429562:20-25',
        '3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57'): 0
    1 row in set (0.00 sec)
  • GTID_SUBTRACT(set1,set2)

    給定兩組全域交易識別碼 set1set2,僅傳回 set1 中不在 set2 中的 GTID。如果 set1set2NULL,則傳回 NULL

    此函數使用的所有 GTID 集都表示為字串,並且必須加上引號,如這些範例所示

    mysql> SELECT GTID_SUBTRACT('3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57',
        ->     '3E11FA47-71CA-11E1-9E33-C80AA9429562:21')\G
    *************************** 1. row ***************************
    GTID_SUBTRACT('3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57',
        '3E11FA47-71CA-11E1-9E33-C80AA9429562:21'): 3e11fa47-71ca-11e1-9e33-c80aa9429562:22-57
    1 row in set (0.00 sec)
    
    mysql> SELECT GTID_SUBTRACT('3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57',
        ->     '3E11FA47-71CA-11E1-9E33-C80AA9429562:20-25')\G
    *************************** 1. row ***************************
    GTID_SUBTRACT('3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57',
        '3E11FA47-71CA-11E1-9E33-C80AA9429562:20-25'): 3e11fa47-71ca-11e1-9e33-c80aa9429562:26-57
    1 row in set (0.00 sec)
    
    mysql> SELECT GTID_SUBTRACT('3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57',
        ->     '3E11FA47-71CA-11E1-9E33-C80AA9429562:23-24')\G
    *************************** 1. row ***************************
    GTID_SUBTRACT('3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57',
        '3E11FA47-71CA-11E1-9E33-C80AA9429562:23-24'): 3e11fa47-71ca-11e1-9e33-c80aa9429562:21-22:25-57
    1 row in set (0.01 sec)

    從自身減去 GTID 集會產生一個空集,如此處所示

    mysql> SELECT GTID_SUBTRACT('3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57',
        ->     '3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57')\G
    *************************** 1. row ***************************
    GTID_SUBTRACT('3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57',
        '3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57'): 
    1 row in set (0.00 sec)
  • WAIT_FOR_EXECUTED_GTID_SET(gtid_set[, timeout])

    等待,直到伺服器已套用其全域交易識別碼包含在 gtid_set 中的所有交易;也就是說,直到條件 GTID_SUBSET(gtid_subset, @@GLOBAL.gtid_executed) 成立。如需 GTID 集的定義,請參閱第 19.1.3.1 節「GTID 格式和儲存」

    如果指定逾時,且在套用 GTID 集中所有交易之前經過 timeout 秒,則函數會停止等待。timeout 是選用的,預設逾時為 0 秒,在這種情況下,函數會一直等待,直到 GTID 集中所有交易都已套用。timeout 必須大於或等於 0;當在嚴格 SQL 模式下執行時,負數的 timeout 值會立即被拒絕並出現錯誤 (ER_WRONG_ARGUMENTS);否則,函數會傳回 NULL,並引發警告。

    WAIT_FOR_EXECUTED_GTID_SET() 會監控在伺服器上套用的所有 GTID,包括來自所有複寫通道和使用者用戶端的交易。它不考慮是否已啟動或停止複寫通道。

    如需更多資訊,請參閱第 19.1.3 節「使用全域交易識別碼的複寫」

    此函數使用的 GTID 集表示為字串,因此必須加上引號,如下列範例所示

    mysql> SELECT WAIT_FOR_EXECUTED_GTID_SET('3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5');
            -> 0

    如需 GTID 集的語法描述,請參閱第 19.1.3.1 節「GTID 格式和儲存」

    對於 WAIT_FOR_EXECUTED_GTID_SET(),傳回值是查詢的狀態,其中 0 代表成功,1 代表逾時。任何其他失敗都會產生錯誤。

    當任何用戶端正在使用此函數等待 GTID 套用時,無法將 gtid_mode 變更為 OFF。