我现在有一个表大概是在6千万条数据左右,是从06年开始每天加载的。
现在想把06年到08年以来按每年一个备份数据做起来,最后删除06年的数据。
由于用delete回滚不够,并产生大量的archive log。所以想请教各位有没有一个好的方案提供参考,谢谢各位了
现在想把06年到08年以来按每年一个备份数据做起来,最后删除06年的数据。
由于用delete回滚不够,并产生大量的archive log。所以想请教各位有没有一个好的方案提供参考,谢谢各位了
http://epub.itpub.net/5/1.htm
数据库备份脚本冷备份脚本:rem script:coldbak.sqlrem creater:chenjipingrem date:5.8.2003rem desc:offline full backup database --connect databaseconnect internal/password;--shutdown databaseshutdown immediate;--Copy Data file!xcopy d:\Oracle\oradata\test\*.dbf d:\database/H/R; --Copy Control file!xcopy d:\Oracle\oradata\test\*.ctl d:\database/H/R;--Copy Log file!xcopy d:\Oracle\oradata\test\*.log d:\database/H/R;--startup databasestartup;
你用CTAS来做。
1、Insert INTO Table2006 Select * From Table Where Data>=To_char('200X-0Y-01','yyyy-mm-dd') AND Data<To_char('200X-0Z-01','yyyy-mm-dd'),将数据一个一个月往里面插入。
2、删除刚才插入的数据 Delete From Table Where Data>=To_char('200X-0Y-01','yyyy-mm-dd') AND Data<To_char('200X-0Z-01','yyyy-mm-dd')
3、做一个JOB,定时调用它上面的X、Y、Z可以用天来定义它,如果今天是14号,那么X=4+2就是6、Y=1、Z=Y+1,
就是用小刀杀牛的办法,慢慢地插入数据、慢慢地删除,应该不会造成回滚地问题。
通过create table *** as 备份记录比较快。
create table table2006 as select * from tableold where Data>=To_date('2006-01-01','yyyy-mm-dd') and Data <To_date('2007-01-01','yyyy-mm-dd');
create table table2007 as select * from tableold where Data>=To_date('2007-01-01','yyyy-mm-dd') AtoND Data <To_date('2008-01-01','yyyy-mm-dd');删除记录的话,如果业务上,这张表可以暂停使用的话,以下方式你可以试试看。以防万一,先不要drop原表,rename好了。
先把保留的数据插入新表,再把原表改名,或删除。再将新建的表改成原表。
create table newtable as select * from tableold where Data>=To_date('2007-01-01','yyyy-mm-dd');
如果有索引的话可以先建好。
rename tableold to tableold1; --
rename newtable to tableold;
这样影响业务的时间就是rename两张表的瞬间。
如果 索引名一定要参照以前的名字,那么可能就要rename之后重建索引。影响业务的时间就比较长了,建索引时间比较慢(采用并行稍微快一点)
然后truncate table
然后再把表导入就OK