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

Linux 下 Oracle 自動物理備份 Shell 腳本實戰:冷備份、壓縮、參數備份一體化

     編輯:Oracle 資料庫相關知識

設計目標

單一 Shell 腳本 begin.sh 執行完整冷備份流程:

  1. 關閉資料庫
  2. 複製資料檔/控制檔/Redo Log 至備份目錄
  3. 啟動資料庫
  4. 壓縮打包並附加時間戳
  5. 同步備份參數檔與關鍵中繼資料

核心腳本模組

1. database.script:SQL*Plus 產生中繼資料與複製指令

SPOOL database.parm
SELECT * FROM v$parameter;        -- 系統參數
SELECT * FROM props$;             -- 字符集參數
SELECT * FROM v$datafile;         -- 資料檔路徑
SELECT * FROM v$controlfile;      -- 控制檔路徑
SELECT * FROM v$logfile;          -- Redo Log 路徑
SPOOL OFF

SPOOL backup.sh
SELECT 'cp '||name||' backup/' FROM v$datafile;
SELECT 'cp '||name||' backup/' FROM v$controlfile;
SELECT 'cp '||member||' backup/' FROM v$logfile;
SPOOL OFF

SHUTDOWN IMMEDIATE
EXIT

2. alterbackup.sh:淨化並執行複製指令

#!/bin/bash
echo "提取 cp 指令並執行複製..."
cat backup.sh | grep '^cp /' > c.sh
rm backup.sh
mv c.sh backup.sh
chmod +x backup.sh
. ./backup.sh    # 注意:點號+空格+腳本,在當前 Shell 執行

# 追加參數檔備份 (依實際路徑調整)
cp /u01/app/oracle/admin/orcl/pfile/initorcl.ora backup/initorcl.ora

3. startup.script:啟動資料庫並記錄狀態

SPOOL StartStatus.readme
STARTUP
SPOOL OFF
EXIT

4. gzip.sh:打包壓縮並清理

#!/bin/bash
echo "開始壓縮備份檔案..."
thedate=`date +%Y.%m.%d.%H.%M`   # 反引號非單引號
outfile=$thedate
tar -cvf backup${outfile}.tar backup/
gzip backup${outfile}.tar
rm -rf backup/
echo "完成:backup${outfile}.tar.gz"

5. begin.sh:總控腳本

#!/bin/bash
echo "=== Oracle 自動物理備份啟動 ==="
mkdir -p backup
sqlplus internal/oracle @database.script
. ./alterbackup.sh
sqlplus internal/oracle @startup.script
. ./gzip.sh
echo "=== 備份完成,產出:backup_YYYY.MM.DD.HH.MM.tar.gz ==="

部署與執行步驟

  1. 以 Oracle 用戶登入 Linux
  2. 建立上述 5 個腳本檔案於同一目錄
  3. 賦予執行權:chmod +x alterbackup.sh gzip.sh begin.sh
  4. 檢查目錄:ls -l 應見 5 腳本
  5. 執行:. ./begin.sh (點號+空格,當前 Shell 環境)
  6. 驗證產出:backup_2024.01.15.02.30.tar.gz
  7. 加入 Crontab 定時執行:0 2 * * * /path/to/begin.sh >> /var/log/oracle_backup.log 2>&1

關鍵技術細節

  • SPOOL backup.sh 利用 SQL*Plus 動態產生 OS 複製指令,避免硬編碼檔案路徑
  • grep '^cp /' 過濾掉 SQL*Plus 回顯的標題/提示行,只保留真實複製指令
  • . ./backup.sh (source) 在當前 Shell 執行,確保 cp 實際生效 (子 Shell 無法影響父 Shell 環境,但這裡只執行命令無環境變更問題)
  • date +%Y.%m.%d.%H.%M **反引號** 取命令輸出,非單引號
  • 參數檔路徑可能為符號連結,需 ls -l 追蹤真實路徑 (如 /u01/app/oracle/admin/orcl/pfile/initorcl.ora)

優化與擴展方向

避坑指南

  • **磁碟空間**:冷備份需 **2x 資料庫大小** 暫存空間 (原檔 + 複製檔 + 壓縮包),規劃足夠 /backup 分區
  • **權限**:腳本執行用戶需為 Oracle 軟體擁有者 (通常 oracle),具備讀取資料檔/寫入備份目錄權限
  • **SHUTDOWN IMMEDIATE 卡住**:長交易 Rollback 導致關閉緩慢,腳本無超時機制,建議加入 timeout 或預檢 V$TRANSACTION
  • **符號連結陷阱**:參數檔/資料檔可能為連結,cp 預設複製連結檔而非目標,需加 -L 或 readlink -f 解析

這套 Shell 腳本體系雖屬「冷備份經典模式」,但完整展示了**「SQL 動態生成 OS 指令 → Shell 執行 → 參數同步 → 時間戳壓縮」**的自動化精髓。理解其機制,遷移至 RMAN/熱備份/雲備份時才能游刃有餘。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方向實作建議
熱備份 (無停機)表空間 BEGIN/END BACKUP + 複製 + 歸檔日誌複製,需 Archive Log 模式
RMAN 整合替換 cp/tar/gzip 為 rman target / @backup.rman,支援增量/壓縮/加密/目錄
異地傳輸備份完成後 scp/rsync 至備援機房,驗證檔案完整性 (md5sum)
監控告警腳本返回碼非 0 發送郵件/簡訊,日誌集中化 (ELK/Splunk)
參數檔自動發現find $ORACLE_HOME -name 'init*.ora' -type f | head -1 動態定位