我现在有一个表大概是在6千万条数据左右,是从06年开始每天加载的。
现在想把06年到08年以来按每年一个备份数据做起来,最后删除06年的数据。
由于用delete回滚不够,并产生大量的archive log。所以想请教各位有没有一个好的方案提供参考,谢谢各位了

解决方案 »

  1.   

    我水平低,看了半天没有看懂你说的备份方案,只知道truncate不写日志。呵呵。
      

  2.   

    Oracle备份与恢复案例
    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;
      

  3.   

    没看出来需要用delete阿。
    你用CTAS来做。
      

  4.   

    把归档模式关闭了,再把undo表空间设大点行不行
      

  5.   

    大概明白你的意思了,你可以这样导出,你先创建一个Table2006、Table2007、Table2008然后做个存储过程
    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,
    就是用小刀杀牛的办法,慢慢地插入数据、慢慢地删除,应该不会造成回滚地问题。
      

  6.   


    通过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之后重建索引。影响业务的时间就比较长了,建索引时间比较慢(采用并行稍微快一点)
      

  7.   

    改变成noarchive模式,可以省掉一些log。不过你再想找可就。呵呵
      

  8.   

    用imp 或者impdp中的query写限制条件 日期>2006 把数据导出来
    然后truncate table
    然后再把表导入就OK