大量数据删除
2017-09-05 17:43
106 查看
今天领导安排一个任务,将一张日志表中7月份之前的日志都删除掉。
我查了一下数据量发现,现在总共有190多万的数据,7月份之前有150多万,这要删除大头啊。
开始,我使用delete语句,如下:
这时候问题就来了,我等了5分钟了,程序好像死在那里了,没反应。同时,操作系统还设置了超时限制,如果一定时间不操作,系统会自动断开连接(我是远程连接的服务器。
感觉时间有点长,就决定先删一小部分,6月份之前的,不多只有4万多条。但是在删除中报了一个错误。
经过一阵子谷歌(对数据库不熟悉),发现之前对数据操作没有完整执行,需要杀掉原来的执行线程。方法如下:
发现id为7的线程是刚才执行的删除语句,已经不再执行了,但是仍然占着表,导致其他删除语句无法执行。
此时,需要杀掉线程。执行如下:
此时,可以对日志表进行删除操作了。
就在删除过程中发现用delete删除数据特别慢,就用了一个其他的方式:
1.先将日志表结构和7月份及以后数据备份下来,我使用sql文件
2.删除整个日志表
3.将第一步备份数据恢复回去
至此完成数据的删除任务,使用最后的办法只需要几分钟,如果使用delete语句不知道需要多长时间。
-------------------------------------------------留作备忘--------------------------------------------
文中杀掉线程方式引用:http://blog.sina.com.cn/s/blog_56fd58ab0100q61s.html
我查了一下数据量发现,现在总共有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
相关文章推荐
- oracle 删除大量数据后整理表(analyze table xxx compute statistics)
- oracle 删除大量数据
- 一次oracle大量数据删除经历
- ORACLE删除重复记录(大量重复数据)
- 如何删除大量数据 sql server2005
- 批量删除大量数据
- oracle 快速删除大批量数据方法(全部删除,条件删除,删除大量重复记录)
- Oracle表删除大量数据(千万)后查询变慢问题
- 一次oracle大量数据删除经历
- 大量日志数据库表高效删除
- Oracle 表删除大量数据后查询变慢问题
- 分批删除大量数据
- 使用mongoVUE删除大量数据的情况下失效问题
- Oracle 表删除大量数据后查询变慢解决
- 快速的有条件的删除大量数据
- 【SQL Server性能优化】大量数据删除的方法比较
- 大量删除MySQL中的数据
- SQL删除数据(分段实现大量数据的删除操作)
- Oracle大量删除数据方案
- Oracle 表删除大量数据后查询变慢问题