今天访问程序时报如下异常:


主要原因如下:

数据库所在磁盘空间不够所致。

于是登录数据库所在的服务器,查看了下数据库所占的磁盘空间如下:


可以看到磁盘的33G,被全部占满了,于是就开始了数据库表的清理工作。

1.首先执行以下sql语句,查询数据库中各个表所占空间大小,输出按降序排序

SELECT TABLE_NAME, CONCAT(TRUNCATE(data_length/1024/1024,2),' MB') AS data_size,  
CONCAT(TRUNCATE(index_length/1024/1024,2),' MB') AS index_size  
FROM information_schema.tables WHERE TABLE_SCHEMA = 'olderdb'  
GROUP BY TABLE_NAME  

ORDER BY data_length DESC;

输出结果如下:


看见了吧,一亿多条数据,占用了十几G的内存空间。

那么如何删除了,首先查看表字段:


发现sttime字段是按照时间顺序插入的,这就简单了,直接按照时间段删除数据就可以了。具体的删除方法如下:

按时间段进行删除操作,sql如下:

使用BETWEEN关键字根据时间字段删除一定时间内的记录

DELETE FROM 表名 WHERE 时间字段 BETWEEN 开始时间 AND 结束时间

示例:

DELETE FROM tb WHERE CreateTime BETWEEN '2017-01-01 00:00:00' AND '2017-02-01 00:00:00'--删除tb表中2017年1月1日到2017年2月1日的数据

② 使用时间字段比较大小来确定删除范围

--语法:DELETE FROM 表名 WHERE 时间字段>=开始时间 AND 时间字段<=结束时间

示例:

DELETE FROM tb WHERE CreateTime>='2017-01-01 00:00:00' AND CreateTime<='2017-02-01 00:00:00'

ok,执行删除语句比较费时,数据量大的话可能要删几个小时,像我这种上G的数据量估计得删除一天了。

注意:

本文介绍的只是遇到突发状况,像我这种磁盘撑爆了,只能临时抱佛脚,在实际开发中,都是写触发器的,每隔一段时间调用下触发器后台删除就完了。

Logo

快速构建 Web 应用程序

更多推荐