Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL gtid

MySQL gtid的具体使用

作者:98seven

本文详细介绍了MySQL的GTID的概念、格式、相关参数以及生命周期,同时还讲解了GTID的自动定位、复制监控与管理等功能,GTID是MySQL复制环境中的一种唯一标识,可以有效避免重复复制的现象,保持数据一致,文章中还列举了多个示例,感兴趣的可以了解一下

1. 什么是GTID

从MySQL 5.6.5 开始新增了一种基于 GTID 的复制方式。GTID (Global Transaction ID)是全局事务ID,由主库上生成的与事务绑定的唯一标识,这个标识不仅在主库上是唯一的,在MySQL复制环境内也是唯一的。

2. GTID格式及含义

GTID = source_uuid:transaction_id

source_uuid是发起事务服务器的server_uuid,是一个MySQL实例的唯一标识,可以通过show variables like 'server_uuid'查看。transaction_id代表了该实例上已经提交的事务数量,是一个单调递增的序列号,从1开始,1-2代表第二个事务;第1-n代表n个事务。

GTID复制拓扑中,无论事务被复制了多少次,事务的GTID都保持不变。一旦某个事务在服务器上提交后,后续所有相同GTID的事务都会被忽略,这种机制可以有效避免重复复制的现象,保持数据一致。

示例17a7f2A47-71CA-11E1-9E33-00163e429562:1含义: 7a7f2A47-71CA-11E1-9E33-00163e429562 是这个节点的server_uuid,1为这个节点上提交的第1个事务的事务号,如果提交了10个事务,GTID会是: 7a7f2A47-71CA-11E1-9E33-00163e429562:1-10

【如果有多个范围要表示,则事务编号的范围可以用冒号分隔】
示例27a7f2A47-71CA-11E1-9E33-00163e429562:1-3:11:47-49含义:执行了源自7a7f2A47-71CA-11E1-9E33-00163e429562服务器的第1-3个事务、第11个事务、第47-49个事务

【GTID集还能表示来自不同数据源的事务集】
示例37a7f2A47-71CA-11E1-9E33-00163e429562:1-77439,82b6d927-81cc-11ee-9edf-00163e202091:1-98191含义:执行了源自7a7f2A47-71CA-11E1-9E33-00163e429562服务器的第1-77439个事务和源自82b6d927-81cc-11ee-9edf-00163e202091服务器的第1-98191个事务

MySQL 8.3 创新版于 2024 年 1 月 16 号发布,该版本扩展了 MySQL
复制和组复制中使用全局事务标识(GTID)的格式,支持给 GTID 打标签,以支持识别事务组。此增强功能可以为特定事务组的 GTID
分配唯一标识。例如:包含数据操作的事务可以很容易地与管理操作产生的事务区分开来,只需要比较他们的 GTID。
带标签的格式扩展后的 GTID 格式是 source_id:<tag>:transaction_id,其中 tag 是最长为 8 个字符的任意字符串。通过设置系统变量 gtid_next 的值为 automatic: 启用,或者设置 gtid_next 为 uuid::transaction_id 以将单个事务的 uuid 设置为任意值,并为其分配自定义标签。

3. GTID相关参数

查看关于gtid的系统参数:

mysql> show variables like '%gtid%';
+-----------------------------------+-----------------------------------------------+
| Variable_name                     | Value                                         |
+-----------------------------------+-----------------------------------------------+
| binlog_gtid_simple_recovery       | ON                                            |
| enforce_gtid_consistency          | ON                                            |
| gtid_executed                     | be423c64-90c8-11ed-bf93-00163e0fcdea:1-1169392|
| gtid_executed_compression_period  | 1000                                          |
| gtid_mode                         | ON                                            |
| gtid_next                         | AUTOMATIC                                     |
| gtid_owned                        |                                               |
| gtid_purged                       | be423c64-90c8-11ed-bf93-00163e0fcdea:1-1137671|
| session_track_gtids               | OFF                                           |
+-----------------------------------+-----------------------------------------------+
9 row in set (0.00 sec)

3.1 gtid_mode

【作用】控制是否开启GTID模式的日志记录及日志内可以包含的事务类型
【可选值】

3.2 enforce_gtid_consistency

【作用】指定从库执行事务时的一致性要求,控制SQL语句是否仅允许违反GTID一致性
【可选值】

开启该参数服务器仅允许GTID安全的语句执行,防止某些不安全的语句导致GTID复制失败。在启用GTID模式复制前,必须设置为true。当设置为true以后,以下操作将不再可用:

enforce_gtid_consistency验证语句的GTID兼容性是在写二进制日志的时候,如果在服务器上禁用了二进制日志或过滤器删除了语句而未写入二进制日志,都不会检查。

3.3 gtid_executed

全局变量(@@global.gtid_executed),包含服务器执行的所有事务的GTID集和gtid_purged被设置的变量。
@@global.gtid_executedshow master statusshow slave status语句输出executed_gtid_set字段的值相同。
当服务器启动时,会根据binlog_gtid_simple_reocovery参数选择不同的方法初始化其值。

3.4 gtid_next

gtid_next是会话级变量,代表下一个事务即将分配的GTID。当事务在主库提交时,系统会自动分配一个新的GTID,当事务复制到从库时,会保留主库分配的GTID,而不是由从库分配新的GTID。GTID可以设置为下列值:

此参数的功能还受到gtid_mode参数的影响,如果gtid_mode设置为OFF(只有匿名事务),那么此参数无效。

【注意】如果用SERVER_UUID:TRANSACTION_NUMBER手动为事务分配了GTID,无论事务提交或回滚,在开启下一个事务前,必须再次手动设置gtid_next的值或设置为automatic

3.5 gtid_purged

gtid_purged是全局变量,代表所有在服务器上已提交,但是不在二进制日志中的事务的GTID集。gtid_purgedgtid_exeucted的子集。

gtid_purged中的GTID包含下列类别:

gtid_purgedgtid_executed一样,会在服务器启动或重启时根据binlog_gtid_simple_reocovery参数选择不同的方法初始化其值。

如果要求过滤某些事务,可以手动设置gtid_purged值,这些值会被加入gtid_executed,即使这些事务从未执行。
gtid_purged设置方式有2种:

binlog_gtid_simple_reocovery控制MySQL启动或重启时如何检索二进制日志来计算gtid_executedgtid_purged变量的初始值。当binlog_gtid_simple_recovery=true时,只读取最旧和最新的binlog文件,否则遍历所有binlog文件。

3.6 gtid_owned

表示当前正在执行的事务的gtid。全局或会话级只读变量,通常只内部使用(其输出可能对于普通用户来说不是非常直观),帮助MySQL管理和跟踪当前正在处理的事务。

由于它是全局和会话级别的,其显示的内容可能会根据当前的会话和全局状态而有所不同。

3.7 gtid_executed_compression_period

控制压缩mysql.gtid_executed表的事务阈值数量。

mysql> show variables like 'gtid_executed_compression_period';
+-----------------------------------+---------+
| Variable_name                     | Value   |
+-----------------------------------+---------+
| gtid_executed_compression_period  | 1000    |
+-----------------------------------+---------+
1 row in set (0.00 sec)

该参数默认值为1000,指在每执行1000次事务后执行gtid_executed表的压缩,方法是将source_id一样的事务进行合并(仅二进制日志未开启时生效)。二进制日志开启时,此参数无效,只有在二进制日志轮换时才进行压缩。

3.8 binlog_gtid_simple_recovery

binlog_gtid_simple_recovery 是MySQL中一个重要的系统变量,它用于控制在MySQL启动或重启时,如何遍历二进制日志文件(binlog)以寻找全局事务标识符(GTID)。这个变量对于使用GTID进行复制的环境尤为重要,因为它影响了MySQL如何初始化和验证GTID集合。

【版本引入】在MySQL 5.7.5版本中,这个变量以simplified_binlog_gtid_recovery的形式被引入;从MySQL 5.7.6版本开始,它被重命名为binlog_gtid_simple_recovery

3.9 session_track_gtids

session_track_gtids 是 MySQL 中的一个系统变量,用于控制 MySQL 会话(session)中是否追踪全局事务标识符(GTID)的状态。这个变量对于使用 GTID 进行复制和读写分离的 MySQL 环境尤为重要,因为它可以帮助确保数据的一致性和准确性。

【可选值】:

【配置建议】在大多数情况下,如果不需要进行复杂的读写分离或数据一致性校验,可以保持其默认值 OFF 以减少性能开销。如果需要这些功能,则可以根据实际情况选择 OWN_GTID 或 ALL_GTIDS

3.10 其他相关参数

虽然不直接与GTID的配置相关,但以下参数在配置GTID主从复制时也非常重要:

4. GTID生命周期

4.1 GTID的生成与分配

4.2 2. GTID的持久化与记录

事务提交后很短的时间内,将GTID写入@@global.gtid_executed状态变量。此变量包含了所有已执行的事务,代表了主库的当前状态。

4.3 GTID的传输与应用

4.4 GTID的清理与重置

4.5 GTID的并行复制

多线程复制:如果启用了多线程复制(slave_parallel_workers > 0),MySQL会并行执行GTID事务。此时,gtid_executed变量的值可能会有GAP,系统会自动更新这些值以反映并行执行的状态。

5. GTID自动定位

GTID自动定位是MySQL复制中的一个重要特性,它允许副本(‌slave)‌自动定位到主库(‌master)‌的正确位置进行数据同步,‌而无需手动指定日志文件和位置,极大地简化了主从复制的管理和切换过程。
在使用GTID进行复制时,‌副本通过启用SOURCE_AUTO_POSITION或MASTER_AUTO_POSITION选项来自动连接到主库。‌这个选项允许副本在初始握手时发送一个包含已接收、‌提交或两者兼有的事务的GTID集合,‌从而使得副本能够自动定位到正确的位置进行数据同步。‌

CHANGE MASTER TO 
MASTER_HOST='master_host_name', 
MASTER_USER='replication_user_name', 
MASTER_PASSWORD='replication_password', 
MASTER_AUTO_POSITION = 1;

MASTER_AUTO_POSITION = 1 表示slave应该自动定位到master的GTID。
如果已经有一个配置好的slave,并且想要开启或者更改GTID自动定位,可以使用以下命令:

STOP SLAVE;
CHANGE MASTER TO 
MASTER_AUTO_POSITION = 1;
START SLAVE;

6. GTID复制监控与管理

6.1 mysql.gtid_executed表

mysql.gtid_executed表记录了是服务器上已经执行事务的GTID。表的结构如下:

+------------------+-------------+------+-------+------------+-----------+
| Field            | Type        | Null | Key   | Default    | Extra     |
+------------------+-------------+------+-------+------------+-----------+
| source_uuid      | char(36)    | NO   | PRI   | NULL       |           |
+------------------+-------------+------+-------+------------+-----------+
| interval_start   | bigint      | NO   | PRI   | NULL       |           |
+------------------+-------------+------+-------+------------+-----------+
| interval_end     | bigint      | NO   |       | NULL       |           |
+------------------+-------------+------+-------+------------+-----------+
3 rows in set (0.00 sec)

因此当启用二进制日志记录时,mysql.gtid_executed表并不保存最新已执行事务GTID,最新状态可以由gtid_executed全局系统变量(@@global.gtid_executed)提供,该变量在每次提交事务后更新。为了节省空间,MySQL服务器会定期压缩mysql.gtid_executed表,方法是将多行表示为单行GTID集。

6.2 监控复制心跳

复制建立后,主库会定期向从库发送心跳信号(即使没有发送事务),心跳可以在建立主从复制时,通过change master to的master_heartbeat_period子句指定。如果未指定则默认是从库连接超时的一半:

mysql> show variables like 'slave_net_timeout';
+-------------------+---------+
| Variable_name     | Value   |
+-------------------+---------+
| slave_net_timeout | 10      |
+-------------------+---------+
1 row in set (0.00 sec)

最近一次的心跳时间可以通过performance_schema.replication_connection_status表中的last_heartbeat_timestamp查看

到此这篇关于MySQL gtid的具体使用的文章就介绍到这了,更多相关MySQL gtid内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文