首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

RMAN 自動化備份實戰:從腳本架構到異地容災部署全攻略

     編輯:Oracle 資料庫相關知識

前言:為何企業級資料庫非 RMAN 不可

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 調用

核心模組深度解析

1. 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 保證檔案名唯一,避免覆寫衝突。

2. scp_rman_db_files.sh:異地傳輸的健壯性保障

  • 預檢:檢查備份檔案存在性、磁碟空間、網路連通性。
  • 斷點續傳:scp 原生不支援,建議改用 rsync -avz --partial。
  • 驗證:傳輸後對比來源/目的端 md5sum,確保位元級一致性。
  • 清理:保留最近 N 份備份(如 7 天),防止備份伺服器磁碟爆滿。

環境變數統一管理:消除「在我機器上能跑」的幻覺

所有腳本引用同一組環境變數檔(如 oracle_env.sh),關鍵變數:

變數含義範例值
ORACLE_HOMEOracle 軟體安裝路徑/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 非互動式登入同樣載入環境。

SSH 無密碼互信與安全強化

  1. 備份伺服器建立專用帳號 oraback,僅擁有 /backup/rman_remote 寫入權限。
  2. 資料庫伺服器生成金鑰對:ssh-keygen -t rsa -b 4096。
  3. 公鑰推送至備份伺服器:ssh-copy-id oraback@dr-server。
  4. 限制命令:在備份伺服器 ~/.ssh/authorized_keys 前綴 command="/home/oraback/validate_rsync.sh",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,僅允許執行驗證腳本,杜絕 SSH 隧道濫用。

排程部署:Cron 表達式與日誌輪轉

# /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+。
  • 備份壓縮:RMAN BACKUP AS COMPRESSED BACKUPSET,CPU 換空間,網傳時間大幅縮減。
  • 加密備份:SET ENCRYPTION ON IDENTIFIED BY password ONLY,滿足合規要求。
  • 備份驗證:定期執行 RESTORE DATABASE VALIDATE,確保備份可用性,而非僅檢查檔案大小。
  • Data Guard 整合:若已部署 Data Guard,優先在 Standby 端備份,零影響生產。

常見坑點與避雷指南

現象根因修正
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。

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