環境
- 硬體: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 循環等待
排查與解決
- Server 端用
V$LOCK, V$SESSION_WAIT 確認阻塞鏈
- 識別 Blocker PID:
SELECT p.spid FROM v$session s JOIN v$process p ON s.paddr=p.addr WHERE s.sid = ;
- OS 層面殺除:
kill -9
- 應用端修正:同一交易內避免 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
預防清單
- 應用程式統一錯誤處理框架,記錄 SQLCODE/SQLERRM/Call Stack
- 交易邊界明確:業務邏輯單元 Commit/Rollback
- PK/UK/FK/Check Constraint 設計評審
- 定期檢查 Alert Log、Listener Log 異常條目
- 開發/測試/生產環境參數一致性