• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    MySQL GTID集合运算函数总结

    发布者: 山止川行 | 发布时间: 2025-6-14 14:25| 查看数: 103| 评论数: 0|帖子模式

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

    1、GTID内置函数

    MySQL 包含
    1. GTID_SUBSET、GTID_SUBTRACT、WAIT_FOR_EXECUTED_GTID_SET、WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS
    复制代码
    4个内置函数,用于GTID集合的基本运算。

    1.1 GTID_SUBSET(set1,set2)

    给定两个GTID集set1和set2,set1是set2的子集返回true,否则返回false。
    1. root@(none) 10:29:28>select
    2. gtid_subset('53442434-8bfa-11e9-bc15-005056a50f77:1-2','8eed0f5b-6f9b-11e9-94a9-005056a57a4e:1-2') c8,
    3. gtid_subset('53442434-8bfa-11e9-bc15-005056a50f77:1-2','8eed0f5b-6f9b-11e9-94a9-005056a57a4e:1-2,53442434-8bfa-11e9-bc15-005056a50f77:1-2') c9;
    4. +----+----+
    5. | c8 | c9 |
    6. +----+----+
    7. |  0 |  1 |
    8. +----+----+
    9. 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 的结果)。
    1. 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;
    复制代码
    1. 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;
    2. *************************** 1. row ***************************
    3. c9: 53442434-8bfa-11e9-bc15-005056a50f77:1-2,
    4. 8eed0f5b-6f9b-11e9-94a9-005056a57a4e:1
    5. 1 row in set (0.00 sec)
    复制代码
    1. select gtid_subtract('53442434-8bfa-11e9-bc15-005056a50f77:1-5','53442434-8bfa-11e9-bc15-005056a50f77:3-10') c8
    复制代码
    1. root@(none) 10:45:32>select gtid_subtract('53442434-8bfa-11e9-bc15-005056a50f77:1-5','53442434-8bfa-11e9-bc15-005056a50f77:3-10') c8;
    2. +------------------------------------------+
    3. | c8                                       |
    4. +------------------------------------------+
    5. | 53442434-8bfa-11e9-bc15-005056a50f77:1-2 |
    6. +------------------------------------------+
    7. 1 row in set (0.01 sec)
    复制代码
    1.3 WAIT_FOR_EXECUTED_GTID_SET(gtid_set[, timeout])

    等到服务器应用了包含在 gtid_set 中的所有事务。如果指定可选的 timeout 值 (秒数),超时会使函数停止等待而退出。
    1. select wait_for_executed_gtid_set('53442434-8bfa-11e9-bc15-005056a50f77:1-7');
    2. 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])

    1. WAIT_FOR_EXECUTED_GTID_SET
    复制代码
    类似,但针对单个启动的复制通道.

    1.5 可以自定义函数
    1. # 如果两个GTID集相同,函数返回非零值
    2. create function gtid_is_equal(gtid_set_1 longtext, gtid_set_2 longtext)
    3. returns int deterministic
    4.   return gtid_subset(gtid_set_1, gtid_set_2) and gtid_subset(gtid_set_2, gtid_set_1);
    5. # 如果两个GTID集不相交,函数返回非零值
    6. create function gtid_is_disjoint(gtid_set_1 longtext, gtid_set_2 longtext)
    7. returns int deterministic
    8.   return gtid_subset(gtid_set_1, gtid_subtract(gtid_set_1, gtid_set_2));
    9. # 如果两个GTID集不相交,则函数返回非零,sum是两个集的并集
    10. create function gtid_is_disjoint_union(gtid_set_1 longtext, gtid_set_2 longtext, sum longtext)
    11. returns int deterministic
    12.   return gtid_is_equal(gtid_subtract(sum, gtid_set_1), gtid_set_2) and
    13.          gtid_is_equal(gtid_subtract(sum, gtid_set_2), gtid_set_1);
    14. # 函数返回格式化的GTID集。没有空格且没有重复,UUID按字母顺序排列,间隔按数字顺序排列
    15. create function gtid_normalize(g longtext)
    16. returns longtext deterministic
    17. return gtid_subtract(g, '');
    18. # 函数返回两个GTID集的并集
    19. create function gtid_union(gtid_set_1 longtext, gtid_set_2 longtext)
    20. returns longtext deterministic
    21.   return gtid_normalize(concat(gtid_set_1, ',', gtid_set_2));
    22. # 函数返回两个GTID集的交集
    23. create function gtid_intersection(gtid_set_1 longtext, gtid_set_2 longtext)
    24. returns longtext deterministic
    25.   return gtid_subtract(gtid_set_1, gtid_subtract(gtid_set_1, gtid_set_2));
    26. # 函数返回两个GTID集的对称差集
    27. create function gtid_symmetric_difference(gtid_set_1 longtext, gtid_set_2 longtext)
    28. returns longtext deterministic
    29.   return gtid_subtract(concat(gtid_set_1, ',', gtid_set_2), gtid_intersection(gtid_set_1, gtid_set_2));
    30. # 函数返回除去指定UUID的GTID集
    31. create function gtid_subtract_uuid(gtid_set longtext, uuid text)
    32. returns longtext deterministic
    33.   return gtid_subtract(gtid_set, concat(uuid, ':1-', (1 << 63) - 2));
    34. # 函数返回指定UUID的GTID集
    35. create function gtid_intersection_with_uuid(gtid_set longtext, uuid text)
    36. returns longtext deterministic
    37.   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就是有人误操作了从库。
    1. <ul><li>从库('53442434-8bfa-11e9-bc15-005056a50f77:1-2,8eed0f5b-6f9b-11e9-94a9-005056a57a4e:1-6')</li><li>主库('53442434-8bfa-11e9-bc15-005056a50f77:1-3,8eed0f5b-6f9b-11e9-94a9-005056a57a4e:1-5')</li><li>主库('53442434-8bfa-11e9-bc15-005056a50f77:1-3')</li><li>主库('53442434-8bfa-11e9-bc15-005056a50f77:1-3',8eed0f5b-6f9b-11e9-94a9-005056a57a4e:1-7')</li></ul>
    复制代码
    结果:


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

    内置函数
    1. GTID_SUBSET
    复制代码
    1. GTID_SUBTRACT
    复制代码
    可用于检查从库是应用了主库的每个事务。使用
    1. GTID_SUBSET
    复制代码
    执行此检查,在从库上执行以下命令:
    1. master_gtid_executed=`mysql -uroot -proot -h192.168.2.80 -N -e "select replace(@@global.gtid_executed,char(10),'')"`



    2. 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')"

    3. dls

    4. mysql -uroot -proot -e "$sql"

    5. 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 可用于验证服务器是否执行过本地事务。可以在服务器上发出以下语句来检查:
    1. SELECT GTID_INTERSECTION_WITH_UUID(@@GLOBAL.gtid_executed, my_server_uuid);
    复制代码
    2.4 检查从库上的异常事务

    自定义函数 GTID_SUBTRACT_UUID 可用于检查从库是否只接收到源自其指定主库的事务。对于单主复制,执行以下语句,server_uuid_of_master 是主库的 server_uuid:
    1. SELECT GTID_SUBTRACT_UUID(@@GLOBAL.gtid_executed, server_uuid_of_master);
    复制代码
    如果结果不为空,则返回的事务是不是源自指定主库的异常事务。对于多主复制拓扑中的从库,重复该功能,例如:
    1. SELECT GTID_SUBTRACT_UUID(GTID_SUBTRACT_UUID(@@GLOBAL.gtid_executed,
    2.                                              server_uuid_of_master_1),
    3.                                              server_uuid_of_master_2);
    复制代码
    到此这篇关于MySQL GTID集合运算函数总结的文章就介绍到这了,更多相关MySQL GTID集合运算函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    来源:https://www.jb51.net/database/3398408ei.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    ×

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表