时间:2021-05-24
问题: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为 xxxxcreate 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的监控, 见这里
整理些生产上可能遇到的突发问题,并正对性的制定相关的应急预案
到此这篇关于MySQL表自增id溢出的故障复盘解决的文章就介绍到这了,更多相关MySQL自增id溢出内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
今天,又掉坑了。之前踩到过MySQL主键溢出的情况,通过prometheus监控起来了,具体见这篇MySQL主键溢出复盘这次遇到的坑,更加的隐蔽。是一个log表
在mysql中,实现id自增的方式是依靠加一个auto_increment标志,而在pgsql中,id自增是通过序列SEQUENCE。创建表时设置自增序列为:C
一、mysql获取当前字段最大idSQL语句:selectmax(id)fromyourtable;二、获取mysql表自增(Auto_increment)值A
在mysql中很多朋友都认为字段为AUTO_INCREMENT类型自增ID值是无法修改,其实这样理解是错误的,下面介绍mysql自增ID的起始值修改与设置方法。
区别:1、主键,Oracle不可以实现自增,mysql可以实现自增。oracle新建序列,SEQ_USER_Id.nextval2、索引:mysql索引从0开始