zabbix数据库数据过大

1700人浏览 / 0人评论

zabbix数据库数据过大

1、场景描述

  今日收到报警磁盘空间超过80%,登陆服务器使用du -sh 进行逐步排查,最后发现在/var/lib/mysql/中有history的这个一个数据库表大小超过好多个G。
  一看到这个表大概就知道了是zabbix监控的历史数据累积过多而造成。所以需要登陆数据库删除之前无用的历史数据。
[root@zabbix02 zabbix42]# du -sh *|grep G
1.4G	history.ibd
6.7G	history_uint.ibd

2、登陆数据库中**

[root@zabbix zabbix]# mysql -uzabbix -p
Enter password: 

3、进入数据库

MariaDB [(none)]> use zabbix42;

4、统计表中数量


MariaDB [zabbix42]> select count(*) as total from history;
+----------+
| total    |
+----------+
| 15157748 |
+----------+

5、获取时间戳(历史数据我只要保留20201001之后的)。

[root@zabbix02 zabbix42]# date +%s -d"20201001"
1601481600

6、进行删除

MariaDB [zabbix42]> delete from history where clock<1601481600;

MariaDB [zabbix42]> delete from history_uint where clock<1601481600;

7、还是不会释放

[root@zabbix02 zabbix42]# du -sh *|grep G
1.4G	history.ibd
6.7G	history_uint.ibd

8、进行数据优化

MariaDB [zabbix42]> optimize tables history;
MariaDB [zabbix42]> optimize tables history_uint;

9、总结

结合mysql官方网站的信息,个人是这样理解的。当你删除数据时,mysql并不会回收,被已删除数据的占据的存储空间,以及索引位。而是空在那里,而是等待新的数据来弥补这个空缺,这样就有一个缺少,如果一时半会,没有数据来填补这个空缺,那这样就太浪费资源了。所以对于写比较频烦的表,要定期进行optimize,一个月一次,看实际情况而定了。

10、查看数据库表的前俩行

拿到clock值去https://tool.lu/timestamp/这个地址进行时间戳转换,就是到你的数据最早的数据是多久生成的了。

MariaDB [zabbix42]> select * from history_uint limit 2 \G;
*************************** 1. row ***************************
itemid: 33957
 clock: 1603342047
 value: 1
    ns: 111266206
*************************** 2. row ***************************
itemid: 33627
 clock: 1603342047
 value: 1
    ns: 113321791

11、查看数据库表的后俩行

拿到clock值去https://tool.lu/timestamp/这个地址进行时间戳转换,就是到你的数据最新的数据是多久生成的了。

MariaDB [zabbix42]> select * from history_uint order by clock desc limit 2 \G;
*************************** 1. row ***************************
itemid: 36387
 clock: 1611121557
 value: 1
    ns: 604327351
*************************** 2. row ***************************
itemid: 32637
 clock: 1611121557
 value: 68358266880
    ns: 530428400

全部评论