Oracle Recovery Manager (RMAN) 是原生備份恢復工具,支援塊級備份、壓縮、加密、增量備份、並行化等企業級特性。相較使用者自管腳本,RMAN 提供目錄資料庫追蹤、自動控制檔備份、備份驗證、時間點恢復等關鍵能力。本文將從一套經實戰驗證的自動化備份架構切入,詳細拆解腳本分層設計、環境變數管理、SSH 無密碼互信、異地傳輸與排程部署全流程。
採用「總控腳本 + 功能模組腳本」分層模式,核心腳本清單:
| 腳本名稱 | 層級 | 核心職責 | 調用關係 |
|---|---|---|---|
rman_db_all.sh | 總控 | 全庫備份編排:依序調用備份、傳輸模組 | 調用 rman_db.sh、scp_rman_db_files.sh |
rman_db.sh | 功能 | 生成並執行 RMAN 備份指令碼 | 被 rman_db_all.sh 調用 |
scp_rman_db_files.sh | 功能 | 將備份集透過 SCP 推送至異地備份伺服器 | 被 rman_db_all.sh 調用 |
rman_arch_all.sh | 總控 | 歸檔日誌備份編排(高頻,如每 30 分鐘) | 調用 rman_arch.sh、scp_rman_arch_files.sh |
OS_bak_arch.sh | 功能 | OS 層面複製新產生歸檔至暫存目錄 | 被 rman_arch_all.sh 調用 |
scp_rman_arch_files.sh | 功能 | 推送歸檔至異地 | 被 rman_arch_all.sh 調用 |
rman_db.sh:動態生成 RMAN 指令碼,實現備份邏輯與參數解耦# 關鍵邏輯片段
cat > ${SCRIPT_FILE_TARGET}/rman_db_backup_g.sh <<EOF
run {
allocate channel ch1 type disk format '${BACKUP_BASE}/db_%U.bak';
allocate channel ch2 type disk format '${BACKUP_BASE}/db_%U.bak';
backup database plus archivelog;
release channel ch1;
release channel ch2;
}
EOF
rman target / cmdfile=${SCRIPT_FILE_TARGET}/rman_db_backup_g.sh log=${LOG_FILE}
設計亮點:
allocate channel)可透過環境變數調整,適應不同 I/O 頻寬。plus archivelog 確保備份自包含,單一備份集即可完成時間點恢復。%U 保證檔案名唯一,避免覆寫衝突。scp_rman_db_files.sh:異地傳輸的健壯性保障scp 原生不支援,建議改用 rsync -avz --partial。md5sum,確保位元級一致性。所有腳本引用同一組環境變數檔(如 oracle_env.sh),關鍵變數:
| 變數 | 含義 | 範例值 |
|---|---|---|
ORACLE_HOME | Oracle 軟體安裝路徑 | /u01/app/oracle/product/19.0.0/dbhome_1 |
ORACLE_SID | 資料庫實例名 | PROD |
BACKUP_BASE | 本地備份暫存目錄 | /backup/rman |
BACKUP_SERVER_TARGET | 異地備份伺服器目標目錄 | oraback@dr-server:/backup/rman_remote |
SCRIPT_FILE_TARGET | 腳本與生成的 RMAN 指令碼存放目錄 | /home/oracle/scripts |
LOG_CHECKPOINT_TIMEOUT | 檢查點超時(秒),控制歸檔產生頻率 | 1800 (30 分鐘) |
關鍵技巧:腳本開頭 source ${SCRIPT_FILE_TARGET}/oracle_env.sh,確保 cron、SSH 非互動式登入同樣載入環境。
oraback,僅擁有 /backup/rman_remote 寫入權限。ssh-keygen -t rsa -b 4096。ssh-copy-id oraback@dr-server。~/.ssh/authorized_keys 前綴 command="/home/oraback/validate_rsync.sh",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,僅允許執行驗證腳本,杜絕 SSH 隧道濫用。# /var/spool/cron/oracle
# 每日 01:10 全庫備份
10 1 * * * /home/oracle/scripts/rman_db_all.sh > /home/oracle/logs/rman_db_all_$(date +\%Y\%m\%d).log 2>&1
# 每 30 分鐘歸檔備份
*/30 * * * * /home/oracle/scripts/rman_arch_all.sh > /home/oracle/logs/rman_arch_$(date +\%Y\%m\%d_\%H\%M).log 2>&1
搭配 logrotate 保留 30 天日誌,自動壓縮舊檔。
ALTER DATABASE ENABLE BLOCK CHANGE TRACKING,增量備份僅讀取變更區塊,速度提升 10x+。BACKUP AS COMPRESSED BACKUPSET,CPU 換空間,網傳時間大幅縮減。SET ENCRYPTION ON IDENTIFIED BY password ONLY,滿足合規要求。RESTORE DATABASE VALIDATE,確保備份可用性,而非僅檢查檔案大小。| 現象 | 根因 | 修正 |
|---|---|---|
| RMAN-06054: media recovery requesting unknown archived log | 歸檔缺口,備份未包含所需歸檔 | 全庫備份加 PLUS ARCHIVELOG;歸檔備份頻率 < RPO |
| SCP 傳輸中斷,備份集不完整 | 網路抖動,無斷點續傳 | 改用 rsync --partial --append-verify |
| 備份伺服器磁碟寫滿 | 無保留策略 | 腳本加入 find -mtime +7 -delete;監控磁碟使用率告警 |
| Cron 不執行,無日誌 | 環境變數未載入、路徑錯誤 | 腳本開頭 source /home/oracle/.bash_profile;使用絕對路徑 |
一套生產級 RMAN 自動化備份體系,核心在於:模組化腳本架構、環境變數集中化、異地傳輸健壯化、排程與日誌規範化、定期演練恢復。唯有將「備份」轉化為「可驗證、可恢復、可審計」的持續交付流程,才能在災難降臨時贏回寶貴的 RTO/RPO。