尝试使用bin log读取增量数据,但是insert/update/delete事件只记录表id,而表id记录在这些修改事件之前的Table_map事件中。 那么插入/更新/删除事件和 Table_map 事件是否会自动写入二进制日志,以便某些修改事件的表名可以通过非常接近的先前 Table_map 事件得知?
如果没有,如何获取带有表 ID 的某些插入/更新/删除事件的表名称?
最佳答案
@比尔卡文 在我读了另一个项目:maxwell(https://github.com/zendesk/maxwell)后,答案是肯定的,mysql事务性地用begin(event type = Query)和COMMIT(event type = Xid)围绕它们编写插入/更新/删除事件。
如果直接读取master binlog,可能会出现一种极端情况,即写入每个事务时服务器崩溃,然后会出现未关闭的事件。所以我只需要报道这个案子。 所以基本上我的解决方案如下:
一开始,我通过以下操作获取完整的数据:
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位置。
每次此后,我都会从上次记录的位置开始读取binlog并谨慎获取我感兴趣的数据,以照顾我上面提到的极端情况,因为未关闭的事件可能会被mysql服务器回滚。
读取binlog后,记录当前读取的位置,以便下次迭代。
@BillKarwin,谢谢你的帮助
关于mysql - mysql会保证二进制日志(bin log)原子地写入Table_map事件/Write_rows事件/Xid事件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55696755/