首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 資料庫 Linux 與 Windows 自動備份腳本完整指南

     編輯:Oracle 資料庫基礎

前言

資料庫備份是 DBA 核心職責。自動化備份腳本配合排程器,可確保零人工干預下的持續保護。本文提供 Linux Shell 與 Windows Batch 兩套生產級備份腳本模板,涵蓋完整導出、壓縮、清理、日誌記錄等關鍵環節。


一、Linux 平台:Shell 腳本 + Cron 排程

1.1 核心備份腳本 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}

1.2 關鍵參數說明

參數建議值說明
FULL=YY全資料庫導出(需 EXP_FULL_DATABASE)
CONSISTENT=YY確保交易一致性時間點,避免鎖表影響業務
BUFFER10485760 (10MB)增加緩衝區減少 I/O 往返
COMPRESS=YY導出時壓縮區塊(注意:匯入時會嘗試一次分配初始區塊大小)
STATISTICS=NONENONE不導出統計資訊,加快速度,匯入後重新收集

1.3 Cron 排程範例

# 每天凌晨 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

二、Windows 平台:Batch 腳本 + 任務排程器

2.1 核心備份腳本 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"

2.2 日期時間變數處理細節

  • %DATE:~0,4% 等切片語法依賴系統區域設定(yyyy/MM/dd 或 yyyy-MM-dd),建議改用 wmic os get localdatetime 取得標準格式,或使用 PowerShell 替代。
  • 範例中 %DATE:~4,10% 假設格式為 Wed 2024/01/15,實際部署必須驗證。

2.3 任務排程器設定

  1. 開啟「任務排程器」→「建立基本工作」。
  2. 觸發器:每日,凌晨 02:00。
  3. 動作:啟動程式 cmd.exe,參數 /c D:\Scripts\expData.bat。
  4. 勾選「使用最高權限執行」,設定「無論使用者是否登入都要執行」。

三、進階建議:邁向 RMAN / Data Pump

傳統 EXP/IMP 已被 Oracle 標記為 Deprecated(11g 起),生產環境強烈建議遷移至:

  • RMAN:區塊級增量備份、壓縮、加密、備份驗證、時間點恢復 (PITR)。
  • Data Pump (EXPDP/IMPDP):並行導出/導入、網路模式、可過濾物件、效能遠優於 EXP。

Data Pump 簡易範例

# 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

四、備份驗證與災難演練

  1. 定期恢復演練:每季至少一次完整恢復測試,驗證 RTO/RPO。
  2. 校驗和檢查:備份完成後對壓縮包執行 md5sum / WinRAR -t 完整性測試。
  3. 異地備份:將備份檔同步至異地存儲(NFS、S3、Azure Blob、專線傳輸)。
  4. 監控告警:腳本回傳非 0 碼時發送郵件/簡訊/企業微信告警。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved