服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - 详解MySQL 表中非主键列溢出情况监控

详解MySQL 表中非主键列溢出情况监控

2021-01-15 17:59我的二狗呢 Mysql

这篇文章主要介绍了详解MySQL 表中非主键列溢出情况监控,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

今天,又掉坑了。 之前踩到过mysql主键溢出的情况,通过prometheus监控起来了,具体见这篇mysql主键溢出复盘

这次遇到的坑,更加的隐蔽。 是一个log表里面的一个int signed类型的列写满了。快速的解决方法当然还是只能切新表来救急了,然后搬迁老表的部分历史数据到热表。 

亡羊补牢,处理完故障后,赶紧写脚本把生产的其他表都捋一遍。

下面是我暂时用的一个检测脚本,还不太完善,凑合用

分2个文件(1个sql文件,1个shell脚本)

check.sql 内容如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
select
cast( pow(2, case data_type
  when 'tinyint'  then 7
  when 'smallint' then 15
  when 'mediumint' then 23
  when 'int'    then 31
  when 'bigint'  then 63
  end+(column_type like '% unsigned'))-1 as decimal(30,0)) as max_int,
' - ',
concat ('(', concat('select ','max(',column_name,')',' from ',table_schema,'.',table_name),')')
from
information_schema.columns
where
table_schema not in ('information_schema','sys','test','mysql','performance_schema')
and
 data_type in ('int' ) ;

直接到数据库里面执行,效果类似这样:

详解MySQL 表中非主键列溢出情况监控

check.sh 内容如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/bin/bash
# 监测int类型的当可用空间少500w的时候,提醒做ddl操作
# 设置 session级别的 max_execution_time为2秒,防止没有索引的大的拖慢数据库,但是这样可能漏判部分列,需要注意下
# 注意:我这里bigint类型的没有检查,如果需要请修改 check.sql where条件中的data_type加上 bigint的检查
 
source /etc/profile
set -u
 
mkdir $(date +%f) -pv
 
# step1 检测
for host in {'192.168.1.100','192.168.1.110','192.168.1.120','192.168.1.130'}; do
 
mysql -udts -pdts -h${host} -bn < check.sql  2>/dev/null > sql.log
wait
 
echo "说明: | 当前列允许的最大值 | 巡检用的sql   " >> $(date +%f)/$host.log
 
while read line; do
  ret=$(mysql -udts -pdts -h${host} -bne "set session max_execution_time=2000;select $line" 2>/dev/null)
  echo ${ret}
  if [[ "${ret}" == "null" ]]; then
  continue
  fi
  if [ ${ret} -lt 5000000 ] ; then
   echo "$line 剩余空间 ${ret}, 该表可用水位不足500w,建议做ddl修改为bigint类型" >> $(date +%f)/$host.log
  
  fi
done < ./sql.log
 
done
 
# step2 将检查的内容打包发邮件(这里可能需要根据自己生产的情况改改)
tar czf $(date +%f).tar.gz $(date +%f)
sendemail -s 192.168.1.200 -f post@domain.com -t ergou@domain.com -a $(date +%f).tar.gz -u "$(date +%f) int水位线巡检日志" -o message-content-type=html -o message-charset=utf8 -m "内容详见附件"
 
# step3 清理每日生成的以日期命名的目录和tar.gz文件,这里我就不贴命令

再配个每天上午10点的cronjob即可,

最终每天收到邮件里面内容大致类似如下:

详解MySQL 表中非主键列溢出情况监控

到此这篇关于详解mysql 表中非主键列溢出情况监控的文章就介绍到这了,更多相关mysql 非主键列溢出内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.51cto.com/lee90/2486466

延伸 · 阅读

精彩推荐
  • Mysql解决MySQl查询不区分大小写的方法讲解

    解决MySQl查询不区分大小写的方法讲解

    今天小编就为大家分享一篇关于解决MySQl查询不区分大小写的方法讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起...

    Veir_dev5592019-06-25
  • MysqlERROR: Error in Log_event::read_log_event()

    ERROR: Error in Log_event::read_log_event()

    ERROR: Error in Log_event::read_log_event(): read error, data_len: 438, event_type: 2 ...

    MYSQL教程网6402020-03-13
  • Mysql详解MySQL中的分组查询与连接查询语句

    详解MySQL中的分组查询与连接查询语句

    这篇文章主要介绍了MySQL中的分组查询与连接查询语句,同时还介绍了一些统计函数的用法,需要的朋友可以参考下 ...

    GALAXY_ZMY5432020-06-03
  • Mysqlmysql 不能插入中文问题

    mysql 不能插入中文问题

    当向mysql5.5插入中文时,会出现类似错误 ERROR 1366 (HY000): Incorrect string value: '\xD6\xD0\xCE\xC4' for column ...

    MYSQL教程网5722019-11-25
  • MysqlMySQL数据库varchar的限制规则说明

    MySQL数据库varchar的限制规则说明

    本文我们主要介绍了MySQL数据库中varchar的限制规则,并以一个实际的例子对限制规则进行了说明,希望能够对您有所帮助。 ...

    mysql技术网4192019-11-23
  • MysqlMySQL 数据备份与还原的示例代码

    MySQL 数据备份与还原的示例代码

    这篇文章主要介绍了MySQL 数据备份与还原的相关知识,本文通过示例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...

    逆心2962019-06-23
  • MysqlMySQL锁的知识点总结

    MySQL锁的知识点总结

    在本篇文章里小编给大家整理了关于MySQL锁的知识点总结以及实例内容,需要的朋友们学习下。...

    别人放弃我坚持吖4362020-12-14
  • Mysql浅谈mysql 树形结构表设计与优化

    浅谈mysql 树形结构表设计与优化

    在诸多的管理类,办公类等系统中,树形结构展示随处可见,本文主要介绍了mysql 树形结构表设计与优化,具有一定的参考价值,感兴趣的小伙伴们可以参...

    小码农叔叔5242021-11-16