Oracle

Oracle 帳戶無響應

  • January 25, 2015

我有一個具有 user1、user2 和 user3 帳戶的 Oracle 實例。昨天我能夠登錄所有三個帳戶。今天,我可以進入 user1 和 user3,但 user2 以某種我不理解的方式完全“凍結”了。

如果我嘗試使用 sqlplus 登錄到 user2,它只會永遠旋轉。它不會連接,不會超時,直到我按 CTRL+C 終止程序之前什麼都沒有發生。以 user1 或 user3 身份連接是即時的。

我想我會嘗試將 user2 鎖定,然後嘗試解鎖它。在我放棄之前,鎖定使用者的查詢執行了 25 分鐘!鎖定 user1 然後解鎖 user1 立即執行。

使用TOAD並以 DBA 身份連接,我使用會話瀏覽器進行調查。我以 user2 身份找到了 11 個與數據庫的連接。其中五個似乎是我使用 sqlplus 連接失敗的嘗試。這些連接都沒有顯示任何打開的游標、目前語句或任何鎖。在連接的等待選項卡 10 上顯示“行記憶體鎖”:

  • 等待 3,000 到 60,000 秒
  • P1 = 7
  • P1 文本 = “記憶體 ID”
  • P2 = 0
  • P2 文本 = “模式”
  • P3 = 3
  • P3 文本 = “請求”

其中一個連接很突出,因為它看起來很古老。它顯示了一條“來自客戶端的 SQL*Net 消息”,其中包含:

  • 等待秒數 > 600,000
  • P1 = 1413697536
  • P1 文本 = “驅動程序 ID”
  • P2 = 1
  • P2 文本 = “#bytes”
  • P3 = 0
  • P3 文本 = ""

我無法殺死這 11 個會話中的任何一個。在我發出 kill 命令(使用 TOAD,帶或不帶立即選項)後,它會執行 45-60 秒,然後顯示“會話已標記為要終止”。但會話永遠不會消失。

任何想法這意味著什麼或如何終止這些會話並恢復對 user2 帳戶的訪問?

更新:警報日誌中有一些有趣的行:

2009 年 12 月 29 日星期二 09:37:45

警告:入站連接超時 (ORA-3136)

2009 年 12 月 29 日星期二 10:25:45 >>> 等待行記憶體排隊鎖的時間太長了!pid=37 系統狀態轉儲到跟踪文件

`>>> 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`

$$ snip $$\udump\ora_2860.trc

2009 年 12 月 30 日星期三 11:55:59

orakill:試圖殺死 tid=436

2009 年 12 月 30 日星期三 11:56:04

orakill:ssthreadkill(tid=436)無法獲取執行緒列表互斥鎖:err= 0

解決方法:這似乎是一個 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 值,登錄到伺服器並從 DOS 命令提示符發出以下命令:

orakill YOURSID spid

YOURSID 是您正在處理的數據庫實例的 SID。

orakill 通常在 GUI 工具無法終止程序時起作用。這是orakill 的一個很好的概述。注意使用 orakill 的原因 #1 - 它可以解釋為什麼您不能使用您的 GUI 工具:

alter system 語句不會清除任何存在的鎖。相反,會話將保持連接直到超時,然後會話被終止並釋放鎖。orakill 命令將立即終止執行緒和鎖。

更新:

你也可以試試:

select sid, serial#, program from v$session;
alter system kill session '<SID>,<SERIAL#>' immediate;

雖然我不會抱太大希望…

引用自:https://serverfault.com/questions/98305