MySQL GTID集合運算函數(shù)總結(jié)
MySQL GTID 有一些運算函數(shù)可以幫助我們在運維工作中提高運維效率。
1、GTID內(nèi)置函數(shù)
MySQL 包含GTID_SUBSET、GTID_SUBTRACT、WAIT_FOR_EXECUTED_GTID_SET、WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS
4個內(nèi)置函數(shù),用于GTID集合的基本運算。
1.1 GTID_SUBSET(set1,set2)
給定兩個GTID集set1和set2,set1是set2的子集返回true,否則返回false。
root@(none) 10:29:28>select gtid_subset('53442434-8bfa-11e9-bc15-005056a50f77:1-2','8eed0f5b-6f9b-11e9-94a9-005056a57a4e:1-2') c8, gtid_subset('53442434-8bfa-11e9-bc15-005056a50f77:1-2','8eed0f5b-6f9b-11e9-94a9-005056a57a4e:1-2,53442434-8bfa-11e9-bc15-005056a50f77:1-2') c9; +----+----+ | c8 | c9 | +----+----+ | 0 | 1 | +----+----+ 1 row in set (0.00 sec)
1.2 GTID_SUBTRACT(set1,set2)
GTID_SUBTRACT(gtid_set1, gtid_set2) 返回一個新的 GTID 集,表示 gtid_set1 中存在但 gtid_set2 中不存在的 GTID(即 gtid_set1 減去 gtid_set2 的結(jié)果)。
select gtid_subtract('53442434-8bfa-11e9-bc15-005056a50f77:1-2,8eed0f5b-6f9b-11e9-94a9-005056a57a4e:1-2','8eed0f5b-6f9b-11e9-94a9-005056a57a4e:2-3') c9;
root@(none) 10:37:49>select gtid_subtract('53442434-8bfa-11e9-bc15-005056a50f77:1-2,8eed0f5b-6f9b-11e9-94a9-005056a57a4e:1-2','8eed0f5b-6f9b-11e9-94a9-005056a57a4e:2-3') c9\G; *************************** 1. row *************************** c9: 53442434-8bfa-11e9-bc15-005056a50f77:1-2, 8eed0f5b-6f9b-11e9-94a9-005056a57a4e:1 1 row in set (0.00 sec)
select gtid_subtract('53442434-8bfa-11e9-bc15-005056a50f77:1-5','53442434-8bfa-11e9-bc15-005056a50f77:3-10') c8
root@(none) 10:45:32>select gtid_subtract('53442434-8bfa-11e9-bc15-005056a50f77:1-5','53442434-8bfa-11e9-bc15-005056a50f77:3-10') c8; +------------------------------------------+ | c8 | +------------------------------------------+ | 53442434-8bfa-11e9-bc15-005056a50f77:1-2 | +------------------------------------------+ 1 row in set (0.01 sec)
1.3 WAIT_FOR_EXECUTED_GTID_SET(gtid_set[, timeout])
等到服務(wù)器應(yīng)用了包含在 gtid_set 中的所有事務(wù)。如果指定可選的 timeout 值 (秒數(shù)),超時會使函數(shù)停止等待而退出。
select wait_for_executed_gtid_set('53442434-8bfa-11e9-bc15-005056a50f77:1-7'); select wait_for_executed_gtid_set('53442434-8bfa-11e9-bc15-005056a50f77:8',5);
1.4 WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS(gtid_set[, timeout][,channel])
與WAIT_FOR_EXECUTED_GTID_SET
類似,但針對單個啟動的復(fù)制通道.
1.5 可以自定義函數(shù)
# 如果兩個GTID集相同,函數(shù)返回非零值 create function gtid_is_equal(gtid_set_1 longtext, gtid_set_2 longtext) returns int deterministic return gtid_subset(gtid_set_1, gtid_set_2) and gtid_subset(gtid_set_2, gtid_set_1); # 如果兩個GTID集不相交,函數(shù)返回非零值 create function gtid_is_disjoint(gtid_set_1 longtext, gtid_set_2 longtext) returns int deterministic return gtid_subset(gtid_set_1, gtid_subtract(gtid_set_1, gtid_set_2)); # 如果兩個GTID集不相交,則函數(shù)返回非零,sum是兩個集的并集 create function gtid_is_disjoint_union(gtid_set_1 longtext, gtid_set_2 longtext, sum longtext) returns int deterministic return gtid_is_equal(gtid_subtract(sum, gtid_set_1), gtid_set_2) and gtid_is_equal(gtid_subtract(sum, gtid_set_2), gtid_set_1); # 函數(shù)返回格式化的GTID集。沒有空格且沒有重復(fù),UUID按字母順序排列,間隔按數(shù)字順序排列 create function gtid_normalize(g longtext) returns longtext deterministic return gtid_subtract(g, ''); # 函數(shù)返回兩個GTID集的并集 create function gtid_union(gtid_set_1 longtext, gtid_set_2 longtext) returns longtext deterministic return gtid_normalize(concat(gtid_set_1, ',', gtid_set_2)); # 函數(shù)返回兩個GTID集的交集 create function gtid_intersection(gtid_set_1 longtext, gtid_set_2 longtext) returns longtext deterministic return gtid_subtract(gtid_set_1, gtid_subtract(gtid_set_1, gtid_set_2)); # 函數(shù)返回兩個GTID集的對稱差集 create function gtid_symmetric_difference(gtid_set_1 longtext, gtid_set_2 longtext) returns longtext deterministic return gtid_subtract(concat(gtid_set_1, ',', gtid_set_2), gtid_intersection(gtid_set_1, gtid_set_2)); # 函數(shù)返回除去指定UUID的GTID集 create function gtid_subtract_uuid(gtid_set longtext, uuid text) returns longtext deterministic return gtid_subtract(gtid_set, concat(uuid, ':1-', (1 << 63) - 2)); # 函數(shù)返回指定UUID的GTID集 create function gtid_intersection_with_uuid(gtid_set longtext, uuid text) returns longtext deterministic return gtid_subtract(gtid_set, gtid_subtract_uuid(gtid_set, uuid));
2、GTID使用示例
2.1、監(jiān)控從庫是否有人執(zhí)行了寫操作,生產(chǎn)GTID:
使用 gtid_subset 來驗證,從庫的gtid一定是主庫的gtid的子集。
GTID_SUBSET(set1,set2)
執(zhí)行 GTID_SUBSET(從庫gtid,主庫gtid),如果是true就沒問題,如果是false就是有人誤操作了從庫。
- 從庫('53442434-8bfa-11e9-bc15-005056a50f77:1-2,8eed0f5b-6f9b-11e9-94a9-005056a57a4e:1-6')
- 主庫('53442434-8bfa-11e9-bc15-005056a50f77:1-3,8eed0f5b-6f9b-11e9-94a9-005056a57a4e:1-5')
- 主庫('53442434-8bfa-11e9-bc15-005056a50f77:1-3')
- 主庫('53442434-8bfa-11e9-bc15-005056a50f77:1-3',8eed0f5b-6f9b-11e9-94a9-005056a57a4e:1-7')
結(jié)果:
2.2、驗證從庫的復(fù)制是否最新:
內(nèi)置函數(shù)GTID_SUBSET
和GTID_SUBTRACT
可用于檢查從庫是應(yīng)用了主庫的每個事務(wù)。使用GTID_SUBSET
執(zhí)行此檢查,在從庫上執(zhí)行以下命令:
master_gtid_executed=`mysql -uroot -proot -h192.168.2.80 -N -e "select replace(@@global.gtid_executed,char(10),'')"` slave_gtid_executed=`mysql -uroot -proot -N -e "select replace(@@global.gtid_executed,char(10),'')"` sql="select gtid_subset('$master_gtid_executed', '$slave_gtid_executed')" dls mysql -uroot -proot -e "$sql" gtid_subset('dd746660-528a-11ed-9c86-000c293b9f86:1-14,e189b1a5-529d-11ed-992e-000c29c1da06:1', 'dd746660-528a-11ed-9c86-000c293b9f86:1-14,e189b1a5-529d-11ed-992e-000c29c1da06:1') ;
2.3 驗證復(fù)制拓撲中的服務(wù)器是否執(zhí)行過本地事務(wù)
自定義函數(shù) GTID_INTERSECTION_WITH_UUID 可用于驗證服務(wù)器是否執(zhí)行過本地事務(wù)??梢栽诜?wù)器上發(fā)出以下語句來檢查:
SELECT GTID_INTERSECTION_WITH_UUID(@@GLOBAL.gtid_executed, my_server_uuid);
2.4 檢查從庫上的異常事務(wù)
自定義函數(shù) GTID_SUBTRACT_UUID 可用于檢查從庫是否只接收到源自其指定主庫的事務(wù)。對于單主復(fù)制,執(zhí)行以下語句,server_uuid_of_master 是主庫的 server_uuid:
SELECT GTID_SUBTRACT_UUID(@@GLOBAL.gtid_executed, server_uuid_of_master);
如果結(jié)果不為空,則返回的事務(wù)是不是源自指定主庫的異常事務(wù)。對于多主復(fù)制拓撲中的從庫,重復(fù)該功能,例如:
SELECT GTID_SUBTRACT_UUID(GTID_SUBTRACT_UUID(@@GLOBAL.gtid_executed, server_uuid_of_master_1), server_uuid_of_master_2);
到此這篇關(guān)于MySQL GTID集合運算函數(shù)總結(jié)的文章就介紹到這了,更多相關(guān)MySQL GTID集合運算函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql數(shù)據(jù)庫的全量與增量的備份以及恢復(fù)方式
在數(shù)據(jù)庫管理中,全量備份與恢復(fù)是將整個數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)出并在需要時完整地恢復(fù),這通常使用mysqldump工具完成,增量備份則是在全量備份的基礎(chǔ)上,只備份那些自上次全量備份后發(fā)生變化的數(shù)據(jù),這需要數(shù)據(jù)庫的二進制日志(binlog)開啟2024-09-09在SQL中對同一個字段不同值,進行數(shù)據(jù)統(tǒng)計操作
這篇文章主要介紹了在SQL中對同一個字段不同值,進行數(shù)據(jù)統(tǒng)計操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10MySQL筆記之?dāng)?shù)據(jù)備份與還原的使用詳解
數(shù)據(jù)很重要,這點用腳趾頭想都知道,為了保證數(shù)據(jù)的安全,因此需要定期對數(shù)據(jù)備份2013-05-05MySQL 使用DQL命令查詢數(shù)據(jù)的實現(xiàn)方法
這篇文章主要介紹了MySQL 使用DQL命令查詢數(shù)據(jù)的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Mysql存儲過程如何實現(xiàn)歷史數(shù)據(jù)遷移
這篇文章主要介紹了Mysql存儲過程如何實現(xiàn)歷史數(shù)據(jù)遷移,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01