首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

快速終結佔用過多 CPU/內存的 Oracle 數據庫進程:OS 級 Kill + Session Kill 雙重保障

     編輯:MySQL 資料庫相關知識

問題現象

異常 SQL 或邏輯 Bug 導致某 Session 佔用大量 CPU/內存,ALTER SYSTEM KILL SESSION 'sid,serial#' 執行後狀態變 KILLED 但進程長時間不釋放資源。

根因

KILL SESSION 只是標記會話為「待終止」,實際清理由 PMON 進程異步執行,大事務回滾、鎖清理耗時不可控。

快速釋放資源雙重殺招

  1. OS 級 Kill 進程(即時生效)
  2. 數據庫級 Kill Session(標記清理)

操作步驟

1. 定位目標 Session

SELECT sid, serial#, username, status, machine, program
FROM v$session
WHERE username = 'SCOTT';  -- 或按 SQL_ID、MODULE 等過濾

2. 獲取對應 OS 進程號 (SPID)

SELECT 'kill -9 ' || p.spid AS kill_cmd
FROM v$process p, v$session s
WHERE p.addr = s.paddr
  AND s.sid = :target_sid;  -- 替換為實際 SID

輸出示例:kill -9 22702

3. OS 層面強制終止

[oracle@db ~]$ ps -ef | grep 22702
oracle 22702 1 0 Oct25 ? 00:00:02 ora_p001_danaly

[oracle@db ~]$ kill -9 22702
[oracle@db ~]$ ps -ef | grep 22702  -- 確認進程消失

4. 數據庫層面標記清理

ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;

IMMEDIATE 關鍵字(10g+)讓 PMON 立即回滾並釋放鎖,不再等待。

驗證資源釋放

-- 確認 Session 消失
SELECT sid FROM v$session WHERE sid = :target_sid;  -- 無記錄

-- 確認鎖釋放
SELECT * FROM v$lock WHERE sid = :target_sid;  -- 無記錄

-- 觀察系統負載下降
-- top、vmstat、AWR 報告對比

注意事項與風險

  • 事務回滾: OS Kill 會導致事務中斷,PMON 需回滾,大事務回滾同樣消耗資源,但總體比等待自然結束快。
  • 數據一致性: 未提交事務數據丟失,屬正常預期行為。
  • RAC 環境: 需在對應 Instance 節點執行 OS Kill。
  • 權限: 需 OS oracle 用戶權限 + 數據庫 SYSDBA/ALTER SYSTEM 權限。

預防措施

  1. 資源管理器 (DBMS_RESOURCE_MANAGER) 限制單 Session CPU/IO
  2. SQL Profile / Plan Baseline 固化優化計劃
  3. 監控告警:V$SESSION_WAIT、V$SQL_MONITOR 長時間運行 SQL 自動告警
  4. 定期 AWR/ASH 分析,優化高負載 SQL

總結

OS Kill + Session Kill IMMEDIATE 是處理失控進程的最快組合拳。平時做好資源管控與監控,才能從源頭減少此類緊急處理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved