最近,我开始在我的Oracle DB (UAT环境)中发现这种奇怪的行为,您的反馈非常感谢。
最近,当我尝试重新编译我的包时,编译失败了,从那时起,DB进入了“锁定状态”--我认为任何需要访问这个包函数/过程的查询都不会运行到完成。
我的DBA是说,当有一个开放会话试图访问它时,我试图编译它。它首先删除了现有的包,然后无法重新创建新的包,所以整个包都丢失了,因此DB被毁了。
我不太明白这一点。“公开会议”能引起这样的问题吗?
可以从以下来源访问my:
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访问权限的开发人员。我不确定他们或上面任何其他人如何能够留下一个“公开会议”,从而导致这种情况。
发布于 2018-02-13 04:53:18
在这里,“公开会话”可能不是正确的术语。您很可能遇到了一个块,我们称之为“库缓存引脚”。当您试图编译的PL/SQL对象处于活动调用中时,就会发生这种情况。如果您的PL/SQL程序运行数分钟(小时?)几天?)一次,很明显你在这里会有危险。
例如,在第一次会议上,我会:
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 /blocks....If,我会看到会话的细节
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我看到正在运行的一个,会话被卡在库缓存引脚上。
但是,如果您只是wait...eventually,那么一旦其他执行完成,您就能够编译。
显然,如果您有为hours...then运行的例程,您应该有一种方法能够优雅地阻止它们。
https://stackoverflow.com/questions/48758831
复制相似问题