ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2019-08-09 23:55:28  阅读:283  来源: 互联网

标签:表自增 tb1 tb2 业务 DBLE MySQL table id


问题:MySQL某个表自增id溢出导致某业务block


背景:

    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分钟左右即可恢复业务的写入操作,剩余的迁移数据的影响相对会小一些。



后续优化措施:

    增加对自增id的监控, 见这里 https://blog.51cto.com/lee90/2427912

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



    






标签:表自增,tb1,tb2,业务,DBLE,MySQL,table,id
来源: https://blog.51cto.com/lee90/2428250

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有