对于这几天微博上较火的关于淘宝物流MySQL slave复制数据丢失问题,我自己也比较关注,然后根据沃趣科技的一篇分析文章算是大概明白了其中的明细,现在再来根据我自己的理解理一下思路,顺便加深自己的理解。
简单的说这个问题的来由是这样的:主库的一些DML语句在从库上没执行。那么遇到这样问题,我们一般都是从这几个方面找问题,
- show slave status查看复制状态,SQL_THREAD,IO_THREAD是否正常/延迟多少
- 上面没有问题,再看事件在主库是否记录了binlog,是否传到了从库(从relay log中查看)
- 上面都没问题,那是否从库在这个事件的数据丢失之前就已经是M/S数据不一致了,导致DML没有有效的记录进行操作
淘宝的这个案例就比较有意思了,上面的情况都不符合。后来他们定位到问题是由于binlog(RBR)里的table_map_event事件中的table_id在内部执行过程中传递值溢出导致的。这个table_map_event和table_id是怎么回事呢?先简单看个RBL的binlog event:
#121031 16:25:45 server id 1 end_log_pos 3466
Table_map: `test`.`tf` mapped to nu