首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 資料庫日常維護實戰手冊:表空間、會話、死鎖、參數檔、備份策略

     編輯:Oracle 資料庫基礎

前言

資料庫穩定運行依賴系統化的日常維護。本手冊涵蓋表空間監控、會話管理、死鎖排查、SPFILE/PFILE 管理、備份恢復策略五大核心維護領域,提供標準化操作流程與 SQL 腳本。

一、表空間監控與擴容

1.1 關鍵監控指標

  • 使用率 > 85%:觸發告警,規劃擴容
  • 使用率 > 95%:緊急擴容,防止業務中斷
  • 自動擴展 (AUTOEXTEND) 狀態檢查
  • 碎片程度 (可用空間 vs 最大連續空間)

1.2 監控查詢腳本

-- 表空間使用率總覽
SELECT tablespace_name,
       ROUND(total_mb, 2) total_mb,
       ROUND(used_mb, 2) used_mb,
       ROUND(free_mb, 2) free_mb,
       ROUND(pct_used, 2) pct_used,
       autoextensible
FROM (
    SELECT df.tablespace_name,
           SUM(df.bytes)/1024/1024 total_mb,
           SUM(df.bytes)/1024/1024 - NVL(SUM(fs.bytes)/1024/1024, 0) used_mb,
           NVL(SUM(fs.bytes)/1024/1024, 0) free_mb,
           ROUND((1 - NVL(SUM(fs.bytes)/SUM(df.bytes), 0)) * 100, 2) pct_used,
           MAX(df.autoextensible) autoextensible
    FROM dba_data_files df
    LEFT JOIN dba_free_space fs ON df.file_id = fs.file_id
    GROUP BY df.tablespace_name
)
ORDER BY pct_used DESC;

1.3 擴容操作 (Enterprise Manager / SQL)

方法一:Enterprise Manager 圖形化操作

  1. 進入「儲存」→「表空間」→ 點選目標表空間
  2. 「編輯」→「新增資料檔」
  3. 關鍵:目錄路徑需與現有資料檔一致 (避免誤放本地磁碟導致切換失效)
  4. 設定檔案大小、啟用 AUTOEXTEND、MAXSIZE
  5. 「顯示 SQL」取得 DDL,以 SYSDBA 執行或直接套用

方法二:SQL 直接執行

-- 新增單一資料檔
ALTER TABLESPACE ccatsdialindex 
ADD DATAFILE 'd:\ccatsdb\ccatsindex\ccatsdialindex02.dbf' SIZE 500M
AUTOEXTEND ON NEXT 100M MAXSIZE 2G;

-- 批次新增多檔案
ALTER TABLESPACE ccatsdialindex 
ADD DATAFILE 
  'd:\ccatsdb\ccatsindex\ccatsdialindex03.dbf' SIZE 500M,
  'd:\ccatsdb\ccatsindex\ccatsdialindex04.dbf' SIZE 500M;

二、會話監控與資源管理

2.1 檢視所有會話

SELECT s.sid, s.serial#, s.username, s.osuser, s.machine, 
       s.program, s.module, s.action, s.logon_time, s.status,
       s.sql_id, s.prev_sql_id
FROM v$session s
WHERE s.type = 'USER'
ORDER BY s.logon_time;

2.2 Top 10 資源消耗會話

-- CPU 消耗
SELECT * FROM (
    SELECT s.sid, s.serial#, s.username, s.sql_id,
           ss.value/100 cpu_seconds
    FROM v$session s, v$sesstat ss, v$statname sn
    WHERE s.sid = ss.sid AND ss.statistic# = sn.statistic#
      AND sn.name = 'CPU used by this session'
    ORDER BY ss.value DESC
) WHERE ROWNUM <= 10;

-- 邏輯讀 (Buffer Gets)
SELECT * FROM (
    SELECT s.sid, s.serial#, s.username, s.sql_id,
           ss.value buffer_gets
    FROM v$session s, v$sesstat ss, v$statname sn
    WHERE s.sid = ss.sid AND ss.statistic# = sn.statistic#
      AND sn.name = 'session logical reads'
    ORDER BY ss.value DESC
) WHERE ROWNUM <= 10;

2.3 長時間執行 SQL 識別

SELECT s.sid, s.serial#, s.username, s.sql_id,
       sq.elapsed_time/1e6 elapsed_sec,
       sq.executions, sq.buffer_gets,
       SUBSTR(sq.sql_text, 1, 100) sql_text
FROM v$session s, v$sql sq
WHERE s.sql_id = sq.sql_id
  AND s.status = 'ACTIVE'
  AND sq.elapsed_time > 60e6  -- 超過 60 秒
ORDER BY sq.elapsed_time DESC;

三、死鎖偵測與解除

3.1 鎖等待鏈查詢

-- 完整阻塞鏈
SELECT blocking_session, sid, serial#, username, 
       sql_id, event, seconds_in_wait
FROM v$session
WHERE blocking_session IS NOT NULL
ORDER BY blocking_session, seconds_in_wait DESC;

-- 物件級鎖詳情
SELECT lo.session_id, lo.oracle_username, lo.os_user_name,
       lo.locked_mode, o.object_name, o.object_type
FROM v$locked_object lo, dba_objects o
WHERE lo.object_id = o.object_id
ORDER BY lo.session_id;

3.2 鎖模式對照表

LOCKED_MODE模式名稱含義
0None無鎖
1Null (NULL)無實際限制
2Row-S (SS)列共享
3Row-X (SX)列排他 (SELECT FOR UPDATE / UPDATE / DELETE)
4Share (S)共享 (CREATE INDEX)
5S/Row-X (SSX)共享列排他
6Exclusive (X)排他 (DDL / DROP TABLE)

3.3 解除死鎖標準流程

  1. 確認被鎖物件:SELECT * FROM dba_objects WHERE object_id =
  2. 定位阻塞 Session:SELECT sid, serial#, username, machine FROM v$session WHERE sid =
  3. 評估影響:檢查 SQL_TEXT、執行時間、業務重要性
  4. 殺除 Session:
    ALTER SYSTEM KILL SESSION ',' [IMMEDIATE];
  5. 驗證釋放:重新查詢 v$locked_object 確認鎖釋放

3.4 Enterprise Manager 圖形化解除

  1. 「效能」→「鎖」→ 查看鎖樹狀圖
  2. 右鍵阻塞 Session →「中斷會話」→ 確認

四、SPFILE / PFILE 參數檔管理

4.1 兩種參數檔對比

特性PFILE (文字)SPFILE (二進位)
格式文字 (可用編輯器修改)二進位 (不可直接編輯)
修改生效需重啟ALTER SYSTEM 即時生效
持久化手動維護自動持久化
預設名稱init.oraspfile.ora
預設路徑$ORACLE_HOME/dbs (Unix) / database (Win)同左
啟動優先序低高 (SPFILE 優先)

4.2 互轉操作

-- PFILE → SPFILE (需以 PFILE 啟動)
CREATE SPFILE FROM PFILE;
CREATE SPFILE='/custom/path/spfileORCL.ora' FROM PFILE='/custom/path/initORCL.ora';

-- SPFILE → PFILE (備份/遷移/審計)
CREATE PFILE FROM SPFILE;
CREATE PFILE='/backup/initORCL.ora' FROM SPFILE;

4.3 關鍵參數說明與建議值

參數說明建議值範圍修改方式
db_cache_size標準區塊緩衝區大小≥ 16M,通常 SGA 30-50%ALTER SYSTEM SET db_cache_size=500M SCOPE=BOTH;
shared_pool_size共享池 (SQL/PLAN/字典)64位: 64M+,32位: 16M+ALTER SYSTEM SET shared_pool_size=200M SCOPE=BOTH;
large_pool_size大型池 (並行/備份/RMAN)0 (自動) 或 16M-20G需 SCOPE=SPFILE 重啟
java_pool_sizeJava 池0 (無 Java) 或 24M+需重啟
pga_aggregate_targetPGA 總目標 (排序/雜湊/位圖)≥ 10M,通常記憶體 20-30%ALTER SYSTEM SET pga_aggregate_target=1G SCOPE=BOTH;
sga_target / memory_target自動記憶體管理 (10g/11g+)啟用後子池自動調整SCOPE=BOTH

4.4 動態修改 vs 靜態修改

-- 即時生效 + 持久化 (SPFILE)
ALTER SYSTEM SET parameter=value SCOPE=BOTH;

-- 僅即時生效 (重啟失效)
ALTER SYSTEM SET parameter=value SCOPE=MEMORY;

-- 僅持久化 (重啟生效)
ALTER SYSTEM SET parameter=value SCOPE=SPFILE;

五、資料庫備份策略

5.1 備份分類矩陣

維度分類特點
邏輯/物理邏輯備份 (EXP/IMP/EXPDP/IMPDP)跨版本/平台、物件級、較慢
物理備份 (OS Copy / RMAN)區塊級、快速、需同版本恢復
線上/離線冷備份 (離線)關閉資料庫、一致性最佳、需停機
熱備份 (線上)ARCHIVELOG 模式、業務不中斷、點對點恢復
工具EXP/IMP、OS Copy、RMAN、第三方 (Veritas/NetBackup)RMAN 為原生首選

5.2 作業系統冷備份 (離線)

# 1. 正常關閉資料庫
SHUTDOWN IMMEDIATE;

# 2. 複製所有關鍵檔案 (腳本化)
cp $ORACLE_HOME/dbs/orapw* /backup/control/
cp $ORACLE_HOME/dbs/spfile*.ora /backup/control/
cp $ORACLE_BASE/oradata/ORCL/*.dbf /backup/datafiles/
cp $ORACLE_BASE/oradata/ORCL/*.log /backup/redolog/
cp $ORACLE_BASE/oradata/ORCL/control*.ctl /backup/control/

# 3. 啟動資料庫
STARTUP;

5.3 作業系統熱備份 (線上,需 ARCHIVELOG)

# 單表空間熱備份流程
ALTER TABLESPACE users BEGIN BACKUP;
# OS 複製該表空間所有 .dbf 檔案
cp /u01/app/oracle/oradata/ORCL/users01.dbf /backup/hot/users01.dbf
ALTER TABLESPACE users END BACKUP;

# 控制檔備份 (二進位)
ALTER DATABASE BACKUP CONTROLFILE TO '/backup/control/control01.ctl';

# 控制檔備份 (文字,可編輯)
ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS '/backup/control/control_trace.sql';

5.4 RMAN 備份 (推薦標準)

優勢

  • 區塊級增量備份 (BLOCK CHANGE TRACKING)
  • 並行備份/恢復
  • 壓縮備份集
  • 區塊校驗 (防止壞塊)
  • 目錄管理 (RCAT) 支援多資料庫

RMAN 目錄建立流程

-- 1. 建立獨立表空間
CREATE TABLESPACE rman_ts DATAFILE '/u01/oradata/RCAT/rman_ts01.dbf' SIZE 100M AUTOEXTEND ON;

-- 2. 建立目錄擁有者
CREATE USER rman IDENTIFIED BY rman DEFAULT TABLESPACE rman_ts TEMPORARY TABLESPACE temp;
GRANT CONNECT, RESOURCE, RECOVERY_CATALOG_OWNER TO rman;

-- 3. 啟動 RMAN 並建立目錄
$ rman
RMAN> CONNECT CATALOG rman/rman@rcat_db;
RMAN> CREATE CATALOG TABLESPACE rman_ts;

-- 4. 註冊目標資料庫
RMAN> CONNECT TARGET sys/oracle@target_db;
RMAN> REGISTER DATABASE;

常用 RMAN 指令

# 完整備份 (含控制檔、SPFILE)
BACKUP DATABASE PLUS ARCHIVELOG;

# 增量備份 (Level 0 基準 / Level 1 增量)
BACKUP INCREMENTAL LEVEL 0 DATABASE;
BACKUP INCREMENTAL LEVEL 1 DATABASE;

# 累積增量 (Level 1 CUMULATIVE)
BACKUP INCREMENTAL LEVEL 1 CUMULATIVE DATABASE;

# 驗證備份
BACKUP VALIDATE DATABASE;

# 列出備份
LIST BACKUP SUMMARY;
LIST BACKUP OF DATABASE;

5.5 備份排程建議

頻率類型時間窗保留策略
每日增量 Level 1凌晨 01:00-03:00保留 7 天
每週完整 Level 0週日 00:00-04:00保留 4 週
每月完整 + 歸檔月初 00:00保留 12 月
即時歸檔日誌備份每 15-30 分鐘保留 24-48 小時

六、維護檢查清單 (每日/每週/每月)

每日 (自動化腳本 + 告警)

  • [ ] 表空間使用率 < 85%
  • [ ] Archive Log 磁碟空間充足
  • [ ] 備份作業成功 (檢查 RMAN/腳本日誌)
  • [ ] Alert Log 無 ORA- 錯誤
  • [ ] 監聽器狀態正常
  • [ ] 核心資源 (CPU/MEM/DISK) 正常

每週

  • [ ] 統計資訊收集 (DBMS_STATS.GATHER_DATABASE_STATS)
  • [ ] 索引重建評估 (INDEX_USAGE + HEIGHT/BLK_GETS)
  • [ ] 無效物件檢查與編譯 (UTLRP.SQL)
  • [ ] 密碼過期/鎖定帳號審查
  • [ ] AWR/ADDM 報告審閱

每月

  • [ ] 完整備份驗證恢復演練 (測試環境)
  • [ ] 容量規劃 (成長趨勢預測)
  • [ ] 安全稽核 (權限/審計/補丁)
  • [ ] 參數檔備份與版本控管
  • [ ] 文件更新 (拓撲/流程/聯絡人)

結語:維護無小事,標準化流程 + 自動化監控 + 定期演練 = 高可用資料庫。將本手冊轉化為團隊 SOP,建立巡檢儀表板,讓問題在業務感知前被發現並解決。

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