ALTER SYSTEM KILL SESSION 'sid,serial#' [IMMEDIATE];
KILLED,**下一次資料庫呼叫 (Next Call)** 時終止、PMON 清理。
-- Kill 前
SID SERIAL# PADDR USERNAME STATUS
11 314 542B70E8 EYGLE INACTIVE
-- Kill 後
SID SERIAL# PADDR USERNAME STATUS
11 314 542D6BD4 EYGLE KILLED -- PADDR 變更!
-- 再 Kill 另一 Session
SID SERIAL# PADDR USERNAME STATUS
14 397 542D6BD4 EQSP KILLED -- 同一 PADDR!
**關鍵發現**:被 Kill 的 Session **PADDR 被修改為同一虛擬地址**,導致 V$SESSION.PADDR = V$PROCESS.ADDR 關聯失效,**無法透過 V$PROCESS 找到 SPID** 進行 OS 層 Kill。
SELECT s.username, s.status,
x.addr, x.ksllapsc, x.ksllapsn, x.ksllaspo, x.ksllid1r,
DECODE(BITAND(x.ksuprflg,2),0,NULL,1) killed_flag
FROM x$ksupr x, v$session s
WHERE s.paddr(+) = x.addr
AND BITAND(x.ksspaflg,1) != 0;
輸出中 KILLED_FLAG = 1 且 ADDR 為 **原始 Process Address** (如 542B70E8、542B7498)。
SELECT p.addr
FROM v$process p
WHERE p.pid != 1 -- 排除 PMON
MINUS
SELECT s.paddr
FROM v$session s;
-- 結果即為被 Kill 但 OS Process 尚未退出的進程位址
ADDR。V$PROCESS 獲取 SPID (OS Process ID)。kill -9 orakill (Oracle 提供工具,避免 kill 整個 oracle.exe)ALTER SYSTEM KILL SESSION → 修改 Session 狀態為 KILLED,**PADTR 指向共用虛擬地址** → Session 與 Process 邏輯解耦。ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE; 縮短等待。
SELECT COUNT(*) FROM v$session WHERE status = 'KILLED';
-- > 10 立即告警,檢查 PMON 是否卡住
ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' POST_TRANSACTION 等待交易結束。KILL SESSION 只是**邏輯標記**,真正清理由 **PMON 非同步執行**。**PADDR 變更導致 V$SESSION-V$PROCESS 關聯斷裂**,需透過 X$KSUPR 或 V$PROCESS MINUS V$SESSION 反查真實 Process。生產環境請建立 **自動化 Kill+OS終止腳本**,並監控 KILLED 狀態堆積,防止 PMON 成為瓶頸。