我最近在Oracle DB(UAT环境)中开始出现这种奇怪的行为,非常感谢您的反馈。
最近,当我尝试重新编译我的包时,编译无法完成,从那时起,数据库进入“锁定状态” - 我认为任何查询要求访问此包函数/过程不会运行完成。
我的DBA说,我正在尝试编译程序包,而打开会话试图访问它。首先删除了现有的包,然后无法重新创建新包,因此整个包丢失了,因此数据库被破坏了。
我不确定我是否理解这一点。 “公开会议”会导致这样的问题吗?
可以从这些来源访问我的数据库:
a) .NET web application (Read/Write access)
b) Tableau server (Read Only access)
c) Developers on SQLDbx and PLSQLDeveloper (some with R/W and some with R/O access)
d) Tableau Desktop dashboard tool (R/O access)
最近发生的唯一变化是上面的c),我们在其中添加了一些R / O访问的开发人员。我不确定他们或其他任何人如何留下可能导致此问题的“公开会议”。
答案 0 :(得分:2)
“开放会话”可能不是这里的正确术语。您很可能遇到了我们称之为“库缓存引脚”的阻塞。当您尝试编译的PL / SQL对象处于活动调用时,会发生这种情况。如果你的PL / SQL程序一次运行几分钟(几小时?天?),那么显然你可能会遇到风险。
例如,在1个会话中我做:
SQL> create or replace
2 procedure long_running is
3 begin
4 dbms_lock.sleep(20);
5 end;
6 /
Procedure created.
SQL>
SQL> exec long_running
[takes 20 seconds obviously]
在另一个会话中我尝试修改proc
SQL> create or replace
2 procedure long_running is
3 begin
4 dbms_output.put_line('blah blah blah');
5 end;
6 /
它会阻止....如果我查看会话详细信息,我会看到
SQL> select event, seconds_in_wait
2 from v$Session
3 where status = 'ACTIVE'
4 and username = 'SCOTT'
5 /
EVENT SECONDS_IN_WAIT
---------------------------------------------------------------- ---------------
PL/SQL lock timer 16
library cache pin 12
我看到正在运行的会话,会话卡在库缓存引脚上。
但是如果你只是等待......最终你将能够在其他执行结束后编译。
显然,如果你有几个小时的例程......那么你应该有办法优雅地阻止它们。