本文介紹了 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_next 為 uuid:\<tag>:transaction_id 以將單個事務的 uuid 設置為任意值,併為其分配自定義標籤。
操作實驗
通過 mysql-shell 工具,快速部署一個 MySQL 8.3 版本的實例(過程略)。
| 參數 | 參數值 |
|---|---|
| 主機 IP | 10.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: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 這兩個事務(非打標籤事務)。
總結
- 通過對 GTID 打標籤,可以比較容易地把包含管理操作產生的事務與數據操作的事務區分開來。
- 功能略微簡單,期待相關功能的進一步豐富。