MySQL内核月报 2014.12-MySQL· 答疑释惑·binlog event有序性

背景

  对于解析MySQL的binlog用来更新其他数据存储的应用来说,binlog的顺序标识是很重要的。比如根据时间戳得到binlog位点作为解析起点。

  但是binlog里面的事件,是否有稳定的有序性?

  binlog中有三个看上去可能有序的信息:xid、timestamp、gno。本文分析这三个信息在binlog中的有序性。

Xid

  当binlog格式为row,且事务中更新的是事务引擎时,每个事务的结束位置都有Xid,Xid的类型为整型。

  MySQL中每个语句都会被分配一个全局递增的query_id(重启会被重置),每个事务的Xid来源于事务第一个语句的query_id。

  考虑一个简单的操作顺序:

  session 1: begin; select; update;

  session 2: begin; select; update; insert; commit;

  session 1: insert; commit;

  显然Xid2 > Xid1,但因为事务2会先于事务1记录写binlog,因此在这个binlog中,会出现Xid不是有序的情况。

TIMESTAMP

  时间戳的有序性可能是被误用最多的。在mysqlbinlog这个工具的输出结果中,每个事务起始有会输出一个SET TIMESTAMP=n。这个值取自第一个更新事件的时间。上一节的例子中,timestamp2>timestamp1,但因为事务2会先于事务1记录写binlog,因此在这个binlog中,会出现TIMESTAMP不是有序的情况。

GNO

  对于打开了gtid_mode的实例,每个事务起始位置都会有一个gtid event,其内容输出格式为UUID:gn,gno是一个整型数。

  由于NEXT_GTID是可以直接指定的,因此若故意构造,可以很容易得到不是递增的情况,这里只讨论automatic模式下的有序性。

  与上述两种情况不同,gno生成于事务提交时写binlog的时候。注意这里不是生成binlog,而是将binlog写入磁盘的时候。因此实现上确保了同一个UUID下gno的有序性。

小结

  一个binlog文件中的Xid和TIMESTAMP无法保证有序性。在无特殊操作的情况下,相同的UUID可以保证gno的有序性。

时间: 2024-07-30 13:22:44

MySQL内核月报 2014.12-MySQL· 答疑释惑·binlog event有序性的相关文章

MySQL内核月报 2014.12-MySQL· 答疑释惑·server_id为0的Rotate

背景 在MySQL的M-S结构里面,event是binlog日志的基本单位.每个event来源于主库,每个Event都包含了serverid,用于表示该event是哪个实例生成的. 在5.6里面,细心的同学会发现,备库的relaylog中出现了server_id为0的event,其类型为Rotate Event. 这里说说server_id=0的Rotate Event. 心跳event MySQL Cluster中从NDB 6.3开始就出现的HEADBEAT event(hb event),

数据库内核月报 - 2015 / 06-MySQL · 答疑解惑 · binlog event 中的 error code

问题描述 RDS 有个任务叫做恢复到任意时间点,相当于一个数据时光机,可以将数据恢复到过去任意一个时间点,在用户出现误操作需要将数据找回时非常有用.这个功能主要是通过备份集恢复 + binlog回放实现,在用备份集恢复出的实例上应用 binlog 到指定时间点. 然而最近线上重放binlog时遇到了这样一个错误: Table xxxx already exists 查看对应 binlog 的,发现这是一个 CREATE VIEW 语句,而备份集恢复出来的实例上确实已经有了这个view,再往前翻看

MySQL内核月报 2014.12-MySQL· 优化改进· GTID启动优化

背景 GTID 可以说是 MySQL 5.6 版本的一个杀手级特性,它给主备复制带来了极大的便利,RDS只读实例就是强依赖于这个特性.然而GTID在给我们带来便利的同时,也埋下了许多坑,最近几期内核月报中GTID的频繁出现也说明了这一点,对其我们可以说是既爱又恨. GTID 并不是免费午餐,要使用它是要有代价的,为了保证GTID这个体系能够运转起来,需要做许多相关的工作,比如binlog里每个事务要多记 gtid_event 这种事件.写binlog的时候要生成 gtid.要维护几个GTID集合

数据库内核月报 - 2015 / 05-MySQL · 答疑解惑 · binlog 位点刷新策略

背景 MySQL 非 GTID 协议主备同步原理: 主库在执行 SQL 语句时产生binlog,在事务 commit 时将产生的binlog event写入binlog文件,备库IO线程通过 com_binlog_dump 用文件位置协议从主库拉取 binlog,将拉取的binlog存储到relaylog, SQL线程读取 relaylog 然后进行 apply,实现主备同步,在这个过程中有以下几个问题: 主库什么时间将产生的 binlog 真正刷到文件中? 备库IO线程从哪个位置读取主库的 b

MySQL内核月报 2014.12-MySQL· 性能优化·5.7 Innodb事务系统

背景知识 为了便于理解下文,我们先简单梳理下Innodb中的事务.视图.多版本的相关背景知识. 在Innodb中,每次开启一个事务时,都会为该session分配一个事务对象.而为了对全局所有的事务进行控制和协调,有一个全局对象trx_sys,对trx_sys相关成员的操作需要trx_sys->mutex锁. Innodb使用一种称做ReadView(视图)的对象来判断事务的可见性(也就是ACID中的隔离性).根据可见性原则,某个新开启的事务不应该看到其他未提交的事务. Innodb在执行一个SE

MySQL内核月报 2014.08-MySQL· 参数故事·timed_mutexes

提要 MySQL 5.5.39 Release版本正式从源码里删除了全局参数timed_mutexes.timed_mutexes原本用来控制是否对Innodb引擎的mutex wait进行计时统计,以方便进行性能诊断.为什么要删除这个参数呢? 下面介绍下相关背景: Innodb的同步锁机制 Innodb封装了mutex和rw_lock结构来保护内存的变量和结构,进行多线程同步,考虑可移植性, mutex使用lock_word或者OS mutex来保证原子操作,并使用event条件变量进行阻塞和

MySQL内核月报 2014.11-MySQL· 5.7改进·Recovery改进

背景 InnoDB作为事务性引擎,使用write-ahead logging(WAL)机制保证ACID中的Atomicity和Durability,使用undo机制保证ACID中的Consistency和Isolation. 按照WAL和undo的机制,形成以下两个原则: 1. 数据块的更改需要先记录redo日志. 2. 数据块的更改需要先写入undo. 根据这两个原则,InnoDB更新数据的基本流程可以简单的总结为: 1. 记录需要更改undo record的redo log 2. 记录需要更

MySQL内核月报 2014.11-MySQL· 捉虫动态·SIGHUP 导致 binlog 写错

bug描述 这是5.6中和gtid相关的一个bug,当 mysqld 收到 sighup 信号 (比如 kill -1) 的时候,会 flush binlog,但是新生成binlog开头没写 Previous_gtids_log_event,这会导致下面 2 个问题: 这个时候 mysqld 重启的话,会发现再也起不来了,error log 里有这样的错 The binary log file 'mysql/mysql-bin.000020' is logically corrupted: Th

MySQL内核月报 2014.09-MySQL· 捉虫动态·GTID 和 DELAYED

描述 这是一个MySQL 5.6才有的bug,影响包含最新版本.涉及到的概念有GTID.DELAYED. 现象 在5.6主备都开启GTID-MODE的时候,备库同步线程停止,且Last_SQL_Error显示"When @@SESSION.GTID_NEXT is set to a GTID, you must explicitly set it to a different value after a COMMIT or ROLLBACK. Please check GTID_NEXT var