架構概覽
- 來源端:生產資料庫 (TNS 別名 `JMYBJS`)
- 備份端:獨立 Windows 機器,執行 VBScript 定時呼叫 `exp.exe`
- 保留策略:保留 30 天 `.dmp` 及 `.log`
1. TNS 連線字串配置 (tnsnames.ora)
JMYBJS =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 129.1.9.90)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = jmybjs)
)
)
2. 目錄結構
D:\backup\dmp\ -- 存放 .dmp
D:\backup\log\ -- 存放 .log
3. 備份腳本 (backup.vbs)
' Nightly full export for JMYBJS
' 輸出檔名格式:jmybjsYYYYMMDD.dmp / .log
Dim outfile, aa, bb, stroption1, strsql
Set ws = WScript.CreateObject("WScript.Shell")
' 取得今日日期字串
A = CInt(Month(DateAdd("d", 0, Date())))
B = CInt(Day(DateAdd("d", 0, Date())))
C = CInt(Year(DateAdd("d", 0, Date())))
If A < 10 Then aa = "0" & A Else aa = CStr(A)
If B < 10 Then bb = "0" & B Else bb = CStr(B)
outfile = CStr(C) & aa & bb ' 例:20170109
' exp 完整命令
stroption1 = "D:\oracle_bf\product\10.1.0\Db_1\BIN\exp system/******@jmybjs " & _
"full=y buffer=900000 " & _
"file=D:\backup\dmp\jmybjs" & outfile & " " & _
"log=D:\backup\log\jmybjs" & outfile & ".log"
strsql = stroption1
ret = ws.Run(strsql, 0, True) ' 同步執行,等待完成
' 檢查返回碼
If ret <> 0 Then
' 可加入事件日誌或郵件通知
WScript.Echo "Export failed with code: " & ret
End If
4. 清理腳本 (cleanup.vbs) - 刪除 30 天前檔案
' 刪除 30 天前的 .dmp
Dim outfile, aa, bb, stroption1, strsql
Set ws = WScript.CreateObject("WScript.Shell")
A = CInt(Month(DateAdd("d", -30, Date())))
B = CInt(Day(DateAdd("d", -30, Date())))
C = CInt(Year(DateAdd("d", -30, Date())))
If A < 10 Then aa = "0" & A Else aa = CStr(A)
If B < 10 Then bb = "0" & B Else bb = CStr(B)
outfile = CStr(C) & aa & bb
' 注意:需確保 C:\WINDOWS\system32\delete.exe 存在
' 若無,可從其他 Windows 機複製或改用 DEL 命令
stroption1 = "C:\WINDOWS\system32\delete.exe D:\backup\dmp\jmybjs" & outfile & ".dmp"
strsql = stroption1
ret = ws.Run(strsql, 0, True)
' 同步刪除對應 .log
stroption1 = "C:\WINDOWS\system32\delete.exe D:\backup\log\jmybjs" & outfile & ".log"
ret = ws.Run(strsql, 0, True)
改良版:純 VBScript 刪除 (無需 delete.exe)
Dim fso, folder, file, cutoffDate
Set fso = CreateObject("Scripting.FileSystemObject")
cutoffDate = DateAdd("d", -30, Date())
' 清理 .dmp
Set folder = fso.GetFolder("D:\backup\dmp")
For Each file In folder.Files
If LCase(fso.GetExtensionName(file.Name)) = "dmp" Then
If file.DateLastModified < cutoffDate Then
file.Delete True
End If
End If
Next
' 清理 .log
Set folder = fso.GetFolder("D:\backup\log")
For Each file In folder.Files
If LCase(fso.GetExtensionName(file.Name)) = "log" Then
If file.DateLastModified < cutoffDate Then
file.Delete True
End If
End If
Next
5. Windows 任務排程器配置
- 開啟「任務排程器」 → 建立基本任務
- 觸發器:每日 02:00 (離峰時段)
- 動作:啟動程式
- 程式:`wscript.exe`
- 引數:`D:\scripts\backup.vbs`
- 起始於:`D:\scripts\`
- 建立第二個任務執行 `cleanup.vbs` (可同時間或稍後)
- 勾選「使用最高權限執行」並設定「無論使用者是否登入都要執行」
關鍵參數說明
| 參數 | 說明 | 建議值 |
| full=y | 完整資料庫匯出 | 生產庫建議 |
| buffer=900000 | 資料緩衝區大小 (bytes) | 大表可調大至 10M+ |
| compress=n | 不壓縮儲存 (避免匯入問題) | n |
| grants=y | 匯出授權 | y |
| indexes=y | 匯出索引定義 | y |
| constraints=y | 匯出約束定義 | y |
驗證與監控
- 每日檢查 `D:\backup\log\jmybjsYYYYMMDD.log` 確認 `Export terminated successfully without warnings.`
- 定期執行 `imp ... show=y` 測試匯入可行性 (演練恢復)。
- 監控磁碟空間,設定閾值告警。