千家信息网

再来理解一下杀手级新特性:gtid

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,1.一个事务,就会给一个gtid编号。来看看例子:mysql> show master status;+---------------+----------+--------------+------
千家信息网最后更新 2026年10月31日再来理解一下杀手级新特性:gtid

1.一个事务,就会给一个gtid编号。来看看例子:

mysql> show master status;+---------------+----------+--------------+------------------+------------------------------------------------+| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                              |+---------------+----------+--------------+------------------+------------------------------------------------+| binlog.000017 |    58105 |              |                  | b526042e-89a7-11e8-bddb-000c29d7d637:1-1304086 |+---------------+----------+--------------+------------------+------------------------------------------------+1 row in set (0.00 sec)mysql> insert into student(id) values(5);Query OK, 1 row affected (0.01 sec)mysql> show master status;+---------------+----------+--------------+------------------+------------------------------------------------+| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                              |+---------------+----------+--------------+------------------+------------------------------------------------+| binlog.000017 |    58432 |              |                  | b526042e-89a7-11e8-bddb-000c29d7d637:1-1304087 |+---------------+----------+--------------+------------------+------------------------------------------------+1 row in set (0.00 sec)mysql> begin      -> ;Query OK, 0 rows affected (0.00 sec)mysql> insert into student(id) values(6);Query OK, 1 row affected (0.00 sec)mysql> insert into student(id) values(7);Query OK, 1 row affected (0.00 sec)mysql> commit;Query OK, 0 rows affected (0.01 sec)mysql> show master status;+---------------+----------+--------------+------------------+------------------------------------------------+| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                              |+---------------+----------+--------------+------------------+------------------------------------------------+| binlog.000017 |    58918 |              |                  | b526042e-89a7-11e8-bddb-000c29d7d637:1-1304088 |+---------------+----------+--------------+------------------+------------------------------------------------+1 row in set (0.00 sec)mysql> begin ;Query OK, 0 rows affected (0.00 sec)mysql> insert into student(id) values(8);Query OK, 1 row affected (0.00 sec)mysql> rollback;Query OK, 0 rows affected (0.00 sec)mysql> show master status;+---------------+----------+--------------+------------------+------------------------------------------------+| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                              |+---------------+----------+--------------+------------------+------------------------------------------------+| binlog.000017 |    58918 |              |                  | b526042e-89a7-11e8-bddb-000c29d7d637:1-1304088 |+---------------+----------+--------------+------------------+------------------------------------------------+1 row in set (0.00 sec)mysql> quitBye[root@yw-gz-hd-test-211 ~]# cat /data/mysql3308/auto.cnf [auto]server-uuid=b526042e-89a7-11e8-bddb-000c29d7d637

仔细看看上面的例子,当前gtid:b526042e-89a7-11e8-bddb-000c29d7d637:1304086,然后我插入一条数据,执行一个事务,gtid加1,变成b526042e-89a7-11e8-bddb-000c29d7d637:1304087,然后我用begin commit,标志另外一个事务,插入2条数据,gtid加1,变成b526042e-89a7-11e8-bddb-000c29d7d637:1304088,然后我rollback,gtid不加1.


到这里,我们停下来,思考一下。。。。。。。。。。。

gtid是什么东东?明白了吧,有所领悟了吧。


2.为什么说gtid能避免重复执行,避免丢数据呢?

来看下下面这个例子:

mysql> SET @@SESSION.GTID_NEXT= 'b526042e-89a7-11e8-bddb-000c29d7d637:1304076'/*!*/;Query OK, 0 rows affected (0.00 sec)mysql> select * from student where id=4;+----+------+------+---------+---------+---------------------+---------------------+| id | name | age  | textcol | blobcol | birday              | birday2             |+----+------+------+---------+---------+---------------------+---------------------+|  4 | 3    |    3 | 3       | NULL    | 2018-07-25 10:42:29 | 2018-07-25 10:42:33 |+----+------+------+---------+---------+---------------------+---------------------+1 row in set (0.00 sec)mysql> CREATE TABLE `student` (    -> `id`  int NOT NULL AUTO_INCREMENT ,    -> `name`  varchar(255) NULL ,    -> `age`  int NULL ,    -> `textcol`  text NULL ,    -> `blobcol`  blob NULL ,    -> `birday`  timestamp NULL ON UPDATE CURRENT_TIMESTAMP ,    -> `birday2`  datetime NULL ON UPDATE CURRENT_TIMESTAMP ,    -> PRIMARY KEY (`id`)    -> )    -> ;Query OK, 0 rows affected (0.00 sec)mysql> show master status;+---------------+----------+--------------+------------------+------------------------------------------------+| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                              |+---------------+----------+--------------+------------------+------------------------------------------------+| binlog.000017 |    58105 |              |                  | b526042e-89a7-11e8-bddb-000c29d7d637:1-1304086 |+---------------+----------+--------------+------------------+------------------------------------------------+1 row in set (0.00 sec)mysql> insert into studnet(id) values(5);ERROR 1837 (HY000): When @@SESSION.GTID_NEXT is set to a GTID, you must explicitly set it to a different value after a COMMIT or ROLLBACK. Please check GTID_NEXT variable manual page for detailed explanation. Current @@SESSION.GTID_NEXT is 'b526042e-89a7-11e8-bddb-000c29d7d637:1304076'.

这个信息量有点大。一点点理解,首先我

SET @@SESSION.GTID_NEXT= 'b526042e-89a7-11e8-bddb-000c29d7d637:1304076'

但是当前gtid是b526042e-89a7-11e8-bddb-000c29d7d637:1-1304086 。什么意思,就是说1304076 事务包含在1-1304086。也就是说,这个事务已经执行了,不需要再执行了。理解了吗?

思考一下。。。。。。。。。

这个理解通了,你就会发现,为什么我发布了一个create table 命令,查询返回Query OK, 0 rows affected (0.00 sec)

就是什么作用也没有。意思就是说,这个命令create table 我已经执行过了,所以不需要执行。


再来看看错误:ERROR 1837 (HY000): When @@SESSION.GTID_NEXT is set to a GTID, you must explicitly set it to a different value after a COMMIT or ROLLBACK. Please check GTID_NEXT variable manual page for detailed explanation. Current @@SESSION.GTID_NEXT is 'b526042e-89a7-11e8-bddb-000c29d7d637:1304076'.


意思就是说,你每执行一个命令,都必须先执行 set @@SESSION.GTID_NEXT = xxxxx。

为什么会这样呢?

思考一下。。。。。。


事务 就是 例子 命令 就是说 意思 数据 也就是 也就是说 作用 信息 信息量 标志 错误 面的 查询 杀手 特性 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技股 广州淘业互联网络科技 山东特亿宝互联网科技有限公司 金融科技 互联网金融 上海挚品互联网科技 唐信互联网科技 华中科技大学互联网 汇久创客互联网科技 互联网科技视频素材 互联网科技股午盘股票涨跌 互联网系的金融科技公司 重庆威客帮互联网科技 移动互联网年度科技创新 区块链结合互联网科技 广东工业互联网大赛深圳学泰科技 黑云互联网科技有限公司 图游互联网科技 互联网大会出现的黑科技 武汉亿视互联网科技有限公司 颐高云石互联网科技 宜安科技 互联网金融 青海省互联网新科技 湖南一路畅行互联网科技 广州市恰铎互联网科技有限公司 996高科技互联网公司 朱啸虎曾投资哪些互联网科技企业 2021世界互联网领先科技成果发布 湖北辰鑫科技互联网 互联网金融运营模式中的金融科技 互联网科技创业计划的风险分析
0