删除表分区,避免错误ORA-00054

时间:2011-10-10 15:26:31

标签: oracle plsql locking partitioning

在这种情况下我需要你的意见。我会尝试解释这个场景。我有一个Windows服务,定期将数据存储在Oracle数据库中。存储此数据的表按日期(间隔日期范围分区)进行分区。该数据库还有一个dbms_scheduler作业,除其他操作外,还截断并删除旧分区。

这种方法已经工作了一段时间,但最近我遇到了ORA-00054错误。经过一些调查后,错误通过以下步骤重现:

  1. 打开一个sqlplus会话,禁用自动提交,并在中插入数据 分区表,没有提交更改;
  2. 打开另一个sqlplus会话并截断/删除旧分区(DDL 如果我没有记错的话,操作会自动提交。我们 然后会收到ORA-00054错误。
  3. 有一些值得提及的限制因素:

    • 我没有DBA访问数据库;
    • 这是一个遗留应用程序,完全重构不是 可行的;

    那么,在您看来,有没有办法放弃这些旧分区,没有遇到ORA-00054错误而没有DBA干预的风险?我可以删除数据,但每天都会增加空分区的数量。

    非常感谢提前。

3 个答案:

答案 0 :(得分:4)

此错误表示某人(或某事)正在使用您要删除的分区中的数据。也就是说,在分区级别授予锁定。如果没有人使用分区,你的工作可能会丢弃它。

现在你说这是一个遗留应用程序,你不想或不能重构它。很公平。但是,如果你有一个进程正在切换其他进程正在使用的数据,那么显然有些不对。我不同意@tbone建议只是循环,直到锁被释放:你不能只是摆脱有人正在使用的数据,以确定他们为什么仍在使用他们显然不应该使用的数据。

因此,第一步是找出锁定会话正在做什么。为什么他们仍在修改您的后台工作要退休的数据?这是一个script which will help you establish which session has the lock

除非您“没有DBA访问数据库”。嗯,这是一个卷曲的。基本上这不是一个没有DBA访问就可以解决的问题。

您似乎有几个问题需要处理。不幸的是,他们是政治和建筑而不是技术,我们没有太多可以帮助你进一步。

答案 1 :(得分:3)

如何在pl / sql中包含truncate或drop,它在循环中尝试操作,在尝试之间等待x秒,最多尝试次数。然后使用dbms_scheduler来调用该过程/函数。

答案 2 :(得分:1)

也许this可以提供帮助。似乎与您描述的问题相同。 (如果可以,请忽略漫画sans :) :()