作者:李富强,爱可生 DBA 团队成员,熟悉 MySQL,TiDB,OceanBase 等数据库。相信持续把对的事情做好一点,会有不一样的收获。
爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
本文约 900 字,预计阅读需要 3 分钟。
1摘要
MySQL 8.3 创新版于 2024 年 1 月 16 号发布,该版本扩展了 MySQL 复制和组复制中使用全局事务标识(GTID)的格式,支持给 GTID 打标签,以支持识别事务组。此增强功能可以为特定事务组的 GTID 分配唯一标识。例如:包含数据操作的事务可以很容易地与管理操作产生的事务区分开来,只需要比较他们的 GTID。
2GTID 格式
原始格式
原始 GTID 格式是 source_id:transaction_id
- source_id 标识源服务器,通常用 server_uuid 表示。
- transaction_id 代表事务在源上提交的顺序,例如要提交第一个事务的 transaction_id 为 1,要在同一源服务器上提交的第十个事务的 transaction_id 就是 10。
全局唯一标识符(GTID)是创建并与源服务器上提交的每个事务相关联的唯一标识符。此标识符不仅对其发起的服务器是唯一的,在给定复制拓扑中所有服务器上都是唯一的。
带标签的格式
扩展后的 GTID 格式是 source_id::transaction_id,其中 tag 是最长为 8 个字符的任意字符串。通过设置系统变量 gtid_next 的值为 automatic: 启用,或者设置 gtid_next 为 uuid::transaction_id 以将单个事务的 uuid 设置为任意值,并为其分配自定义标签。
3操作实验
通过 mysql-shell 工具,快速部署一个 MySQL 8.3 版本的实例(过程略)。
参数 | 参数值 |
---|---|
主机 IP | 10.186.58.39 |
主机名 | node1 |
端口 | 3333 |
MySQL 版本 | 8.3.0 |
环境查看
#node1
SQL > select @@hostname,@@version,@@port,@@gtid_mode,@@gtid_executed;
+------------+-----------+--------+-------------+------------------------------------------+
| @@hostname | @@version | @@port | @@gtid_mode | @@gtid_executed |
+------------+-----------+--------+-------------+------------------------------------------+
| node1 | 8.3.0 | 3333 | ON |
+------------+-----------+--------+-------------+------------------------------------------+
给 GTID 打标签,以创建一个用户并赋权操作举例(管理操作)。
#创建用户和赋权操作,给 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:1 和 a45d9e72-c33b-11ee-a645-02000aba3a27:dba:2 这两个 GTID 是我们创建用户并赋权的操作,可以简单理解为 dba:1-2 这两个事务(打标签事务)。
切换为原始 GTID 生成模式,执行创建库和表操作(业务操作)。
#执行创建库,表操作
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-2 和 a45d9e72-c33b-11ee-a645-02000aba3a27:2:dba:1-2 这两个 GTID 是我们创建库,表的操作,可以简单理解为 a45d9e72-c33b-11ee-a645-02000aba3a27:1-2 这两个事务(非打标签事务)。
4总结
- 通过对 GTID 打标签,可以比较容易地把包含管理操作产生的事务与数据操作的事务区分开来。
- 功能略微简单,期待相关功能的进一步丰富。
本文关键字:#MySQL# #新特性# #GTID#
阅读推荐
故障分析 | MySQL 执行 Online DDL 操作报错空间不足?
故障分析 | MySQL 扩展 VARCHAR 长度遭遇问题的总结
故障分析 | MySQL 无法修改主键?原来是因为这个参数
故障分析 | MySQL 全文索引触发 OOM 一例
技术分享 | 详解 MySQL 三表 JOIN
技术分享 | 八怪:再谈 MySQL 8 这两个精准的时间戳
技术分享 | 基于 MySQL 多通道主主复制的机房容灾方案
关于 SQLE
SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。
SQLE 获取
🔗 Github https://github.com/actiontech/sqle📚 文档 https://actiontech.github.io/sqle-docs/💻 官网 https://opensource.actionsky.com/sqle/👥 微信技术交流群:添加管理员微信 ActionOpenSource📊 点击 原文链接 查看社区版和企业版功能对比:https://actiontech.github.io/sqle-docs/docs/support/compare