mysql - mysql会保证二进制日志(bin log)原子地写入Table_map事件/Write_rows事件/Xid事件吗?

标签 mysql innodb

尝试使用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/

相关文章:

mysql - 如何使用编码密码转储数据库

mysql - 如何在 Laravel 中显示使用同一数据库表中两个不同值的图表?

mysql - 如何在laravel中生成唯一的序列号

php - 数据库连接错误(2) : Could not connect to MySQL

MySQL 在索引中使用自定义字符串比较运算符

MySql - Innodb - 损坏的索引/外键

MySQL InnoDB 自愿事务成为死锁受害者

php - 限制共享主机上 IP 的资源使用

带有外键的MySQL errno 150

mysql - 如何在 InnoDB 全文索引上获得部分匹配的单词搜索的不同分数?