为Oracle中的ALTER TABLE ADD列设置超时值(DDL_LOCK_timeout不起作用) 问题:

为Oracle中的ALTER TABLE ADD列设置超时值(DDL_LOCK_timeout不起作用) 问题:,oracle,timeout,locking,ddl,freeze,Oracle,Timeout,Locking,Ddl,Freeze,如何在oracle中为非阻塞DDL(ALTER TABLE add column)设置超时值,以便在任何DML长时间(数小时)锁定表时,DDL可以快速失败,而不是等待数小时。(我们预计oracle会出现类似ORA-00054的错误:资源繁忙,并在指定NOWAIT或超时的情况下获取以中断DDL) 注意:DDL_锁定_超时不起作用(请参阅下面的“我尝试了什么”) 背景 我正在开发一个大型oracle数据库(oracle database 19c)。还有一个遗留应用程序每小时都会做一次聚合工作来计算过

如何在oracle中为非阻塞DDL(ALTER TABLE add column)设置超时值,以便在任何DML长时间(数小时)锁定表时,DDL可以快速失败,而不是等待数小时。(我们预计oracle会出现类似ORA-00054的错误:资源繁忙,并在指定NOWAIT或超时的情况下获取以中断DDL)

注意:DDL_锁定_超时不起作用(请参阅下面的“我尝试了什么”)

背景 我正在开发一个大型oracle数据库(oracle database 19c)。还有一个遗留应用程序每小时都会做一次聚合工作来计算过去一小时的数据,比如平均值,计数器的总和。该产品有40个CPU和200GB+内存,通常聚合作业将运行30分钟左右,但在某些情况下,如由于维护中断,聚合作业延迟,需要在下一个聚合作业中处理更多数据,导致作业运行数小时

那些遗留应用程序超出了我的控制范围。无法更改聚合作业

不使用基于版本的重新定义

我的工作是更新数据库表(由于添加了新的计数器)。我们使用ALTERTABLE将新列添加到现有表中。但在某些情况下,聚合作业会将表锁定数小时,使我的脚本在那里挂起数小时。这让顾客不高兴。所以我想让我的脚本快速失败

我试过的 由谷歌长期以来,似乎是最简单的解决方案

但是,根据测试,我们注意到DDL_LOCK_TIMEOUT在本例中不起作用。经过很长一段时间的谷歌搜索,我们发现Oracle文档清楚地提到:

DDL_LOCK_TIMEOUT参数影响阻塞DDL语句(但不影响非阻塞DDL语句)

ALTER TABLE add列正好是中列出的“非阻塞DDL”

期望值 当DML将表锁定1小时时,如
从MY_表中选择*进行更新
并在1小时后提交。我希望我的DDL像
ALTER TABLE my_TABLE ADD(COL\u A number)
可以在10分钟后获得超时,而不是等待1小时

其他解决方案 1. 我认为有一种解决方案,我们可以首先在独占模式下发出一个
锁表my_table wait 600
以获得锁。但是在我们讨论这个解决方案之前,我想寻找一个简单的解决方案,就像
DDL\u LOCK\u TIMEOUT
只设置一个参数

2.
基于oracle文档,启用
补充日志记录
可以将非阻塞DDL降级为阻塞方式。但补充日志记录是DB级配置。我没有进行此类更改的权限。

您好。使用两个调度程序作业怎么样?作业1启动作业2,然后睡眠10分钟。当它醒来时,如果作业2仍在运行,它将结束作业2。作业2改变表格。只是个主意。编辑:实际上,作业1的逻辑可以直接进入您的脚本,因此您只需要作业2和脚本。如果您想在速度较快的情况下节省时间,还可以让它睡眠1分钟10次。下面是如何从程序中强制停止作业:谢谢Peter。似乎是的,这是一个可能的解决办法。但是对于我的更新,我需要每次更新数百个表,基于提供的链接,我知道我需要重写所有SQL以将其定义为作业,以便以后可以停止它。它似乎比在每个SQL之前运行锁表语句更复杂。