我有一个具有user1,user2和user3帐户的Oracle实例。 昨天我能够login到所有三个帐户。 今天,我可以进入user1和user3,但user2被完全“冻结”,我不明白的某种方式。
如果我尝试使用sqlpluslogin到user2,它只是永远旋转。 它不连接,不超时,直到我按CTRL + C来杀死进程。 以user1或user3连接即时。
我想我会尝试lockinguser2,然后尝试解锁它。 查询locking用户跑了25分钟,然后我放弃了! lockinguser1然后解锁user1立即运行。
使用TOAD和连接作为DBA,我使用会话浏览器进行调查。 我find了11个连接到数据库的用户2。 其中五个似乎是我连接使用sqlplus失败的尝试。 这些连接都没有显示任何打开的游标,当前语句或任何锁。 在连接的等待选项卡10上显示“行高速cachinglocking”:
其中一个联系突出,因为它似乎是非常古老的。 它显示了一个来自客户端的“SQL * Net消息”:
我无法杀死这11个会议中的任何一个。 在发出kill命令(使用TOAD,带或不带立即选项)后,它运行45-60秒,然后说“会话被标记为kill”。 但会议永远不会消失。
任何想法这意味着什么或如何我可以杀死这些会议,并恢复访问到user2帐户?
更新 :警报日志中有一些有趣的行:
2009年12月29日星期二09:37:45
警告:入站连接超时(ORA-3136)
2009年12月29日星期二10:25:45
>>> WAITED TOO LONG FOR A ROW CACHE ENQUEUE LOCK! pid=17
System State dumped to trace file [snip]\udump\ora_1988.trc
Tue Dec 29 10:54:17 2009
WARNING: inbound connection timed out (ORA-3136)
Tue Dec 29 10:55:47 2009
WARNING: inbound connection timed out (ORA-3136)
Tue Dec 29 10:56:47 2009
WARNING: inbound connection timed out (ORA-3136)
Tue Dec 29 10:57:47 2009
WARNING: inbound connection timed out (ORA-3136)
Tue Dec 29 11:12:17 2009
WARNING: inbound connection timed out (ORA-3136)
Tue Dec 29 12:06:17 2009
WARNING: inbound connection timed out (ORA-3136)
Tue Dec 29 12:26:47 2009
WARNING: inbound connection timed out (ORA-3136)
Tue Dec 29 12:27:47 2009
WARNING: inbound connection timed out (ORA-3136)
Tue Dec 29 13:46:17 2009
WARNING: inbound connection timed out (ORA-3136)
Wed Dec 30 10:02:16 2009>>> WAITED TOO LONG FOR A ROW CACHE ENQUEUE LOCK! pid=17>>>等待太长时间的行高速cachingENQUEUE LOCK! PID = 37
System State dumped to trace file [snip]\udump\ora_1988.trc
Tue Dec 29 10:54:17 2009
WARNING: inbound connection timed out (ORA-3136)
Tue Dec 29 10:55:47 2009
WARNING: inbound connection timed out (ORA-3136)
Tue Dec 29 10:56:47 2009
WARNING: inbound connection timed out (ORA-3136)
Tue Dec 29 10:57:47 2009
WARNING: inbound connection timed out (ORA-3136)
Tue Dec 29 11:12:17 2009
WARNING: inbound connection timed out (ORA-3136)
Tue Dec 29 12:06:17 2009
WARNING: inbound connection timed out (ORA-3136)
Tue Dec 29 12:26:47 2009
WARNING: inbound connection timed out (ORA-3136)
Tue Dec 29 12:27:47 2009
WARNING: inbound connection timed out (ORA-3136)
Tue Dec 29 13:46:17 2009
WARNING: inbound connection timed out (ORA-3136)
Wed Dec 30 10:02:16 2009
系统状态转储到跟踪文件[剪切] \ udump \ ora_2860.trc
Wed Dec 30 11:55:59 2009
orakill:试图杀死tid = 436
Wed Dec 30 11:56:04 2009
orakill:ssthreadkill(tid = 436)无法获得线程列表互斥量:err = 0
解决scheme :这似乎是一个10.2.0.3的错误,我需要重新启动实例,我没有权限做,所以我会等待几天。
尝试以下操作:
select s.username, s.sid, p.spid from v$session s join v$process p on addr=paddr where s.username = 'USER2';
使用上述查询的spid值,login到服务器并从DOS命令提示符处发出以下命令:
orakill YOURSID spid
YOURSID是您正在处理的数据库实例的SID。
当GUI工具无法终止进程时,orakill经常起作用。 这是一个很好的概述orakill 。 注意使用orakill的理由#1 – 这也许可以解释为什么你不能使用你的GUI工具:
alter system语句不会清除存在的任何锁。 相反,会话将保持连接状态直到超时,然后会话被终止并释放锁。 orakill命令将立即杀死线程和锁。
更新:
你也可以尝试:
select sid, serial#, program from v$session; alter system kill session '<SID>,<SERIAL#>' immediate;
虽然我不会抱很多希望