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

Posted

技术标签:

【中文标题】删除表分区以避免错误 ORA-00054【英文标题】:Dropping a table partition avoiding the error ORA-00054 【发布时间】:2011-10-10 15:26:30 【问题描述】:

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

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

    打开一个 sqlplus 会话,禁用自动提交,然后在 分区表,不提交更改; 打开另一个 sqlplus 会话并截断/删除旧分区(DDL 如果我没记错的话,操作是自动提交的)。我们 然后会得到 ORA-00054 错误。

有一些限制值得一提:

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

那么,在您看来,是否有任何方法可以删除这些旧分区,而不会有遇到 ORA-00054 错误的风险并且无需 DBA 干预?我可以删除数据,但是空分区的数量每天都会增加。

非常感谢。

【问题讨论】:

【参考方案1】:

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

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

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

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

您似乎有几个问题需要处理。对您来说不幸的是,它们是政治性和架构性的,而不是技术性的,我们无法为您提供更多帮助。

【讨论】:

公平地说,我同意知道哪些会话被锁定(以及为什么)是必要的,但我已经看到表设置了日期范围分区,目的是“老化”旧数据并只保留 x月/年的数据。这似乎是那个设置,我猜这个清除工作是在一个月左右的第一天运行的。例如,如果当时发生直接路径插入,则用户没有“使用”旧数据,只是 Oracle 将锁定表(我相信所有分区)。所以等待这些插入完成是有意义的。我想我是说尝试一下并记录失败的原因 嗨!嗯,有一个 Windows 服务使用批量插入定期写入该表。 dbms_scheduler 作业删除旧分区,因为它们是按日期分区的。因此,即使分区删除操作(通过 dbms_scheduler 作业)和写入操作正在操作不同的分区(并且作业 从不 删除“今天”分区),我也会收到此错误。 @tbone 关于此分区的目的是正确的,尽管该作业每天都在运行。我想我会尝试 tbone 的方法。鉴于这种特定情况,这对我来说似乎是公平的。 @Moe - 我在我的 11gR2 数据库上尝试了这个,有两个会话:一个插入分区,另一个删除分区。除了另一个会话插入的分区之外,我可以删除任何分区。也许旧版本的数据库有所不同。 嗨@APC。你是对的。我也做过那个测试,这让我觉得事情有点难看:)无论如何,在与你们讨论之后,我认为我有足够的能力进行更深入的分析。 @APC:常规插入会以这种方式工作,但直接路径插入会锁定每个分区,即使插入没有插入任何行。 @Moe/@tbone:您可以通过使用常规插入或在插入中指定分区名称来减少锁定。【参考方案2】:

如何在循环中尝试操作的 pl/sql 中包装截断或删除,在尝试之间等待 x 秒,以获得最大尝试次数。然后使用 dbms_scheduler 调用该过程/函数。

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于删除表分区以避免错误 ORA-00054的主要内容,如果未能解决你的问题,请参考以下文章

ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效

ora-00054:resource busy and acquire with nowait specified

Oracle中修改表名遇到“ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效”

解决ORA-00054资源正忙的问题

ORA-00054: 资源繁忙并使用指定的 NOWAIT 获取或超时已过期

oracle修改表字段名时报错:ORA-00054:资源正忙,但指定以NOWAIT方式获取资源,或者超时失效的问题