前几天,【DBA驿站】(文末有加入方式)陪伴群有朋友问:
怎么监控自增值上限?
补充一下自增值达到上限会出现的问题:
表的自增 id 达到上限后,再申请时它的值就不会改变,继续插入数据时,会报主键冲突的错误。
row_id 达到上限后,则会归 0 再重新递增,如果出现相同的 row_id,后写的数据会覆盖之前的数据。
这里来总结一些社群里讨论的结果。
一开始,我的回答如下,这个也是我以前采用的方法:
SELECT concat(table_schema, '.', table_name)
, round(auto_increment / pow(2, 31) * 100, 2) AS 'auto_increment_usage'
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys')
AND auto_increment IS NOT NULL
ORDER BY auto_increment_usage DESC
LIMIT 10;
然后群里有朋友提醒,sys下系统表可以直接查询。
我自己试了一下,确实可行,方便多了,SQL如下:
SELECT *
FROM sys.schema_auto_increment_columns
ORDER BY auto_increment_ratio DESC
LIMIT 10;
并且int,bigint最大值都做了区分,如下图:
直接计算出自增值使用率了。
PS:看来之前写的巡检系统(点击跳转),关于自增值巡检的部分,也可以优化一下了。
到这里,可能我们会想着写个脚本或者exporter,把自增值使用率传给监控组件。
但是,反转又来了。
陪伴群又有朋友指出,如果用的是Prometheus监控,那mysqld_exporter支持增加一个参数:
--collect.auto_increment.columns
可以显示所有表自增字段的最大值和目前用到的值。
如下面两张图:
图一:自增值上限
图二:自增字段目前用到的值
有这个,要监控自增值使用率,就方便多了。
比如,告警Rule可以这样写:
(
mysql_info_schema_auto_increment_column /
mysql_info_schema_auto_increment_column_max
) * 100 > 90
表示自增值使用率超过90%就触发告警。
所以,要是不交流,我估计还一直沉迷于最开始的方法而无法自拔。
当然,如果还有更优解,欢迎在评论区讨论。
另外,我们的DBA学习小圈子【DBA驿站】在2024年10月1日起,上调20元,涨价到128。
这几天仍然是券后 58。