Oracle 11g删除大量数据而不生成归档日志
我需要定期从数据库中删除大量数据。该过程会生成大量归档日志。我们曾一度发生数据库崩溃,因为存档目标上没有可用的存储空间。如何在删除数据时避免生成日志 要删除的数据已在数据库中标记为不活动。应用程序代码忽略非活动数据。我不需要回滚操作的能力 我不能以这样的方式对数据进行分区,即非活动数据落在一个可以删除的分区中。我必须用delete语句删除数据 如果需要,我可以要求DBA在表级别/模式级别/表空间级别/服务器级别设置某些配置Oracle 11g删除大量数据而不生成归档日志,oracle,oracle11g,delete-row,Oracle,Oracle11g,Delete Row,我需要定期从数据库中删除大量数据。该过程会生成大量归档日志。我们曾一度发生数据库崩溃,因为存档目标上没有可用的存储空间。如何在删除数据时避免生成日志 要删除的数据已在数据库中标记为不活动。应用程序代码忽略非活动数据。我不需要回滚操作的能力 我不能以这样的方式对数据进行分区,即非活动数据落在一个可以删除的分区中。我必须用delete语句删除数据 如果需要,我可以要求DBA在表级别/模式级别/表空间级别/服务器级别设置某些配置 我使用的是Oracle 11g。删除表中数据的比例是多少,删除多少?是否
我使用的是Oracle 11g。删除表中数据的比例是多少,删除多少?是否有任何引用完整性约束需要管理,或者此表是无子表的 根据答案,您可能会考虑:
我的首选是分区。当然,最好的方法是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-我仍然不清楚为什么不能在子表上使用引用分区。”