日期:2014-05-16  浏览次数:20548 次

大量数据删除

今天领导安排一个任务,将一张日志表中7月份之前的日志都删除掉。

我查了一下数据量发现,现在总共有190多万的数据,7月份之前有150多万,这要删除大头啊。

开始,我使用delete语句,如下:

delete from log_table where create_time < '2013-07-01';

?这时候问题就来了,我等了5分钟了,程序好像死在那里了,没反应。同时,操作系统还设置了超时限制,如果一定时间不操作,系统会自动断开连接(我是远程连接的服务器。

感觉时间有点长,就决定先删一小部分,6月份之前的,不多只有4万多条。但是在删除中报了一个错误。

?

经过一阵子谷歌(对数据库不熟悉),发现之前对数据操作没有完整执行,需要杀掉原来的执行线程。方法如下:

mysql>show processlist;
+----+------+-----------+------+---------+------+-------+------------------+
| Id | User | Host      | db   | Command | Time | State | Info             |
+----+------+-----------+------+---------+------+-------+------------------+
|  7 | root | localhost | yy   | End     |  154 |       | delete .....     |
|  8 | root | localhost | NULL | Query   |    0 | NULL  | show processlist |
+----+------+-----------+------+---------+------+-------+------------------+
2 rows in set (0.00 sec)

?发现id为7的线程是刚才执行的删除语句,已经不再执行了,但是仍然占着表,导致其他删除语句无法执行。

此时,需要杀掉线程。执行如下:

mysql> kill 7;

mysql> show processlist;
+----+------+-----------+------+---------+------+-------+------------------+
| Id | User | Host      | db   | Command | Time | State | Info             |
+----+------+-----------+------+---------+------+-------+------------------+
|  8 | root | localhost | NULL | Query   |    0 | NULL  | show processlist |
+----+------+-----------+------+---------+------+-------+------------------+
1 row in set (0.00 sec)

?此时,可以对日志表进行删除操作了。

就在删除过程中发现用delete删除数据特别慢,就用了一个其他的方式:

1.先将日志表结构和7月份及以后数据备份下来,我使用sql文件

mysql> mysqldump -u root -p dataname --add-drop-table --where="create_time > '2013-07-01' tablename > /home/root/log.sql

?2.删除整个日志表

mysql> drop table table_name;

?3.将第一步备份数据恢复回去

mysql> source /home/root/log.sql

?至此完成数据的删除任务,使用最后的办法只需要几分钟,如果使用delete语句不知道需要多长时间。

-------------------------------------------------留作备忘--------------------------------------------

文中杀掉线程方式引用:http://blog.sina.com.cn/s/blog_56fd58ab0100q61s.html

?

?

?