May 4, 2013

[MySQL 5.6] GTID内部实现、运维变化及存在的bug

由于之前没太多深入关注gtid,这里给自己补补课,本文是我看文档和代码的整理记录。 本文的主要目的是记下跟gtid相关的backtrace,用于以后的问题排查。另外也会讨论目前在MySQL5.6.11版本中存在的bug。 本文讨论的内容包括 一.主库上的gtid产生及记录 二.备库如何使用GTID复制 三.主备运维的变化 四.MySQL5.6.11存在的bug 前言:什么是GTID 什么是GTID呢, 简而言之,就是全局事务ID(global transaction identifier ),最初由google实现,官方MySQL在5.6才加入该功能,本文的起因在于5.6引入一大堆的gtid相关变量,深感困惑。 去年年中的时候,也写过一片简短的博客,大致介绍了下gtid是什么,http://mysqllover.com/?p=87 。本文也不打算太多文字的介绍,因为网络上已经有大量的类似文章。 GTID的格式类似于: 7a07cd08-ac1b-11e2-9fcf-0010184e9e08:1 这是在我的一台服务器上生成的gtid记录,它在binlog中表现的事件类型就是: GTID_LOG_EVENT:用于表示随后的事务的GTID 另外还有两种类型的GTID事件: ANONYMOUS_GTID_LOG_EVENT :匿名GTID事件类型(暂且不论) PREVIOUS_GTIDS_LOG_EVENT: 用于表示当前binlog文件之前已经执行过的GTID集合,记录在Binlog文件头,例如: # at 120 #130502 23:23:27 server id 119821  end_log_pos 231 CRC32 0x4f33bb48     Previous-GTIDs # 10a27632-a909-11e2-8bc7-0010184e9e08:1, # 7a07cd08-ac1b-11e2-9fcf-0010184e9e08:1-1129 GTID字符串,用“:”分开,前面表示这个服务器的server_uuid,这是一个128位的随机字符串,在第一次启动时生成(函数generate_server_uuid),对应的variables是只读变量server_uuid。 它能以极高的概率保证全局唯一性,并存到文件DATA/auto.cnf中。因此要注意保护这个文件不要被删除或修改,不然就麻烦了。 第二部分是一个自增的事务ID号,事务id号+server_uuid来唯一标示一个事务。 除了单独的GTID外,还有一个GTID SET的概念。一个GTID SET的表示类似于: 7a07cd08-ac1b-11e2-9fcf-0010184e9e08:1-31 GTID_EXECUTED和GTID_PURGED是典型的GTID SET类型变量;在一个复制拓扑中,GTID_EXECUTED 可能包含好几组数据,例如: mysql> show global variables like […]