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



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

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

我不能以这样的方式划分数据,即非活动数据落在一个可以删除的分区中。我必须用delete语句删除数据。

如果需要,我可以要求dba在表级/模式级/表空间级/服务器级设置某些配置。

表中要删除的数据比例是多少?是否有任何引用完整性约束需要管理,或者这个表是否没有子表?

根据答案,你可以考虑:

  1. "CREATE TABLE keep_data UNRECOVERABLE AS SELECT * FROM…"在哪里[keep condition]"
  2. 然后删除原表
  3. 将keep_table重命名为原表
  4. 重建索引(再次不可恢复,以防止重做),约束等

这种方法的问题是它是一个多步骤的DDL过程,您将有一个工作来实现容错和可逆。

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

  1. 数据泵导出以提取"Keep"数据
  2. TRUNCATE table
  3. 数据泵impdp从步骤1导入数据,带有直接路径

在这一点上,我建议你阅读Oracle手册中的数据泵,特别是直接路径负载部分,以确保这将适用于你。

我更喜欢分区

当然,最好的方法是TenG解决方案(CTAS,删除和重命名表),但这似乎对您来说是不可能的。您唯一的问题是存档日志的数量和数据库崩溃问题。在这种情况下,也许您可以对删除语句进行分区(例如每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;

在此操作之后,您应该重新组织您的表,因为该表肯定是碎片化的。

修改表设置NOLOGGING,删除行,然后重新打开日志记录

最新更新