今天领导安排一个任务,将一张日志表中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
?
?
?