多次反转,关于MySQL自增值监控的讨论

科技   2024-09-25 15:30   上海  

前几天,【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.tablesWHERE table_schema NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys')    AND auto_increment IS NOT NULLORDER BY auto_increment_usage DESCLIMIT 10;


然后群里有朋友提醒,sys下系统表可以直接查询。

我自己试了一下,确实可行,方便多了,SQL如下:

SELECT *FROM sys.schema_auto_increment_columnsORDER BY auto_increment_ratio DESCLIMIT 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。

MySQL数据库联盟
关注后,回复“高可用”,可获取8篇MySQL高可用文章
 最新文章