深入理解 MySQL GTID
GTID 的概念
何为 GITD
GTID(global transaction identifier) 是全局事务标识符, 在 MySQL5.6 版本中作为一个超级特性被推出. 事务标识不仅对于 Master(起源) 的服务器来说是惟一的, 而且在整个复制拓扑架构来说, 也是全局唯一的.
1.GTID 的格式
GTID = source_id:transaction_id
GTID 分为两部分, source_id 和 transaction_id.source_id 是通过使用 MySQL 服务的 server_uuid 来表示 .transaction_id 是在事务提交的时候由系统顺序分配的一个序列号.
使用 show master status 查看当前实例执行过的 GTID 事务信息. 如下:(root@localhost)[Ztest]>show master status\G;
***************************1.row***************************
File:mysql-bin.000005
Position:1959
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:4160e9b3-58d9-11e8-b174-005056af6f24:1-10
1rowinset(0.00sec)
可以看出, 本实例的 source_id 为 4160e9b3-58d9-11e8-b174-005056af6f24,transaction_id 为 1-10, 说明是提交了 10 个事务.
MySQL 数据库服务的 uuid 的查询方式.(root@localhost)[(none)]>show GLOBAL VARIABLES like'server_uuid';
+---------------+--------------------------------------+
|Variable_name|Value|
+---------------+--------------------------------------+
|server_uuid|4160e9b3-58d9-11e8-b174-005056af6f24|
+---------------+--------------------------------------+
1rowinset(0.02sec)
2.GTID 的集合
GTID 集合是一组全局事务标识符, 格式如下:gtid_set:
uuid_set[,uuid_set]...
|''
uuid_set:
uuid:interval[:interval]...uuid:
hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhhh
h:
[0-9|A-F]
interval:
n[-n]
(n>=1)
3.GTID 的管理
MySQL 库中新增了 gtid_exectued 表, 在 MySQL 8.0 中表结构如下:(root@localhost)[(none)]>usemysql
Databasechanged
(root@localhost)[mysql]>show create table gtid_executed \G;
***************************1.row***************************
Table:gtid_executed
CreateTable:CREATE TABLE`gtid_executed`(
`source_uuid`char(36)NOT NULL COMMENT'uuid of the source where the transaction was originally executed.',
`interval_start`bigint(20)NOT NULL COMMENT'First number of interval.',
`interval_end`bigint(20)NOT NULL COMMENT'Last number of interval.',
PRIMARY KEY(`source_uuid`,`interval_start`)
)/*!50100 TABLESPACE `mysql` */ENGINE=InnoDBDEFAULT CHARSET=utf8
1rowinset(0.00sec)
查看目前已经执行过的事务, 语句如下:(root@localhost)[mysql]>select*fromgtid_executed;
+--------------------------------------+----------------+--------------+
|source_uuid|interval_start|interval_end|
+--------------------------------------+----------------+--------------+
|4160e9b3-58d9-11e8-b174-005056af6f24|1|26|
+--------------------------------------+----------------+--------------+
1rowinset(0.01sec)
可以分析
当未开启 binlog 时, 每个事务会记录到 gitd_executed 表中.
当开启 binlog 时, 事务不会立即写入 gitd_executed 表中, 只有当 Binlog rotate 轮询时亦或者数据库服务关闭时, 会把事务写入至 gtid_executed 表中.
实验效果如下:
1. 插入数据前的 gtid_executed 表的情况:(root@localhost)[mysql]>select*fromgtid_executed;
+--------------------------------------+----------------+--------------+
|source_uuid|interval_start|interval_end|
+--------------------------------------+----------------+--------------+
|4160e9b3-58d9-11e8-b174-005056af6f24|1|26|
+--------------------------------------+----------------+--------------+
1rowinset(0.01sec)
2. 插入准备数据:insertintoztest.zstudent(stu_name,sex)values('hrd30','M');
insertintoztest.zstudent(stu_name,sex)values('hrd31','M');
commit;
3. 插入数据后的 gtid_executed 表的情况:(root@localhost)[mysql]>select*fromgtid_executed;
+--------------------------------------+----------------+--------------+
|source_uuid|interval_start|interval_end|
+--------------------------------------+----------------+--------------+
|4160e9b3-58d9-11e8-b174-005056af6f24|1|26|
+--------------------------------------+----------------+--------------+
1rowinset(0.00sec)
如上情况, 没有任何改变, Binlog rotate 后, 查看 gtid_executed 表的情况(root@localhost)[mysql]>flush logs;
QueryOK,0rows affected(0.01sec)
(root@localhost)[mysql]>select*fromgtid_executed;
+--------------------------------------+----------------+--------------+
|source_uuid|interval_start|interval_end|
+--------------------------------------+----------------+--------------+
|4160e9b3-58d9-11e8-b174-005056af6f24|1|28|
+--------------------------------------+----------------+--------------+
1rowinset(0.00sec)
可以看到, 上述提交的两个事务, 在 binlog 刷新之后, 写入到了 gitd_executed 表中.
知识点备注:
RESET MASTER 会清空 gitd_executed 表.
Linux 公社的 RSS 地址: https://www.linuxidc.com/rssFeed.aspx
来源: http://www.linuxidc.com/Linux/2018-06/152857.htm