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

相关推荐
kejijianwen1 小时前
JdbcTemplate常用方法一览AG网页参数绑定与数据寻址实操
服务器·数据库·oracle
编程零零七2 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
高兴就好(石4 小时前
DB-GPT部署和试用
数据库·gpt
这孩子叫逆5 小时前
6. 什么是MySQL的事务?如何在Java中使用Connection接口管理事务?
数据库·mysql
Karoku0665 小时前
【网站架构部署与优化】web服务与http协议
linux·运维·服务器·数据库·http·架构
码农郁郁久居人下5 小时前
Redis的配置与优化
数据库·redis·缓存
MuseLss6 小时前
Mycat搭建分库分表
数据库·mycat
Hsu_kk7 小时前
Redis 主从复制配置教程
数据库·redis·缓存
DieSnowK7 小时前
[Redis][环境配置]详细讲解
数据库·redis·分布式·缓存·环境配置·新手向·详细讲解
程序猿小D7 小时前
第二百三十五节 JPA教程 - JPA Lob列示例
java·数据库·windows·oracle·jdk·jpa