头图

本文介绍了 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 版本的实例(过程略)。

参数参数值
主机 IP10.186.58.39
主机名node 1
端口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:1a45d9e72-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-2a45d9e72-c33b-11ee-a645-02000aba3a27:2:dba:1-2 这两个 GTID 是我们创建库,表的操作,可以简单理解为 a45d9e72-c33b-11ee-a645-02000aba3a27:1-2 这两个事务(非打标签事务)。

总结

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

爱可生开源社区
426 声望209 粉丝

成立于 2017 年,以开源高质量的运维工具、日常分享技术干货内容、持续的全国性的社区活动为社区己任;目前开源的产品有:SQL审核工具 SQLE,分布式中间件 DBLE、数据传输组件DTLE。