MySQL数据库历史表海量数据导致磁盘空

情况描述:
在实际工作中遇到服务器磁盘100%占用,导致文件写入失败的问题。在实际更换/添加存储设备不便且手头没有大容量存储设备的前提下,对此进行处理。要求:可以清表中的历史数据,但要保留最近一个月的。
实际处理过程如下:
1、停止httpd进程(避免程序调度mysql数据库导致堵塞或者死锁从而使得操作进行不顺利的情况)
2、停止nagios调度服务
3、truncate 另外几个历史表(清除那些历史表的数据)
4、占用磁盘空间87G的那个历史表his_table不能truncate(因为要保留一个月的数据),尝试执行delete (3000w+的记录数,非常缓慢),但删除数据之后空间占用没有减小,使用optimize table his_table,执行失败。因为优化调整时也需要临时空间中转,而实际上没有可用空间了。(基本都是被表数据所占)
5、停止mysql数据库服务,删除/var/lib/mysql 下的ibdata1 和 ib_logfile* 文件 (执行这一步操作之后,系统磁盘空余了8G,但这样是不够的)
6、启动mysql,使用 select * from his_table where to_days(now()) - to_days(event_time) < 30 into outfile '/back/data/his_table.txt' 导出符合条件的数据
7、执行truncate table his_table; 清除此历史表数据(注意,即使truncate之后,此表对应的ibd文件占用的磁盘空间也丝毫没有减少)
8、使用mysqldump 备份数据到磁盘文件(就是生成一个sql脚本,这时候因为前面几个历史表的数据都已经清空了,所以生成的文件很小,也就是几十M的样子)
9、停止mysql服务
10、rm 删除掉mysql中这几个历史表对应的ibd文件(这下子空间基本都腾出来了)
11、启动mysql
12、mysql --user=username --password=passwordstring; 登录mysql命令控制台,执行数据库恢复(mysql> source "/back/data/dbdump.sql"
13、恢复完毕后,使用use database;选择目标数据库,然后使用 load data infile "/back/data/his_table.txt" to table his_table
14、执行查询确认数据库恢复成功(注意,因为客户端设置的问题,ssh直接连接到主机控制台,然后在mysql>下直接命令行查询中文内容显示为?,使用phpmyadmin来查看,一切正常。至此本次磁盘清理任务完成。启动 httpd 服务,启动nagios服务,一切恢复。
15、像这种情况可以考虑定期对历史数据进行清理归档,一方面可以提高系统的运行速度(因为没有了超级大数据表,查询速度会大幅度提升),另一方面也不会导致磁盘很快填满。
限于内网外网隔离以及保密的需求,很多具体的命令行没有标出,以上只是解决此问题的处理步骤。中间有过各种尝试,最终的处理办法是上面的,过程也不再列出。
备注:
Linux下使用 df -lha 查看文件系统空间使用情况
mysql命令行下使用 status; 查看数据库状态信息
mysql 导出数据到文件 select * from table1 where con1 into outfile 'aa.txt';
mysql 从文件导入数据到表 load data infile '/back/data/his_table.txt' to table his_table;
Tags: 

延伸阅读

最新评论

发表评论