MySQL表自增id溢出的故障复盘解决
问题:MySQL某个表自增id溢出导致某业务block
背景:
tokudb引擎的一个大表tb1,存放业务上的机审日志,每天有大量的写入,并且由于历史原因,这张表是intsigned类型的,最大只能存2147483647行记录。
处理过程:
增加DBLE中间件代理,然后做range分区,将新数据写到新加的的一个分片上。同时业务上修改连接将这个表tb1的连接方式改走DBLE。但是业务上改完代码后,发现还有残余的部分insertintotb1的写请求被转发到了老的表上,且有些表被错误得路由到了DBLE上。这加剧了事情的复杂度。最终业务上将这个写tb1的代码下线后,整个业务才恢复正常。
后来复盘后,我想了下其实这种情况下,对于日志类的表的问题,DBA应该采用迅速果断的措施尽快恢复业务,然后再考虑其它问题。这样考虑的话,上面的问题就好解决了。只需要下面几步:
uselogdb; selectmax(id)fromtb1;--记录下当前最大的id为xxxx createtabletb2LIKEtb1;--创建影子表 altertabletb2modifycolumnidbigintunsignednotnullauto_increment;--修改新表为bigintunsigned类型,能存18446744073709551615行数据。 altertabletb2auto_increment=xxxx+1;--改大新表的自增主键起始值 renametabletb1totb_archive,tb2totb1;--切换表名
这样操作后,tb1就可以写入数据了,业务也能暂时恢复,剩下的工作就是把tb_archive表的数据迁移到tb1里面的(迁移数据可以使用pt-archiver工具在后台慢慢跑就行)。
算了下,整个操作中切表最多5分钟左右即可恢复业务的写入操作,剩余的迁移数据的影响相对会小一些。
后续优化措施:
增加对自增id的监控,见这里https://www.nhooo.com/article/184935.htm
整理些生产上可能遇到的突发问题,并正对性的制定相关的应急预案
到此这篇关于MySQL表自增id溢出的故障复盘解决的文章就介绍到这了,更多相关MySQL自增id溢出内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!