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

Windows 環境下 Oracle 自動備份實作:批次檔 + 任務排程器完整方案

     編輯:Oracle 資料庫基礎

方案架構:三層自動化體系

利用 Windows 內建任務排程器觸發批次檔,呼叫 Oracle EXP 工具實現無人值守備份,零成本、零第三方依賴。

核心組件實作

1. 備份批次檔

@ECHO OFF
REM ==========================================
REM Oracle 自動備份腳本 - backup_oracle.bat
REM ==========================================

SET ORACLE_SID=ORCL
SET ORACLE_HOME=D:\app\oracle\product\11.2.0\dbhome_1
SET PATH=%ORACLE_HOME%\BIN;%PATH%

REM 日期時間格式化 (YYYYMMDD_HHMMSS)
FOR /F "TOKENS=1-3 DELIMS=/ " %%A IN ('DATE /T') DO SET YYYYMMDD=%%C%%A%%B
FOR /F "TOKENS=1-2 DELIMS=: " %%A IN ('TIME /T') DO SET HHMM=%%A%%B
SET TIMESTAMP=%YYYYMMDD%_%HHMM%

REM 備份目錄
SET BACKUP_DIR=D:\OracleBackup
IF NOT EXIST %BACKUP_DIR% MKDIR %BACKUP_DIR%

REM 執行 EXP 完整備份
exp system/your_password@ORCL ^
  FILE=%BACKUP_DIR%\FULL_%TIMESTAMP%.dmp ^
  FULL=Y ^
  LOG=%BACKUP_DIR%\FULL_%TIMESTAMP%.log ^
  COMPRESS=Y ^
  CONSISTENT=Y ^
  BUFFER=65536

REM 驗證備份結果
IF %ERRORLEVEL% NEQ 0 (
  ECHO [ERROR] EXP 失敗,錯誤代碼: %ERRORLEVEL% >> %BACKUP_DIR%\backup_error.log
  ECHO %DATE% %TIME% >> %BACKUP_DIR%\backup_error.log
  EXIT /B 1
) ELSE (
  ECHO [SUCCESS] 備份完成: FULL_%TIMESTAMP%.dmp >> %BACKUP_DIR%\backup_history.log
  ECHO %DATE% %TIME% >> %BACKUP_DIR%\backup_history.log
)

REM 可選:清理 30 天前備份
FORFILES /P %BACKUP_DIR% /M FULL_*.dmp /D -30 /C "CMD /C DEL @PATH"
FORFILES /P %BACKUP_DIR% /M FULL_*.log /D -30 /C "CMD /C DEL @PATH"

2. 進階版:分級備份策略腳本

@ECHO OFF
REM ==========================================
REM 分級備份策略 - backup_tiered.bat
REM ==========================================

SET ORACLE_SID=ORCL
SET BACKUP_BASE=D:\OracleBackup
SET DATE_STAMP=%DATE:~10,4%%DATE:~4,2%%DATE:~7,2%
SET WEEK_DAY=%DATE:~0,3%

REM 判斷備份層級
IF "%WEEK_DAY%"=="Sun" (
  SET TIER=LEVEL0
  SET OPTIONS=FULL=Y
) ELSE IF "%DATE:~-2%"=="01" (
  SET TIER=MONTHLY
  SET OPTIONS=FULL=Y
) ELSE (
  SET TIER=DAILY
  SET OPTIONS=OWNER=SCOTT,HR TABLES=... QUERY=...
)

exp system/pwd@ORCL ^
  FILE=%BACKUP_BASE%\%TIER%\%TIER%_%DATE_STAMP%.dmp ^
  %OPTIONS% ^
  LOG=%BACKUP_BASE%\%TIER%\%TIER%_%DATE_STAMP%.log

3. 參數檔模式 (避免密碼明文)

REM exp.par (需設定檔案權限僅管理員可讀)
USERID='/ AS SYSDBA'
FILE=D:\OracleBackup\FULL_%DATE_STAMP%.dmp
FULL=Y
LOG=D:\OracleBackup\FULL_%DATE_STAMP%.log
COMPRESS=Y
CONSISTENT=Y
BUFFER=1048576
REM 批次檔呼叫
exp PARFILE=D:\Scripts\exp.par

任務排程器設定步驟

圖形介面設定 (taskschd.msc)

  1. 開啟「任務排程器」→「建立基本工作」
  2. 名稱:Oracle_Daily_Backup,描述:每日自動完整備份
  3. 觸發條件:每日,時間:02:00 (業務低峰期)
  4. 動作:啟動程式
    • 程式/腳本:D:\Scripts\backup_oracle.bat
    • 起始位置:D:\Scripts
  5. 完成建立後,右鍵「內容」→「條件」/「設定」微調:
    • 勾選「只有在網路可用時啟動」
    • 勾選「如果任務失敗,每 10 分鐘重試,最多 3 次」
    • 取消勾選「如果電池供電則停止」

命令列快速建立 (schtasks)

> 建立每日 02:00 執行
SCHTASKS /CREATE /TN "Oracle_Daily_Backup" /TR "D:\Scripts\backup_oracle.bat" /SC DAILY /ST 02:00 /RU "SYSTEM" /RL HIGHEST

> 建立每週日 01:00 執行完整備份
SCHTASKS /CREATE /TN "Oracle_Weekly_Full" /TR "D:\Scripts\backup_tiered.bat" /SC WEEKLY /D SUN /ST 01:00 /RU "SYSTEM"

日期時間格式化陷阱與解決

%DATE% 與 %TIME% 格式受地區設定、語言版本影響極大:

系統設定%DATE% 輸出%TIME% 輸出
英文 (US)Mon 01/15/2024 2:30 PM
繁體中文2024/01/15上午 02:30
簡體中文2024/01/1502:30:00

跨環境相容寫法:使用 WMIC 或 PowerShell

REM 使用 WMIC 取得標準格式 (不受地區設定影響)
FOR /F "TOKENS=2 DELIMS==" %%A IN ('WMIC OS GET LocalDateTime /VALUE') DO SET DT=%%A
SET TIMESTAMP=%DT:~0,8%_%DT:~8,6%  -- YYYYMMDD_HHMMSS

REM 或直接呼叫 PowerShell
FOR /F %%A IN ('POWERSHELL -Command "Get-Date -Format yyyyMMdd_HHmmss"') DO SET TIMESTAMP=%%A

監控與告警機制

1. 郵件通知 (需安裝 Blat 或 PowerShell Send-MailMessage)

REM 批次檔結尾加入
POWERSHELL -Command "Send-MailMessage -From 'dba@company.com' -To 'dba-team@company.com' -Subject 'Oracle Backup %TIMESTAMP% %STATUS%' -Body 'Log: %BACKUP_DIR%\FULL_%TIMESTAMP%.log' -SmtpServer 'smtp.company.com'"

2. 事件檢視器記錄

EVENTCREATE /T SUCCESS /ID 1000 /L APPLICATION /SO "OracleBackup" /D "Full backup completed: FULL_%TIMESTAMP%.dmp"
EVENTCREATE /T ERROR /ID 1001 /L APPLICATION /SO "OracleBackup" /D "Backup failed with code %ERRORLEVEL%"

3. 簡易健康檢查腳本

@ECHO OFF
REM check_backup_health.bat - 每日排程檢查
SET BACKUP_DIR=D:\OracleBackup
SET TODAY=%DATE:~10,4%%DATE:~4,2%%DATE:~7,2%

DIR %BACKUP_DIR%\FULL_%TODAY%*.dmp >NUL 2>&1
IF %ERRORLEVEL% NEQ 0 (
  ECHO 今日備份檔案不存在!
  EVENTCREATE /T ERROR /ID 1002 /L APPLICATION /SO "OracleBackupHealth" /D "今日無備份檔案產生"
)

遷移至 RMAN 的建議路徑

EXP 為邏輯備份,隨資料量增長效能瓶頸明顯。建議漸進式遷移:

階段策略工具
1EXP 完整備份 + 歸檔日誌備份EXP + 手動 COPY 歸檔
2RMAN 完整備份 (含控制檔/SPFILE)RMAN 腳本 + 任務排程
3RMAN 增量備份 + 歸檔日誌自動管理RMAN 保留策略 + FRA
4Data Guard 實體備援Data Guard Broker

總結

Windows 任務排程器 + 批次檔 + EXP/RMAN 構成零成本自動化備份基石。關鍵成功因素在於:標準化時間戳格式、參數檔隔離敏感資訊、分級保留策略、失敗重試與告警機制、定期恢復演練。隨業務增長,適時遷移至 RMAN 並啟用 FRA (Fast Recovery Area) 以獲得企業級備份能力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved