MySQL表自增id溢出的故障复盘

问题:MySQL某个表自增id溢出致使某业务blocksql


背景:ide

    tokudb引擎的一个大表tb1,存放业务上的机审日志,天天有大量的写入, 而且因为历史缘由,这张表是int signed 类型的,最大只能存 2147483647行记录 。工具


处理过程:优化

    增长DBLE中间件代理,而后作range分区,将新数据写到新加的的一个分片上。 同时业务上修改链接将这个表tb1的链接方式改走DBLE。 可是业务上改完代码后,发现还有残余的部分insert into tb1的写请求被转发到了老的表上,且有些表被错误得路由到了DBLE上。 这加重了事情的复杂度。最终业务上将这个写tb1的代码下线后,整个业务才恢复正常。
代理



后来复盘后,我想了下其实这种状况下,对于日志类的表的问题,DBA应该采用迅速果断的措施 尽快恢复业务,而后再考虑其它问题。 这样考虑的话,上面的问题就好解决了。 只须要下面几步:日志


use logdb;

select max(id) from tb1;   -- 记录下当前最大的id为 xxxx
create table tb2 LIKE tb1;   -- 建立影子表

alter table tb2 modify column id  bigint unsigned not null auto_increment ;   -- 修改新表为bigint unsigned类型,能存 18446744073709551615 行数据。
alter table tb2 auto_increment=xxxx+1;  -- 改大新表的自增主键起始值

rename table tb1 to tb_archive , tb2 to tb1;  -- 切换表名


这样操做后,tb1就能够写入数据了,业务也能暂时恢复,剩下的工做就是把 tb_archive 表的数据迁移到 tb1 里面的(迁移数据可使用pt-archiver工具在后台慢慢跑就行)。中间件


算了下,整个操做中切表最多5分钟左右便可恢复业务的写入操做,剩余的迁移数据的影响相对会小一些。blog



后续优化措施:路由

    增长对自增id的监控, 见这里 http://www.javashuo.com/article/p-frobolct-eq.htmlrem

    整理些生产上可能遇到的突发问题,并正对性的制定相关的应急预案

相关文章
相关标签/搜索