GTID
Mysql5.6引入GTID(Global Transaction IDs),多线程复制;
由服务器的UUID和事务ID号组成唯一标识某一个主机的某个事务的ID号;
每一个事务首部都有GTID,因此GTID使得追踪和比较事务变得简单,能够快速恢复数据库。
GTID有事务的编号,主从可以自动协商发现那些事务已经执行,没有执行;
何时产生
当一个事务提交时,就会分配一个GTID(前提是事务有写入到binlog),GTID单调递增且连续。
日志记录上position方式和GTID方式区别
主从复制,默认是通过pos复制(postion)方式,将用户进行的每一项操作都进行编号(pos),每一个event都有一个起始编号,一个终止编号。GTID就是类似于pos的一个作用,全局通用并且日志文件里事件的GTID值是一致的.
pos与GTID在日志里是一个标识符,在slave 里已不同的方式展现。
GTID的生成受gtid_next控制。
在Master上,gtid_next是默认的AUTOMATIC,即GTID在每次事务提交时自动生成。它从当前已执行的GTID集合(即gtid_executed)中,找一个大于0的未使用的最小值作为下个事务GTID。同时将GTID写入到binlog(set gtid_next记录),在实际的更新事务记录之前。
在Slave上,从binlog先读取到主库的GTID(即set gtid_next记录),而后执行的事务采用该GTID。
GTID变量
- gtid_executed
如何查看已经执行过的GTID?
系统表 mysql.gtid_executed 存放了所有执行过的GTID(在活动的binlog中的除外),但是由于不包含活动的binlog当中的GTID,因此需要查看精确值时,可以查看 global variable gtid_executed 的值,这个变量的值是准确的(或者 show master status )。
同一个GTID的事务不会在一个Server上执行两次,可以保证数据一致性。
- GTID SET
GTID SET是指多个GTID的集合,示例如下:
2174B383-5441-11E8-B90A-C80AA9429562:1-3, 24DA167-0C0C-11E8-8442-00059A3C7B00:1-19
gtid_executed 和 gtid_purged 这两个系统变量 都是 GTID SET
- gtid_purged
这个一个 GTID SET,包含了所有已经提交过的,但是不在 binlog 当中的 GTID ,它是 gtid_executed 的子集。以下几种 GTID 都会添加到 gtid_purged 当中:
- 未开启binlog的从库上提交过的GTID
- 已经被 "purge" 掉的 binlog 当中的 GTID 。(当发出 purge binary log 命令之后,如果被 purge的binlog中包含有GTID,那么查看 gtid_purged 变量值的时候,就会看到该变量值发生了变化)
- 使用 'set global gtid_purged= "xxxx" ' 添加的 GTID
什么时候需要设置 gtid_purged 变量?
人为设置 gtid_purged 的目地是为了告诉服务器,即使它们不在 binlog 中,这些 GTID 已经 被applied过了,不能/不需要再做重做。一个必须人为设置 gtid_purged 的场景见文章
参考文档
https://blog.csdn.net/Enmotech/article/details/107479240
https://blog.csdn.net/qingsong3333/article/details/120638849