MySQL将保证二进制日志(bin日志)原子地写Table_map事件/ Write_rows事件/ Xid事件吗?

时间:2019-04-15 20:26:31

标签: mysql innodb

尝试使用bin日志读取增量数据,但插入/更新/删除事件仅记录表ID,而表ID在这些已修改事件之前记录在Table_map事件中。 那么是否将插入/更新/删除事件和Table_map事件自动地写入二进制日志,以便某些修改事件的表名可以通过非常接近的上一个Table_map事件来告知?

如果没有,如何获取具有表ID的某些插入/更新/删除事件的表名?

1 个答案:

答案 0 :(得分:0)

@BillKarwin 在我读完另一个项目:maxwell(https://github.com/zendesk/maxwell)之后,答案是肯定的,mysql用null围绕它们的begin(event type = Query)和COMMIT(event type = Xid)事务插入插入/更新/删除事件。

如果直接读取主binlog,则可能存在一个特殊情况AFAIK,服务器在写入每个事务期间崩溃,那么将有未关闭的事件。所以我只需要解决这个问题。 所以基本上我的解决方案如下:

一开始,我会通过以下操作获取完整的数据:

flush tables tableA, tableB, tableC WITH READ LOCK; 
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION WITH CONSISTENT SNAPSHOT;
show master status;
//record binlog filename and position
UNLOCK TABLES;
//read complete data
commit;

通过上述操作,不仅可以获得完整的数据,还可以记录相关的二进制日志位置。

此后的每一次,我都会从上次记录的位置开始读取binlog,并谨慎获取感兴趣的数据,以照顾上面提到的特殊情况,因为未关闭的事件可能会被mysql服务器回滚。 / p>

读取二进制日志后,记录当前读取的位置以进行下一次迭代。

@BillKarwin,感谢您的帮助