MySQL GTID集合运算函数总结

2025-04-22 22:14:17 151
魁首哥

mysql gtid 有一些运算函数可以帮助我们在运维工作中提高运维效率。

1、gtid内置函数

mysql 包含gtid_subset、gtid_subtract、wait_for_executed_gtid_set、wait_until_sql_thread_after_gtids4个内置函数,用于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 的结果)。

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])

等到服务器应用了包含在 gtid_set 中的所有事务。如果指定可选的 timeout 值 (秒数),超时会使函数停止等待而退出。

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类似,但针对单个启动的复制通道.

1.5 可以自定义函数

# 如果两个gtid集相同,函数返回非零值
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集不相交,函数返回非零值
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集不相交,则函数返回非零,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);
# 函数返回格式化的gtid集。没有空格且没有重复,uuid按字母顺序排列,间隔按数字顺序排列
create function gtid_normalize(g longtext)
returns longtext deterministic
return gtid_subtract(g, '');
# 函数返回两个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));
# 函数返回两个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));
# 函数返回两个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));
# 函数返回除去指定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));
# 函数返回指定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、监控从库是否有人执行了写操作,生产gtid:

使用gtid_subset 来验证,从库的gtid一定是主库的gtid的子集。

gtid_subset(set1,set2)

执行 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')

结果:

2.2、验证从库的复制是否最新:

内置函数gtid_subsetgtid_subtract可用于检查从库是应用了主库的每个事务。使用gtid_subset执行此检查,在从库上执行以下命令:

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验证复制拓扑中的服务器是否执行过本地事务

自定义函数 gtid_intersection_with_uuid 可用于验证服务器是否执行过本地事务。可以在服务器上发出以下语句来检查:

select gtid_intersection_with_uuid(@@global.gtid_executed, my_server_uuid);

2.4 检查从库上的异常事务

自定义函数 gtid_subtract_uuid 可用于检查从库是否只接收到源自其指定主库的事务。对于单主复制,执行以下语句,server_uuid_of_master 是主库的 server_uuid:

select gtid_subtract_uuid(@@global.gtid_executed, server_uuid_of_master);

如果结果不为空,则返回的事务是不是源自指定主库的异常事务。对于多主复制拓扑中的从库,重复该功能,例如:

select gtid_subtract_uuid(gtid_subtract_uuid(@@global.gtid_executed,
                                             server_uuid_of_master_1),
                                             server_uuid_of_master_2);

到此这篇关于mysql gtid集合运算函数总结的文章就介绍到这了,更多相关mysql gtid集合运算函数内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

分享
海报
151
上一篇:MySQL数据库修改密码以及设置密码永过期问题 下一篇:数据库面试必备之MySQL中的乐观锁与悲观锁

忘记密码?

图形验证码