千家信息网

说GTID - GTID的组成和存储

发表于:2025-01-22 作者:千家信息网编辑
千家信息网最后更新 2025年01月22日,GTID是什么GTID(Global Transaction Identifier)是事务在第一次提交时获取到的唯一标识,该标识在整个的复制拓扑中具有唯一性。GTID组成GTID = source_i
千家信息网最后更新 2025年01月22日说GTID - GTID的组成和存储

GTID是什么


GTID(Global Transaction Identifier)是事务在第一次提交时获取到的唯一标识,该标识在整个的复制拓扑中具有唯一性。



GTID组成


GTID = source_id:transaction_id(c4e5d4a0-a9be-11e9-b444-080027f22add:7)


直观看,GTID有两部分组成,source_id和transaction_id。source_id代表事务提交时所在的Master实例,一般是由该实例的全局系统变量server_uuid表示;transaction_id代表事务在该实例上提交的顺序,其为大于或等于1的正向递增序列。



GTID集合


集合,是由一个或多个确定的元素所构成的整体。GTID集合,顾名思义,这其中的元素就是GTID,由单个,或多个GTID,又或由一个范围的GTID组成。如,3E11FA47-71CA-11E1-9E33-C80AA9429562:1-3:11:47-49。在实例中全局系统变量gtid_executed和gtid_purged往往存储的就是GTID集合。


GTID集合也是有格式的,如下:


gtid_set:

uuid_set [, uuid_set] ...

| ''


uuid_set:

uuid:interval[:interval]...


uuid:

hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhhh


h:

[0-9|A-F]


interval:

n[-n]


(n >= 1)



GTID存储


GTID是存储在系统表mysql.gtid_executed中的,该表一行记录代表单个GTID,或GTID集合。


+--------------------------------------+----------------+--------------+

| source_uuid | interval_start | interval_end |

+--------------------------------------+----------------+--------------+

| aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa | 1 | 72 |

| c4e5d4a0-a9be-11e9-b444-080027f22add | 101005 | 188707 |

+--------------------------------------+----------------+--------------+


GTID何时被写入mysql.gtid_executed表呢…,这取决于二进制日志是否开启。


  • 当禁用二进制日志时(该情况一般出现在Slave上),MySQL在执行(回放)完GTID(事务)后,同时将该GTID写入mysql.gtid_executed表。在5.7版本中,对于DML语句,该过程是原子性的,但对于DDL语句不是原子性的(在8.0版本中,DML和DDL语句都是原子性的了。)。


  • 当开启二进制日志时,在二进制日志轮换,或实例关闭时,MySQL会将之前二进制日志中全部GTID写入mysql.gtid_executed表。若MySQL意外关闭了,在恢复(recovery)阶段,没写入的GTID会再次被写入mysql.gtid_executed(当然关闭了二进制日志,恢复时,没写入的GTID是不能恢复的,之后复制也是无法继续的)。


不难看出启用二进制日志时,mysql.gtid_executed表中的GTID不能代表全部的事务,该信息则是由全局系统变量@@GLOBAL.gtid_executed提供的。


[root@mysql.sock][(none)]> select * from mysql.gtid_executed;

+--------------------------------------+----------------+--------------+

| source_uuid | interval_start | interval_end |

+--------------------------------------+----------------+--------------+

| aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa | 1 | 72 |

| c4e5d4a0-a9be-11e9-b444-080027f22add | 101005 | 188707 |

+--------------------------------------+----------------+--------------+

4 rows in set (0.00 sec)


[root@mysql.sock][(none)]> select @@global.gtid_executed;

+-----------------------------------------------------------------------

| @@global.gtid_executed |

+-----------------------------------------------------------------------

| aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-76:,

c4e5d4a0-a9be-11e9-b444-080027f22add:101005-338847 |

+-----------------------------------------------------------------------

1 row in set (0.00 sec)



注意,reset master会将mysql.gtid_executed表清空。


[root@mysql.sock][(none)]> select * from mysql.gtid_executed;

+--------------------------------------+----------------+--------------+

| source_uuid | interval_start | interval_end |

+--------------------------------------+----------------+--------------+

| c4e5d4a0-a9be-11e9-b444-080027f22add | 1 | 188708 |

+--------------------------------------+----------------+--------------+

1 row in set (0.00 sec)


[root@mysql.sock][(none)]> select @@global.gtid_executed;

+-----------------------------------------------+

| @@global.gtid_executed |

+-----------------------------------------------+

| c4e5d4a0-a9be-11e9-b444-080027f22add:1-888712 |

+-----------------------------------------------+

1 row in set (0.00 sec)


[root@mysql.sock][(none)]> select @@global.gtid_purged;

+-----------------------------------------------+

| @@global.gtid_purged |

+-----------------------------------------------+

| c4e5d4a0-a9be-11e9-b444-080027f22add:1-101004 |

+-----------------------------------------------+

1 row in set (0.00 sec)


[root@mysql.sock][(none)]> reset master;

Query OK, 0 rows affected (0.04 sec)


[root@mysql.sock][(none)]> select * from mysql.gtid_executed;

Empty set (0.00 sec)


[root@mysql.sock][(none)]> select @@global.gtid_executed;

+------------------------+

| @@global.gtid_executed |

+------------------------+

| |

+------------------------+

1 row in set (0.00 sec)


[root@mysql.sock][(none)]> select @@global.gtid_purged;

+----------------------+

| @@global.gtid_purged |

+----------------------+

| |

+----------------------+

1 row in set (0.00 sec)

二进制 日志 事务 实例 代表 系统 存储 全局 原子 变量 是由 语句 元素 单个 多个 就是 标识 版本 意外 顾名思义 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 谷歌云服务器设定运行时间 南京市bim软件开发工程 煤炭一体化软件开发 网络安全稿子150字二年级 软件开发的公司去哪里看 沈阳职业学院计算机网络技术 校园校园网络安全 刷视频软件开发商怎么赚钱 长沙安卓软件开发公司哪家比较好 怎么隐藏游戏服务器 计算机网络技术期末考试难点 c 数据库的历史操作查询 数据库中的分区是什么意思 软件开发测试性格改变 网络技术流程 最迟开始时间 加载不到数据库驱动怎么办 软件开发公司需要多少人 做软件开发需要测试账号吗 个人素质对软件开发的影响 义乌云软件开发项目 软件开发工程师的工资多少 街道安全风险数据库 市生态环境局网络安全 派出所人口采集数据库 byd云服务器 舟山fil服务器价格 计算机网络技术提取年龄 纵横互联网络科技有限公司 广东电网网络安全通报 漯河互联网科技公司
0