文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 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 參考手冊  /  ...  /  搭配全域交易識別碼 (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。