位置:$ORACLE_BASE/diag/rdbms/ (11g+ ADR 架構)
核心價值:數據庫「黑匣子」,記錄關鍵生命周期事件與錯誤。
| 日誌特徵 | 業務含義 | 標準處置流程 |
|---|---|---|
| Starting ORACLE instance (normal) | 實例啟動 | 檢查非默認參數是否符合預期 |
| Thread 1 advanced to log sequence N | Redo Log 切換 | 正常;若頻繁 (秒級) 檢查 Checkpoint/Archive 滯後 |
| ORA-1652/1653/1654 | 表空間無法分配Extent | 緊急擴容數據文件或添加數據文件 |
| ORA-00600 / ORA-07445 | 內部錯誤 / 進程異常終止 | 收集 Trace 文件 → MOS 查詢 Bug → 打補丁/變通 |
| Corrupt block found | 數據塊損壞 | DBV 驗證 → 確認對象類型 (索引重建 / 表恢復 / RMAN Block Recovery) |
| Tablespace 'XXX' is 95% full | 空間預警 (10g+ 自動) | 擴容或清理歸檔/臨時段 |
| Deadlock detected | 死鎖 | Trace 分析 SQL/應用邏輯 → 應用層修復索引順序/提交頻率 |
#!/bin/bash
# check_alert.sh 每 5 分鐘跑一次
ADR_HOME=$(grep -r "ADR base" $ORACLE_HOME/log/diag/rdbms/*/*/trace/alert_*.log 2>/dev/null | head -1 | cut -d' ' -f4)
TAIL_LINE=1000
KEYWORDS="ORA-|TNS-|corrupt|deadlock|unable to extend|terminating the instance"
tail -n $TAIL_LINE $ADR_HOME/trace/alert_${ORACLE_SID}.log | \
grep -iE "$KEYWORDS" | \
grep -v "ORA-00000" | \
while read line; do
echo "$(date) ALERT: $line" | mail -s "Oracle Alert: $ORACLE_SID" dba_team@company.com
done
-- 1. 空間使用率總覽
SELECT tablespace_name,
ROUND(total_mb,2) total_mb,
ROUND(used_mb,2) used_mb,
ROUND(free_mb,2) free_mb,
ROUND(pct_used,1) pct_used
FROM (
SELECT df.tablespace_name,
SUM(df.bytes)/1024/1024 total_mb,
SUM(df.bytes)/1024/1024 - SUM(NVL(fs.bytes,0))/1024/1024 used_mb,
SUM(NVL(fs.bytes,0))/1024/1024 free_mb,
(1 - SUM(NVL(fs.bytes,0))/SUM(df.bytes))*100 pct_used
FROM dba_data_files df
LEFT JOIN dba_free_space fs ON df.file_id = fs.file_id
GROUP BY df.tablespace_name
)
WHERE pct_used > 80 -- 閾值告警
ORDER BY pct_used DESC;
-- 2. 碎片程度 (字典管理表空間關鍵)
SELECT tablespace_name, COUNT(*) chunks, MAX(bytes)/1024/1024 max_chunk_mb
FROM dba_free_space
GROUP BY tablespace_name
HAVING COUNT(*) > 100; -- 經驗值:平均每文件 >100 碎片需整理
-- 合並相鄰自由區 (LMT 推薦)
ALTER TABLESPACE users COALESCE;
-- 驗證效果
-- 再次運行上述碎片查詢,觀察 chunks 減少、max_chunk 增大
-- 若無效且嚴重影響性能 → 重建表空間 (Exp/Imp 或 CTAS)
-- 方案 A: 擴展現有數據文件 (需文件系統空間)
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/orcl/users01.dbf' RESIZE 5G;
-- 或啟用自動擴展
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/orcl/users01.dbf' AUTOEXTEND ON NEXT 100M MAXSIZE 10G;
-- 方案 B: 添加新數據文件 (跨磁盤分佈 I/O)
ALTER TABLESPACE users ADD DATAFILE '/u02/oradata/orcl/users02.dbf' SIZE 1G AUTOEXTEND ON NEXT 100M MAXSIZE 5G;
-- 臨時段使用情況
SELECT tablespace_name,
ROUND(bytes_used/1024/1024,2) used_mb,
ROUND(bytes_free/1024/1024,2) free_mb
FROM v$temp_space_header;
-- 活躍排序操作
SELECT s.username, u.tablespace, u.segtype, u.blocks*8192/1024/1024 mb
FROM v$sort_usage u, v$session s
WHERE u.session_addr = s.saddr
ORDER BY mb DESC;
| 作業 | 頻率 | 關鍵動作 |
|---|---|---|
| 告警日誌掃描 | 每 5-15 分鐘 | 關鍵字匹配 → 告警推送 |
| 表空間使用率檢查 | 每小時 | >80% 告警,>90% 自動擴容/工單 |
| 碎片度掃描 | 每日 | Chunks > 閾值 → COALESCE |
| 失效索引檢查 | 每周 | STATUS != 'VALID' → REBUILD ONLINE |
| 統計信息收集 | 每日窗口 | DBMS_STATS.GATHER_DATABASE_STATS (Auto Task 默認啟用) |
| 備份檢查 | 每日 | RMAN LIST BACKUP / VALIDATE BACKUPSET |
總結: 日常維護的核心是可觀測性 + 自動化響應。將告警日誌關鍵字與表空間指標納入監控平台 (Zabbix/Prometheus/CloudWatch),建立「檢測-告警-自愈/工單」閉環,將 DBA 從人工巡檢中解放,專注架構優化與疑難雜症攻關。