建一个新表,如果应用不需查询已有记录并不会长久锁表,可选业务不多时段,写一个简单SQL,一次将原表改名和新表变原表;如果表总是被锁,则需要短时停应用,可将停启应用和改表写成脚本执行。这样可不停业务或将停顿时间缩至最少。如果应用交易需要查已有记录,则需要将需要的最少已有记录先导入新表(譬如当天记录),这里需要注意的是如果不停服务导入可能存在改名导入数据时间内数据不全的现象。
在建表改名成功后就可慢慢地在两表间导入需要记录。其余记录如果需要导出备份可慢慢地分日期段执行,否则跳过,最后直接drop表就行了。
你可以直接建立新表,然后用load cursor的方式计算导入你需要的数据所需要的时间 如果3000万数据的话10分钟左右差不多了,在找个时间停10分钟左右的业务导入数据该表名字,这样就不会有影响业务的死锁问题了。
收起谢谢各位!
我今天重新做了一遍,保留一年的数据:
1、首先导出原表test01结构,创建一个新表名test02,创建索引、主键、授权。
2、重命名原表test01为test03,重命名test02为test01.
3、导出test03中最近一年的数据,生成ixf文件。
4、导入test01表中,用commitcount参数,避免import造成日志满。
注意在导入的时候会造成表死锁,影响部分业务查询超时,但不是太严重,导出近半个小时,导入的时候遇到数据库tsm备份超慢,后来停止备份,才恢复速度,总用时近3个小时,如果不是备份影响 应该1.5小时就可以。数据由原来的1亿行缩减为近3000万行。
看了上边各位专家的建议,很受启发。感觉如果数据库之前没有做过优化的话,慢点删也是可以接受的。最好不要做ddl操作,虽然快,有可能涉及重绑定等问题。写到这里,请问一下,您确认过这个表和其他数据对象的依赖关系吗?如果能这么肯定,可不可以在这个表上增加一个标志字段,用位图索引,删除时可能快一些。
收起个人从自己的经验来说说,这个除非本身在建表的时候考虑过分区表的事情,不然的确没什么好的方法。
1、如果表本身就做了分区表,直接detach一下就可以了,这个不影响业务的,detach出来的表数据也还是存在的,只是表名换掉了。
2、如果本身不是分区表,要么按照条件,根据系统设置的活动日志大小,比如说每次删除10万条,慢慢的删除。这个是不影响业务的,但是在生产环境中,数据库一般是做了归档日志的,因为delete生成的日志很多,要注意文件系统。
3、将需要保留的数据导出ixf格式,将表清空掉,然后再将ixf导入进去。这个会影响业务的。
有一个简单有效的办法,步骤如下:
1)从45G大表导出需要的数据到del/ixf文件中: db2 "export to x1.ixf of ... select * from 大表y1 where 保留数据的过滤条件"。
2)把del/ixf文件加载到45G大表并且替换掉原来的数据:db2 "load from x1.ixf of ixf ...lobsinfile ... replace into 大表y1..."或者db2 "import from x1.ixf of ixf ...lobsinfile ... replace into 大表y1..."
该方法优点如下:
1)不影响业务。
2)不需要停应用。
3)耗用时间很短。
4)步骤很少。
5)不需要占用太多的日志磁盘空间。
6)没有table partition也能做。
7)核心业务系统都可以使用该办法。