本節所述的函數用於以 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 節「使用全域交易識別碼的複寫」。
給定兩組全域交易識別碼
set1
和set2
,如果set1
中的所有 GTID 也都在set2
中,則傳回 true。如果set1
或set2
為NULL
,則傳回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)
給定兩組全域交易識別碼
set1
和set2
,僅傳回set1
中不在set2
中的 GTID。如果set1
或set2
為NULL
,則傳回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。