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

Oracle 11g删除大量数据而不生成归档日志,oracle,oracle11g,delete-row,Oracle,Oracle11g,Delete Row,我需要定期从数据库中删除大量数据。该过程会生成大量归档日志。我们曾一度发生数据库崩溃,因为存档目标上没有可用的存储空间。如何在删除数据时避免生成日志 要删除的数据已在数据库中标记为不活动。应用程序代码忽略非活动数据。我不需要回滚操作的能力 我不能以这样的方式对数据进行分区,即非活动数据落在一个可以删除的分区中。我必须用delete语句删除数据 如果需要,我可以要求DBA在表级别/模式级别/表空间级别/服务器级别设置某些配置 我使用的是Oracle 11g。删除表中数据的比例是多少,删除多少?是否

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

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

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

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


我使用的是Oracle 11g。

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

根据答案,您可能会考虑:

  • “创建表格保持_数据不可恢复,因为选择*从…何处 [保持状态]”
  • 然后放下原来的桌子
  • 然后将keep_表重命名为原始表
  • 重新生成索引(再次使用不可恢复以防止重做)、约束等
  • 这种方法的问题是,它是一个多步骤的DDL过程,您将有一项工作使其具有容错性和可逆性

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

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


    我的首选是分区。

    当然,最好的方法是TenG解决方案(CTA、drop和rename table),但这对您来说似乎是不可能的。 唯一的问题是归档日志的数量和数据库崩溃问题。在这种情况下,也许可以对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;
    
    声明
    e数;
    我的号码
    开始
    从myTable中选择计数(*),其中[删除条件];
    f:=trunc(e/10000)+1;
    因为我在1。。F
    环
    
    从myTable中删除[delete condition]和rownum将表更改为设置NOLOGGING,删除行,然后重新打开日志记录。

    如果您有企业版,则可以使用分区,然后只需删除分区。如果数据“标记为非活动”,并且您可以对表进行分区(即,您有企业版和分区选项),我不明白为什么您不能对数据进行分区,使非活动数据落在一个分区中。您不能对任何列进行分区吗允许您将数据标记为非活动?您要删除的数据部分是多少?将要保留的数据移动到一个单独的表中,截断第一个表,然后重命名新表可能会更有效。您可以将该表更改为设置为NOLOGGING,删除行,然后重新打开日志记录吗?@Justin,@a_horse_和_no_name我有一个SL具有“IsActive”的冰桌列。当某些事件发生时,该切片将被禁用。另一个表SLICE\u DATA具有SLICE\u ID。每个SLICE\u ID的SLICE\u DATA中都有多行。因此,我无法在不查看SLICE的情况下确定SLICE\u DATA中的哪些数据是非活动的。这就是我无法以所有非活动数据都不可用的方式对SLICE\u数据进行分区的原因“所有对象都在一个分区中。@Sameer-我仍然不清楚为什么不能在子表上使用引用分区。”