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 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。

相关推荐
一叶屋檐8 分钟前
Neo4j 图书馆借阅系统知识图谱设计
服务器·数据库·cypher
好吃的肘子1 小时前
MongoDB 应用实战
大数据·开发语言·数据库·算法·mongodb·全文检索
weixin_472339461 小时前
MySQL MCP 使用案例
数据库·mysql
lqlj22332 小时前
Spark SQL 读取 CSV 文件,并将数据写入 MySQL 数据库
数据库·sql·spark
遗憾皆是温柔3 小时前
MyBatis—动态 SQL
java·数据库·ide·sql·mybatis
未来之窗软件服务3 小时前
Cacti 未经身份验证SQL注入漏洞
android·数据库·sql·服务器安全
fengye2071613 小时前
在MYSQL中导入cookbook.sql文件
数据库·mysql·adb
Ailovelearning4 小时前
neo4j框架:ubuntu系统中neo4j安装与使用教程
数据库·neo4j
_星辰大海乀5 小时前
表的设计、聚合函数
java·数据结构·数据库·sql·mysql·数据库开发
未来之窗软件服务5 小时前
solidwors插件 开发————仙盟创梦IDE
前端·javascript·数据库·ide·仙盟创梦ide