歸檔日誌若不定期清理將佔滿 FRA 或磁碟導致資料庫掛起。本文提供一個可直接部署的 Shell 腳本,搭配 RMAN 刪除過期歸檔與保留最近 3 天歸檔,並記錄日誌供稽核。
#!/bin/sh
# 設定備份根目錄與日期格式
export BACK_DATE=$(date +%Y%m%d)
export BACKUP_PATH=/home/oracle/dbbak
# 建立當日歸檔日誌目錄
mkdir -p ${BACKUP_PATH}/archivelog/${BACK_DATE}
# RMAN 執行刪除
rman msglog=${BACKUP_PATH}/archivelog/${BACK_DATE}/arch_0_${BACK_DATE}.log << EOF
CONNECT TARGET /;
DELETE EXPIRED ARCHIVELOG ALL;
DELETE NOPROMPT ARCHIVELOG UNTIL TIME 'SYSDATE - 3';
EXIT
EOF
clean_archivelog.sh(建議放在 /home/oracle/scripts/)。chmod 755 clean_archivelog.sh。0 2 * * * /home/oracle/scripts/clean_archivelog.sh
| 參數 | 說明 |
|---|---|
DELETE EXPIRED ARCHIVELOG ALL | 刪除控制檔/Recovery Catalog 中標記為 EXPIRED 的歸檔記錄(實體檔可能已手動刪除)。 |
DELETE NOPROMPT ARCHIVELOG UNTIL TIME 'SYSDATE - 3' | 直接刪除 3 天前的歸檔(含實體檔與控制檔記錄),NOPROMPT 避免互動確認。 |
msglog | RMAN 執行日誌輸出路徑,便事後追蹤。 |
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS,清理腳本天數應 ≤ 7 天,避免刪除仍需的歸檔。SELECT * FROM V$RECOVERY_FILE_DEST; 監控 FRA 使用率,超過 85% 發送告警。RMAN> LIST ARCHIVELOG ALL;
-- 確認最早歸檔序號 ≥ SYSDATE-3
SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE FIRST_TIME > SYSDATE-3;
-- 確認資料庫視圖中歸檔記錄同步刪除
部署此腳本並納入排程,即可自動化歸檔清理,避免磁碟爆滿風險。