MySQL8.3 可以给 GTID 打标签了!

本文介绍了 MySQL 8.3 的一个新特性,给 GTID 打标签~

作者:李富强,爱可生 DBA 团队成员,熟悉 MySQL,TiDB,OceanBase 等数据库。相信持续把对的事情做好一点,会有不一样的收获。

爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

本文约 900 字,预计阅读需要 3 分钟。

摘要

MySQL 8.3 创新版于 2024 年 1 月 16 号发布,该版本扩展了 MySQL 复制和组复制中使用全局事务标识(GTID)的格式,支持给 GTID 打标签,以支持识别事务组。此增强功能可以为特定事务组的 GTID 分配唯一标识。例如:包含数据操作的事务可以很容易地与管理操作产生的事务区分开来,只需要比较他们的 GTID。

GTID 格式

原始格式

原始 GTID 格式是 source_id:transaction_id

  • source_id 标识源服务器,通常用 server_uuid 表示。
  • transaction_id 代表事务在源上提交的顺序,例如要提交第一个事务的 transaction_id 为 1,要在同一源服务器上提交的第十个事务的 transaction_id 就是 10。

全局唯一标识符(GTID)是创建并与源服务器上提交的每个事务相关联的唯一标识符。此标识符不仅对其发起的服务器是唯一的,在给定复制拓扑中所有服务器上都是唯一的。

带标签的格式

扩展后的 GTID 格式是 source_id:<tag>:transaction_id ,其中 tag 是最长为 8 个字符的任意字符串。通过设置系统变量 gtid_next 的值为 automatic:<tag> 启用,或者设置 gtid_nextuuid:<tag>:transaction_id 以将单个事务的 uuid 设置为任意值,并为其分配自定义标签。

操作实验

通过 mysql-shell 工具,快速部署一个 MySQL 8.3 版本的实例(过程略)。

参数 参数值
主机 IP 10.186.58.39
主机名 node 1
端口 3333
MySQL 版本 8.3.0

环境查看

sql 复制代码
#node1
SQL > select @@hostname,@@version,@@port,@@gtid_mode,@@gtid_executed;
+------------+-----------+--------+-------------+------------------------------------------+
| @@hostname | @@version | @@port | @@gtid_mode | @@gtid_executed                          |
+------------+-----------+--------+-------------+------------------------------------------+
| node1      | 8.3.0     |   3333 | ON          |
+------------+-----------+--------+-------------+------------------------------------------+

给 GTID 打标签,以创建一个用户并赋权操作举例(管理操作)。

sql 复制代码
#创建用户和赋权操作,给 GTID 打的标签为 dba

 SQL > set gtid_next="AUTOMATIC:dba";
 Query OK, 0 rows affected (0.0032 sec)

 SQL > create user dba@'%'  identified with mysql_native_password by 'dba';
 Query OK, 0 rows affected (0.0332 sec)

 SQL > select @@hostname,@@version,@@port,@@gtid_mode,@@gtid_executed;
+------------+-----------+--------+-------------+------------------------------------------------+
| @@hostname | @@version | @@port | @@gtid_mode | @@gtid_executed                                |
+------------+-----------+--------+-------------+------------------------------------------------+
| node1      | 8.3.0     |   3333 | ON          | a45d9e72-c33b-11ee-a645-02000aba3a27:dba:1     |
+------------+-----------+--------+-------------+------------------------------------------------+


 SQL > grant all privileges on *.* to dba@'%';
 Query OK, 0 rows affected (0.0126 sec)


 SQL > select @@hostname,@@version,@@port,@@gtid_mode,@@gtid_executed;
+------------+-----------+--------+-------------+--------------------------------------------------+
| @@hostname | @@version | @@port | @@gtid_mode | @@gtid_executed                                  |
+------------+-----------+--------+-------------+--------------------------------------------------+
| node1      | 8.3.0     |   3333 | ON          | a45d9e72-c33b-11ee-a645-02000aba3a27:dba:1-2     |
+------------+-----------+--------+-------------+--------------------------------------------------+

小结:a45d9e72-c33b-11ee-a645-02000aba3a27:dba:1a45d9e72-c33b-11ee-a645-02000aba3a27:dba:2 这两个 GTID 是我们创建用户并赋权的操作,可以简单理解为 dba:1-2 这两个事务(打标签事务)。

切换为原始 GTID 生成模式,执行创建库和表操作(业务操作)。

sql 复制代码
#执行创建库,表操作

 SQL > set gtid_next="AUTOMATIC";
 Query OK, 0 rows affected (0.0032 sec)

 SQL > create database lfq;
 Query OK, 1 row affected (0.0182 sec)


 SQL > select @@hostname,@@version,@@port,@@gtid_mode,@@gtid_executed;
+------------+-----------+--------+-------------+--------------------------------------------------+
| @@hostname | @@version | @@port | @@gtid_mode | @@gtid_executed                                  |
+------------+-----------+--------+-------------+--------------------------------------------------+
| node1      | 8.3.0     |   3333 | ON          | a45d9e72-c33b-11ee-a645-02000aba3a27:1:dba:1-2   |
+------------+-----------+--------+-------------+--------------------------------------------------+

 SQL > create table lfq.t1(c1 int primary key ,c2 varchar(10));
Query OK, 0 rows affected (0.0685 sec)


 SQL > select @@hostname,@@version,@@port,@@gtid_mode,@@gtid_executed;
+------------+-----------+--------+-------------+--------------------------------------------------+
| @@hostname | @@version | @@port | @@gtid_mode | @@gtid_executed                                  |
+------------+-----------+--------+-------------+--------------------------------------------------+
| node1      | 8.3.0     |   3333 | ON          | a45d9e72-c33b-11ee-a645-02000aba3a27:1-2:dba:1-2 |
+------------+-----------+--------+-------------+--------------------------------------------------+

小结:a45d9e72-c33b-11ee-a645-02000aba3a27:1:dba:1-2a45d9e72-c33b-11ee-a645-02000aba3a27:2:dba:1-2 这两个 GTID 是我们创建库,表的操作,可以简单理解为 a45d9e72-c33b-11ee-a645-02000aba3a27:1-2 这两个事务(非打标签事务)。

总结

  1. 通过对 GTID 打标签,可以比较容易地把包含管理操作产生的事务与数据操作的事务区分开来。
  2. 功能略微简单,期待相关功能的进一步丰富。

更多技术文章,请访问:opensource.actionsky.com/

关于 SQLE

SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。

相关推荐
Acrelhuang5 分钟前
安科瑞5G基站直流叠光监控系统-安科瑞黄安南
大数据·数据库·数据仓库·物联网
十叶知秋1 小时前
【jmeter】jmeter的线程组功能的详细介绍
数据库·jmeter·性能测试
瓜牛_gn2 小时前
mysql特性
数据库·mysql
奶糖趣多多3 小时前
Redis知识点
数据库·redis·缓存
CoderIsArt4 小时前
Redis的三种模式:主从模式,哨兵与集群模式
数据库·redis·缓存
师太,答应老衲吧6 小时前
SQL实战训练之,力扣:2020. 无流量的帐户数(递归)
数据库·sql·leetcode
Channing Lewis7 小时前
salesforce case可以新建一个roll up 字段,统计出这个case下的email数量吗
数据库·salesforce
毕业设计制作和分享9 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis
ketil279 小时前
Redis - String 字符串
数据库·redis·缓存
Hsu_kk10 小时前
MySQL 批量删除海量数据的几种方法
数据库·mysql