邏輯備份 (EXP) 靈活但大庫慢;物理冷備份 (離線拷貝文件) 最快、最安全、恢復最簡單,卻因流程繁瑣常被忽視。本文提供一套在 Linux (RedHat 7.3 / Oracle 8.1.7) 經測試的全自動 Shell 腳本體系,實現:參數記錄 → 關庫 → 拷貝數據/控制/日誌文件 → 開庫 → 壓縮打包帶時間戳 → 清理臨時文件,單命令執行,支援 crontab 定時調度。
| 腳本文件 | 職責 | 調用關係 |
|---|---|---|
database.script | SQL*Plus 腳本:導出實例參數、字符集、數據文件/控制文件/日誌文件路徑 → database.parm;生成拷貝命令 → backup.sh | 主流程首調 |
alterbackup.sh | 清洗 backup.sh 保留 cp /... 行 → c.sh → 重命名 backup.sh → 賦權執行 | 關庫後執行 |
startup.script | SQL*Plus 腳本:STARTUP 開庫,記錄狀態 → StartStatus.readme | 拷貝完成後 |
gzip.sh | 打包 backup/ 目錄 → backup_YYYY.MM.DD.HH.MM.tar.gz → 刪除原目錄 | 開庫後執行 |
begin.sh | 總控腳本:建目錄 → 串聯上述 4 步 → 輸出完成提示 | 用戶入口 / crontab |
SPOOL database.parm
SELECT * FROM V$PARAMETER;
SELECT * FROM PROPS$;
SELECT * FROM V$DATAFILE;
SELECT * FROM V$CONTROLFILE;
SELECT * FROM V$LOGFILE;
-- 可在此追加其他關鍵信息
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 執行
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
#!/bin/bash
echo "=== Oracle 自動物理冷備份啟動 ==="
mkdir -p backup
sqlplus internal/oracle @database.script
. ./alterbackup.sh
sqlplus internal/oracle @startup.script
. ./gzip.sh
echo "備份完成,請檢查當前目錄下的 backup_*.tar.gz"
參數文件通常在 $ORACLE_HOME/dbs/init 或 $ORACLE_BASE/admin/ (可能為軟連結)。
# 查找真實路徑
find $ORACLE_HOME -name 'init*.ora'
ls -l /u01/app/oracle/product/8.1.7/dbs/initorcl.ora
# 若為軟連結,追踪真實文件
修改 alterbackup.sh 在執行 backup.sh 前手工拷貝:
cp /u01/app/oracle/admin/orcl/pfile/initorcl.ora backup/initorcl.ora
. ./backup.sh
oracle 用戶登入 Linux。/home/oracle/autobackup)。chmod +x alterbackup.sh gzip.sh begin.shls -l 應見 alterbackup.sh begin.sh database.script gzip.sh startup.script. ./begin.sh (點號+空間+腳本,當前 Shell 環境)。backup_YYYY.MM.DD.HH.MM.tar.gz 存在且可解壓;database.parm 含關鍵元數據;StartStatus.readme 顯示正常啟動。crontab:0 2 * * * /home/oracle/autobackup/begin.sh >> /home/oracle/autobackup/backup.log 2>&1 (每日 02:00 自動執行)。backup/ 目錄需容納全庫文件體積,壓縮後釋放;大庫建議掛載獨立備份卷。.bat / PowerShell。database.script 可加 CREATE PFILE FROM SPFILE 導出文本備份。這套腳本將「繁瑣手工冷備份」轉化為「單命令/定時自動」的標準化流程,同時保留 database.parm 關鍵元數據,為災難恢復爭取寶貴時間。實踐證明,在中小型 Oracle 8i/9i Linux 環境中極其可靠。隨著版本演進,建議逐步遷移至 RMAN + FRA + Data Guard 體系,但理解冷備份原理與腳本化思想,始終是 DBA 內功的根基。