问题:MySQL某个表自增id溢出导致某业务block
背景:
tokudb引擎的一个大表tb1,存放业务上的机审日志,每天有大量的写入, 并且由于历史原因,这张表是int signed 类型的,最大只能存 2147483647行记录 。
处理过程:
增加DBLE中间件代理,然后做range分区,将新数据写到新加的的一个分片上。同时业务上修改连接将这个表tb1的连接方式改走DBLE。
但是业务上改完代码后,发现还有残余的部分insert into tb1的写请求被转发到了老表上,且有些表被错误得路由到了DBLE上。 最终业务上将这个写tb1的代码下线后,整个业务才恢复正常。
后来复盘后,想了下其实这种情况下,对于日志类的表的问题,DBA应该采用迅速果断的措施 尽快恢复业务,然后再考虑其它问题。这样考虑的话,上面的问题就好解决了。
只需要下面几步:
uselogdb;
selectmax(id)fromtb1;--记录下当前最大的id为xxxx
createtabletb2LIKEtb1;--创建影子表
altertabletb2modifycolumnidbigintunsignednotnullauto_increment;--修改新表为bigint unsigned类型,能存 18446744073709551615 行数据。
altertabletb2auto_increment=xxxx+1;--改大新表的自增主键起始值
renametabletb1totb_archive,tb2totb1;--切换表名这样操作后,tb1就可以写入数据了,业务也能暂时恢复,剩下的工作就是把 tb_archive 表的数据迁移到 tb1 里面的(迁移数据可以使用pt-archiver工具在后台慢慢跑就行)。
整个操作中切表最多5分钟左右即可恢复业务的写入操作,剩余的迁移数据的影响相对会小一些。
增加对自增id的监控
由于疯狂的写系统日志数据,造成主键值溢出的情况出现,因此有必要将这个指标监控起来。
mysqld_exporter自带的这个功能,下面是我使用的启动参数:
nohup ./mysqld_exporter --config.my-cnf="./my.cnf" --web.listen-address=":9104" --collect.heartbeat --collect.auto_increment.columns --collect.binlog_size --collect.engine_innodb_status --collect.engine_tokudb_status --collect.slave_hosts --collect.slave_status --collect.info_schema.processlist --collect.info_schema.innodb_metrics > /dev/null 2>&1 &
实际上执行的类似这个SQL:
SELECT
table_schema,
table_name,
column_name,
AUTO_INCREMENT,
POW(2,CASEdata_type
WHEN'tinyint'THEN7
WHEN'smallint'THEN15
WHEN'mediumint'THEN23
WHEN'int'THEN31
WHEN'bigint'THEN63
END+(column_typeLIKE'%unsigned'))-1ASmax_int
FROMinformation_schema.tablest
JOINinformation_schema.columnscUSING(table_schema,table_name)
WHERE
c.extra='auto_increment'
AND
t.TABLE_SCHEMANOTIN('information_schema','mysql','sys','test','performance_schema')
AND
t.auto_incrementISNOTNULL;
在prometheus的web界面,我们可以测试编写如下的promql, 找出剩余自增id可以率少于40%的实例的库+表名
(mysql_info_schema_auto_increment_column_max{schema!~'test|mysql'} - mysql_info_schema_auto_increment_column{schema!~'test|mysql'})/mysql_info_schema_auto_increment_column_max{schema!~'test|mysql'}*100 < 40
取到数据后,我们可以在alertmanager里面配置相关的告警,或者再grafana上面绘制图,如下:
整理些生产上可能遇到的突发问题,并正对性的制定相关的应急预案
原文地址:https://www.toutiao.com/article/6860042844892037636/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。