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
有问题请加博主微信进行沟通!
全部评论