當 Oracle 因內部鎖機制導致資源被鎖定,需快速定位並終結阻塞會話。本文提供完整 SQL 腳本:列出所有會話 → 找出被鎖會話 → 產生 KILL 指令。
-- remsession.sql
SET ECHO OFF TERMOUT ON LINESIZE 80 PAGESIZE 60 NEWPAGE 0
SELECT RPAD(c.name||':',11)||RPAD(' current logons='||TO_NUMBER(b.sessions_current),20)||
'cumulative logons='||RPAD(SUBSTR(a.value,1,10),10)||'highwater mark='||b.sessions_highwater Information
FROM v$sysstat a, v$license b, v$database c
WHERE a.name = 'logons cumulative';
TTITLE "Database|UNIX/Oracle Sessions"
SET HEADING OFF
SELECT 'Sessions on database '||SUBSTR(name,1,8) FROM v$database;
SET HEADING ON
SELECT SUBSTR(a.spid,1,9) pid,
SUBSTR(b.sid,1,5) sid,
SUBSTR(b.serial#,1,5) ser#,
SUBSTR(b.machine,1,6) box,
SUBSTR(b.username,1,10) username,
SUBSTR(b.osuser,1,8) os_user,
SUBSTR(b.program,1,30) program
FROM v$session b, v$process a
WHERE b.paddr = a.addr AND type='USER'
ORDER BY spid;
TTITLE OFF
SET HEADING OFF
SELECT 'To kill, enter SQLPLUS> ALTER SYSTEM KILL SESSION','''||'SID, SER#'||''''||';' FROM dual;
SELECT sess.sid, sess.serial#,
lo.oracle_username, lo.os_user_name,
ao.object_name, lo.locked_mode
FROM v$locked_object lo, dba_objects ao, v$session sess
WHERE ao.object_id = lo.object_id
AND lo.session_id = sess.sid;
輸出範例:
| SID | SER# | Oracle User | OS User | Object | Lock Mode |
|---|---|---|---|---|---|
| 21 | 56 | APPS | applmgr | FND_CONCURRENT_REQUESTS | 2 |
| 77 | 535 | APPS | applmgr | MTL_SYSTEM_ITEMS | 2 |
| 126 | 161 | APPS | oracle | SO_LINES_ALL | 2 |
SPOOL run_nuke.sql SELECT 'ALTER SYSTEM KILL SESSION '''||sess.sid||','||sess.serial#||''';' FROM v$locked_object lo, dba_objects ao, v$session sess WHERE ao.object_id = lo.object_id AND lo.session_id = sess.sid; SPOOL OFF
執行產生的 run_nuke.sql 即可逐一終結阻塞會話,釋放鎖定資源。