Oracle DB被锁定了

时间:2018-02-13 03:09:23

标签: oracle plsql

我最近在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访问的开发人员。我不确定他们或其他任何人如何留下可能导致此问题的“公开会议”。

1 个答案:

答案 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

我看到正在运行的会话,会话卡在库缓存引脚上。

但是如果你只是等待......最终你将能够在其他执行结束后编译。

显然,如果你有几个小时的例程......那么你应该有办法优雅地阻止它们。