MySQL表自增id溢出的故障复盘
2019-08-09 23:26
1591 查看
问题: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://www.geek-share.com/detail/2776279418.html
整理些生产上可能遇到的突发问题,并正对性的制定相关的应急预案
相关文章推荐
- 基于全局事物ID的MySQLfailover的故障自动切换
- mysql同步server-id故障
- MYSQL 中mediumint导致的用户ID溢出
- MYSQL的mediumint可能导致的用户ID溢出
- mysql5.5 物理删除binlog文件导致的故障
- mysql 导入数据时内存溢出问题
- Mysql中获取刚插入的自增长id的三种方法归纳
- mysql自增ID起始值修改方法
- MYSQL主从同步故障
- Mysql根据子ID查询父ID
- mybatis批量insert生成mysql自增id
- 非正常关机时,innodb故障导致mysql无法启动的解决方法
- Mysql对自增主键ID进行重新排序
- mysql学习-得到刚刚插入的主键id
- MYSQL删除表中的指定ID数据
- mysql_insert_id 是否安全
- MySQL实现根据当前ID读取上一条和下一条记录
- MyBatis+MySQL 返回插入的主键ID
- Mysql错误:#1054 - Unknown column 'id' in 'field list' 解决办法
- 查找原始MySQL死锁ID 笔记