資料庫備份是 DBA 核心職責。自動化備份腳本配合排程器,可確保零人工干預下的持續保護。本文提供 Linux Shell 與 Windows Batch 兩套生產級備份腳本模板,涵蓋完整導出、壓縮、清理、日誌記錄等關鍵環節。
oracle_exp_full.sh#!/bin/bash
# ==========================================
# Oracle 全量導出備份腳本 (Linux)
# 作者: DBA Team
# 版本: 1.2
# ==========================================
# --- 環境變數載入 ---
source /home/oracle/.bash_profile
# --- 參數設定 ---
BACKUP_DIR="/home/oracle/backup"
LOG_DIR="/home/oracle/logs"
DATE_TAG=$(date +%Y%m%d_%H%M%S)
DUMP_FILE="${BACKUP_DIR}/full_exp_${DATE_TAG}.dmp"
LOG_FILE="${LOG_DIR}/exp_full_${DATE_TAG}.log"
ZIP_FILE="${BACKUP_DIR}/full_exp_${DATE_TAG}.dmp.gz"
RETENTION_DAYS=7 # 本地保留天數
ORACLE_SID="ORCL"
EXP_USER="system/manager" # 建議使用專用備份帳號,具 EXP_FULL_DATABASE 權限
# --- 建立目錄 ---
mkdir -p "${BACKUP_DIR}" "${LOG_DIR}"
# --- 開始備份 ---
echo "=== $(date) 開始全量導出 ===" | tee -a "${LOG_FILE}"
exp ${EXP_USER}@${ORACLE_SID} \
FULL=Y \
FILE=${DUMP_FILE} \
LOG=${LOG_FILE} \
COMPRESS=Y \
STATISTICS=NONE \
CONSISTENT=Y \
BUFFER=10485760
EXP_STATUS=$?
if [ ${EXP_STATUS} -eq 0 ]; then
echo "=== $(date) 導出成功,開始壓縮 ===" | tee -a "${LOG_FILE}"
gzip -f "${DUMP_FILE}"
if [ $? -eq 0 ]; then
echo "=== $(date) 壓縮完成:${ZIP_FILE} ===" | tee -a "${LOG_FILE}"
else
echo "!!! $(date) 壓縮失敗 ===" | tee -a "${LOG_FILE}"
fi
else
echo "!!! $(date) 導出失敗,退出碼:${EXP_STATUS} ===" | tee -a "${LOG_FILE}"
fi
# --- 清理舊備份 ---
echo "=== $(date) 清理 ${RETENTION_DAYS} 天前備份 ===" | tee -a "${LOG_FILE}"
find "${BACKUP_DIR}" -name "full_exp_*.dmp.gz" -mtime +${RETENTION_DAYS} -delete
find "${LOG_DIR}" -name "exp_full_*.log" -mtime +${RETENTION_DAYS} -delete
echo "=== $(date) 備份作業結束 ===" | tee -a "${LOG_FILE}"
exit ${EXP_STATUS}
| 參數 | 建議值 | 說明 |
|---|---|---|
| FULL=Y | Y | 全資料庫導出(需 EXP_FULL_DATABASE) |
| CONSISTENT=Y | Y | 確保交易一致性時間點,避免鎖表影響業務 |
| BUFFER | 10485760 (10MB) | 增加緩衝區減少 I/O 往返 |
| COMPRESS=Y | Y | 導出時壓縮區塊(注意:匯入時會嘗試一次分配初始區塊大小) |
| STATISTICS=NONE | NONE | 不導出統計資訊,加快速度,匯入後重新收集 |
# 每天凌晨 02:00 執行全量備份
0 2 * * * /home/oracle/scripts/oracle_exp_full.sh >> /home/oracle/logs/cron_exp.log 2>&1
# 每小時增量備份(需配合 RMAN 或 Data Pump)
# 0 * * * * /home/oracle/scripts/rman_incr.sh
expData.bat@echo off
REM ==========================================
REM Oracle 使用者模式導出備份腳本 (Windows)
REM ==========================================
SET ORACLE_SID=ORCL
SET ORACLE_HOME=D:\app\oracle\product\11.2.0\dbhome_1
SET PATH=%ORACLE_HOME%\bin;%PATH%
SET NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
SET BACKUP_DIR=D:\Oracle_Backup
SET LOG_DIR=D:\Oracle_Backup\Logs
SET WINRAR_PATH="C:\Program Files\WinRAR\WinRAR.exe"
SET DATE_TAG=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%_%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
SET DATE_TAG=%DATE_TAG: =0%
REM 建立目錄
IF NOT EXIST "%BACKUP_DIR%" MKDIR "%BACKUP_DIR%"
IF NOT EXIST "%LOG_DIR%" MKDIR "%LOG_DIR%"
REM 導出各 Schema(按業務模組分檔,利於單表/單 Schema 恢復)
echo === %DATE% %TIME% 開始導出 === >> "%LOG_DIR%\exp_%DATE_TAG%.log"
exp system/manager@%ORACLE_SID% FILE=%BACKUP_DIR%\tne_%DATE_TAG%.dmp OWNER=TNE LOG=%LOG_DIR%\exp_tne_%DATE_TAG%.log
exp system/manager@%ORACLE_SID% FILE=%BACKUP_DIR%\prt_%DATE_TAG%.dmp OWNER=PRT LOG=%LOG_DIR%\exp_prt_%DATE_TAG%.log
exp system/manager@%ORACLE_SID% FILE=%BACKUP_DIR%\sec_%DATE_TAG%.dmp OWNER=SEC LOG=%LOG_DIR%\exp_sec_%DATE_TAG%.log
exp system/manager@%ORACLE_SID% FILE=%BACKUP_DIR%\tea_%DATE_TAG%.dmp OWNER=TEA LOG=%LOG_DIR%\exp_tea_%DATE_TAG%.log
exp system/manager@%ORACLE_SID% FILE=%BACKUP_DIR%\pic_%DATE_TAG%.dmp OWNER=PIC LOG=%LOG_DIR%\exp_pic_%DATE_TAG%.log
exp system/manager@%ORACLE_SID% FILE=%BACKUP_DIR%\sys_%DATE_TAG%.dmp OWNER=SYSTEM LOG=%LOG_DIR%\exp_sys_%DATE_TAG%.log
REM 壓縮打包
echo === %DATE% %TIME% 開始壓縮 === >> "%LOG_DIR%\exp_%DATE_TAG%.log"
%WINRAR_PATH% a -ep1 -df -r "%BACKUP_DIR%\FullBackup_%DATE_TAG%.rar" "%BACKUP_DIR%\*_%DATE_TAG%.dmp"
REM 清理原始 DMP
IF EXIST "%BACKUP_DIR%\FullBackup_%DATE_TAG%.rar" (
DEL "%BACKUP_DIR%\*_%DATE_TAG%.dmp"
echo === %DATE% %TIME% 壓縮完成,原始 DMP 已刪除 === >> "%LOG_DIR%\exp_%DATE_TAG%.log"
) ELSE (
echo !!! %DATE% %TIME% 壓縮失敗,保留原始 DMP !!! >> "%LOG_DIR%\exp_%DATE_TAG%.log"
)
REM 清理 7 天前備份
FORFILES /P "%BACKUP_DIR%" /M "FullBackup_*.rar" /D -7 /C "CMD /C DEL @FILE"
FORFILES /P "%LOG_DIR%" /M "exp_*.log" /D -7 /C "CMD /C DEL @FILE"
echo === %DATE% %TIME% 備份作業結束 === >> "%LOG_DIR%\exp_%DATE_TAG%.log"
%DATE:~0,4% 等切片語法依賴系統區域設定(yyyy/MM/dd 或 yyyy-MM-dd),建議改用 wmic os get localdatetime 取得標準格式,或使用 PowerShell 替代。%DATE:~4,10% 假設格式為 Wed 2024/01/15,實際部署必須驗證。cmd.exe,參數 /c D:\Scripts\expData.bat。傳統 EXP/IMP 已被 Oracle 標記為 Deprecated(11g 起),生產環境強烈建議遷移至:
# Linux
expdp system/manager@ORCL \
DIRECTORY=DP_DIR \
DUMPFILE=full_%DATE_TAG%.dmp \
LOGFILE=expdp_full_%DATE_TAG%.log \
FULL=Y PARALLEL=4 COMPRESSION=ALL
md5sum / WinRAR -t 完整性測試。