單一 Shell 腳本 begin.sh 執行完整冷備份流程:
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
#!/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
SPOOL StartStatus.readme STARTUP SPOOL OFF EXIT
#!/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"
#!/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 ==="
chmod +x alterbackup.sh gzip.sh begin.shls -l 應見 5 腳本. ./begin.sh (點號+空格,當前 Shell 環境)backup_2024.01.15.02.30.tar.gz0 2 * * * /path/to/begin.sh >> /var/log/oracle_backup.log 2>&1SPOOL 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)| 方向 | 實作建議 |
|---|---|
| 熱備份 (無停機) | 表空間 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 動態定位 |