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

Oracle 應用開發常見問題排查:SHUTDOWN 失效與 Client 死鎖

     編輯:Oracle 資料庫相關知識

環境

  • 硬體:Sun Ultra Enterprise 3000
  • OS:Solaris 2.5 (zh_CN)
  • Oracle:7.3.2.1

問題一:SHUTDOWN 無法關閉資料庫

原因

存在未提交交易 (Uncommitted Transactions),SHUTDOWN NORMAL/IMMEDIATE 等待交易完成/回滾,若 Client 掛起則無限等待。

解決

-- 強制關閉,未提交交易回滾
SHUTDOWN ABORT;

-- 重啟後資料庫自動執行 Instance Recovery (Redo Roll Forward + Undo Roll Back)

注意: 僅限緊急情況,常規關閉請先通知用戶提交/回滾。

問題二:Client 端頻繁無故死機

原因 A:使用者誤操作導致 Deadlock

  • 序列:UPDATE → DELETE → 未提交即執行 SELECT
  • 同一 Session 內自我封鎖 (Self-Deadlock) 或與其他 Session 循環等待

排查與解決

  1. Server 端用 V$LOCK, V$SESSION_WAIT 確認阻塞鏈
  2. 識別 Blocker PID:SELECT p.spid FROM v$session s JOIN v$process p ON s.paddr=p.addr WHERE s.sid = ;
  3. OS 層面殺除:kill -9
  4. 應用端修正:同一交易內避免 DML 後未提交即查詢同表,或設定 SET TRANSACTION ISOLATION LEVEL READ COMMITTED

原因 B:應用程式 Bug 觸發 Constraint Violation

  • 現象:插入資料後跑程式報 DUP_VAL_ON_INDEX (ORA-00001)
  • 根因:Primary Key 設計錯誤,導致不應重複的資料寫入
  • 解決:修正 PK 定義、清理髒資料、修正應用邏輯

輔助工具

  • Platinum EPM (Enterprise Performance Monitor) 監控 DML Locks、Session 狀態
  • Data Dictionary 查詢:DBA_CONSTRAINTS, DBA_CONS_COLUMNS, USER_ERRORS
  • Server 端 V$SQL 捕獲當前執行 SQL

預防清單

  1. 應用程式統一錯誤處理框架,記錄 SQLCODE/SQLERRM/Call Stack
  2. 交易邊界明確:業務邏輯單元 Commit/Rollback
  3. PK/UK/FK/Check Constraint 設計評審
  4. 定期檢查 Alert Log、Listener Log 異常條目
  5. 開發/測試/生產環境參數一致性
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved