Oracle 11g删除大量数据而不生成存档日志

时间:2014-07-26 14:31:04

标签: oracle oracle11g delete-row

我需要定期从我的数据库中删除大量数据。该过程会生成大量的存档日志。我们一度发生数据库崩溃,因为归档目标上没有可用的存储空间。在删除数据时,如何避免生成日志?

要删除的数据已在数据库中标记为非活动状态。应用程序代码忽略非活动数据。我不需要回滚操作的能力。

我无法对数据进行分区,使非活动数据落入可以删除的一个分区中。我必须用删除语句删除数据。

如果需要,我可以要求DBA在表级/架构级/表空间级/服务器级别设置某些配置。

我正在使用Oracle 11g。

3 个答案:

答案 0 :(得分:2)

表格中有多少比例的数据会被删除,数量是多少?是否存在任何参照完整性约束来管理或该表无子女?

根据答案,您可以考虑:

  1. “CREATE TABLE keep_data UNRECOVERABLE as SELECT * FROM ... WHERE [保持条件]“
  2. 然后删除原始表
  3. 然后将keep_table重命名为原始表
  4. 重建索引(再次使用不可恢复以防止重做),约束等。
  5. 这种方法的问题在于它是一个多步骤的DDL流程,您将有一个工作来使容错和可逆。

    更安全的选择可能是使用数据泵:

    1. 数据泵expdp以提取“保留”数据
    2. TRUNCATE表
    3. 数据泵impdp从步骤1导入数据,使用直接路径
    4. 此时我建议你阅读关于数据泵的Oracle手册,特别是关于直接路径加载的部分,以确保这对你有用。

      我首选的选项是分区。

答案 1 :(得分:1)

当然,最好的方法是TenG解决方案(CTAS,丢弃和重命名表),但似乎对你来说不可能。 您唯一的问题是存档日志和数据库崩溃问题的数量。在这种情况下,您可以对delete语句进行分区(例如,每10,000行)。 类似的东西:

declare 
e number;
i number
begin
  select count(*) from myTable where [delete condition];
  f :=trunc(e/10000)+1;
  for i in 1.. f
  loop
    delete from myTable where [delete condition] and rownum<=10000;
    commit;
    dbms_lock.sleep(600); -- purge old archive if it's possible
  end loop;
end;

执行此操作后,您应该重新组织肯定会碎片化的表。

答案 2 :(得分:-2)

更改表格以设置NOLOGGING,删除行,然后重新开启记录。