本節中描述的函式用於基於 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。