Java 程式 (BAK.java) 封裝 DB2 命令列工具 (db2cmd),通過 Runtime.exec() 執行備份命令,配合 Windows 任務排程器定時觸發,實現無人值守自動備份。
BAK.java
import java.util.Date;
public class BAK {
public static void main(String[] args) throws Exception {
Runtime rt = Runtime.getRuntime();
// 1. 強制斷開所有應用連線 (確保備份一致性)
Process p = rt.exec("db2cmd /c db2 force application all");
Thread.sleep(5000); // 等待斷開完成
// 2. 判斷備份策略:週六完備,其餘增量
Date now = new Date();
int dayOfWeek = now.getDay(); // 0=Sun ... 6=Sat
String backupCmd;
if (dayOfWeek != 6) {
backupCmd = "db2cmd /c db2 backup db yndc incremental";
} else {
backupCmd = "db2cmd /c db2 backup db yndc"; // 完備備份
}
// 3. 執行多庫備份 (示例:yndc, codebase, rone)
rt.exec(backupCmd);
rt.exec("db2cmd /c db2 backup db codebase");
rt.exec("db2cmd /c db2 backup db rone");
// 可選:rt.exec("db2cmd /c db2 backup db datactr");
// 4. 退出 JVM
rt.exit(0);
}
}
run.bat
@echo off
REM 需預先配置 JAVA_HOME 與 PATH 包含 javac/java
javac -deprecation BAK.java
java BAK
cmd.exe,參數 /c "D:\backup\run.bat" (按實際路徑調整)。
REM 壓縮備份目錄並複製至網路共享/映射磁碟
"C:\Program Files\WinZip\wzzip.exe" -r -P "password" "Z:\offsite_backup\db2bak_%DATE%.zip" "D:\backup\db2bak\"
注意:DB2 backup 命令不支援直接寫入網路路徑 (UNPath),必須先備份本地再異地同步。
| 項目 | 建議 |
|---|---|
| 離線 vs 在線備份 | 示例採用離線 (force application all) 確保一致性;24/7 業務需用 ONLINE 選項配合日誌保留。 |
| 備份保留策略 | 腳本中註解掉的 del 命令可啟用定期清理舊備份 (保留 N 天)。 |
| 權限 | 任務排程「最高權限」+ DB2 實例擁有者帳號,確保 db2cmd 可執行。 |
| 日誌審計 | 重定向 java BAK > backup.log 2>&1,定期巡檢備份耗時、大小、錯誤碼。 |
AUTO_MAINT ON, AUTO_BACKUP ON,資料庫引擎原生排程,無需外部腳本。db2backup 容器映像,雲原生排程。