oracle ORA-00031:session marked for kill(標記要終止的會話)解決方案_oracle

來源:互聯網
上載者:User

今天碰到一個問題,有一張表不能操作,很可能是被鎖了,首先想到的是kill session,於是執行了下列的指令碼找到是哪個session有問題:

查看錶是否被鎖

SELECT /*+ rule*/a.sid, b.owner, object_name, object_typeFROM v$lock a, all_objects bWHERE TYPE = 'TM'and a.id1 = b.object_id;

根據上面查詢出的sid,找出對應的serial#:
SELECT sid,serial# FROM v$session WHERE sid = &sid;

發現有一個會話有鎖sid 197,serial# 17,於是執行alter system kill session ‘197,17';大概等了30s中,pl/sql developer報出一個錯誤:ora-00031:標記要終止的會話。

解決方案:查出session的spid

select spid, osuser, s.program from v$session s, v$process p where s.paddr = p.addr and s.sid =197;

1. 在linux上, kill -9 12345
2. 在windows上,C:\Documents and Settings\gg>orakill orcl 12345

orcl:表示要殺死的進程屬於的執行個體名
12345:是要殺掉的線程號

ORA-00031: session marked for kill
Cause: The session specified in an ALTER SYSTEM KILL SESSION command cannot bekilled immediately (because it is rolling back or blocked on a networkoperation), but it has been marked for kill. This means it will be killed as soonas possible after its current uninterruptible operation is done.
Action: No action is required for the session to be killed, but further executionsof the ALTER SYSTEM KILL SESSION command on this session may cause the sessionto be killed sooner.

下面是補充:

oracle中編譯一個包的時候發現,只要一編譯就卡死了,後來使用《oracle查詢、Kill鎖資源的SQL語句》方法查鎖的時候發現包中用到的一些資源一直處於死結狀態。後來通過alter system kill session的方法去解鎖,卻發現出現如下圖1所示的問題:
ORA-00031:標記要終止的會話

ORA-00031:標記要終止的會話

後來通過串連上oracle資料庫所在的系統,然後kill掉進程解決,方法如下:

(1)查詢被鎖資源的sid、serial#:

SELECT s.sid,    s.serial#,    v.*,    ao.* FROM v$locked_object v,    all_objects   ao,    v$session    s WHERE v.object_id = ao.object_id  AND s.sid = v.session_id;

(2)利用上面的SQL查詢出sid和serial#以後,利用下面SQL去kill session:

-- 如有記錄則表示lock,記錄下SID和serial#,將記錄下的SID和serial#替換下面的738,1429,即可接觸lock。
ALTER SYSTEM KILL SESSION '738,1429';

(3)如果上面的kill session報如上圖1的錯誤,那麼再用下面的SQL去查處session對應的spid:

SELECT p.spid,    s.osuser,    s.program FROM v$session s,    v$process p WHERE s.paddr = p.addr  AND s.sid = 37; -- 替換成相應的session_id

(4)連上oracle資料庫所在的系統(我這裡是Linux系統),記錄下上面查到的spid(假設這裡查到的是1133),然後使用下面語句來kill掉進程:

kill -9 1133

等待一會,等進程kill成功以後,再去查鎖即可發現資源已經被釋放。如果oracle安裝在Windows系統上,請使用Windows系統的kill進程的方式去殺掉進程。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.