利用 Windows 內建任務排程器觸發批次檔,呼叫 Oracle EXP 工具實現無人值守備份,零成本、零第三方依賴。
@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"
@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
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
Oracle_Daily_Backup,描述:每日自動完整備份02:00 (業務低峰期)D:\Scripts\backup_oracle.batD:\Scripts> 建立每日 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/15 | 02:30:00 |
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
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'"
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%"
@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 "今日無備份檔案產生"
)
EXP 為邏輯備份,隨資料量增長效能瓶頸明顯。建議漸進式遷移:
| 階段 | 策略 | 工具 |
|---|---|---|
| 1 | EXP 完整備份 + 歸檔日誌備份 | EXP + 手動 COPY 歸檔 |
| 2 | RMAN 完整備份 (含控制檔/SPFILE) | RMAN 腳本 + 任務排程 |
| 3 | RMAN 增量備份 + 歸檔日誌自動管理 | RMAN 保留策略 + FRA |
| 4 | Data Guard 實體備援 | Data Guard Broker |
Windows 任務排程器 + 批次檔 + EXP/RMAN 構成零成本自動化備份基石。關鍵成功因素在於:標準化時間戳格式、參數檔隔離敏感資訊、分級保留策略、失敗重試與告警機制、定期恢復演練。隨業務增長,適時遷移至 RMAN 並啟用 FRA (Fast Recovery Area) 以獲得企業級備份能力。