我需要定期从我的数据库中删除大量数据。该过程会生成大量的存档日志。我们一度发生数据库崩溃,因为归档目标上没有可用的存储空间。在删除数据时,如何避免生成日志?
要删除的数据已在数据库中标记为非活动状态。应用程序代码忽略非活动数据。我不需要回滚操作的能力。
我无法对数据进行分区,使非活动数据落入可以删除的一个分区中。我必须用删除语句删除数据。
如果需要,我可以要求DBA在表级/架构级/表空间级/服务器级别设置某些配置。
我正在使用Oracle 11g。
答案 0 :(得分:2)
表格中有多少比例的数据会被删除,数量是多少?是否存在任何参照完整性约束来管理或该表无子女?
根据答案,您可以考虑:
这种方法的问题在于它是一个多步骤的DDL流程,您将有一个工作来使容错和可逆。
更安全的选择可能是使用数据泵:
此时我建议你阅读关于数据泵的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,删除行,然后重新开启记录。