核心程式碼
// 匯出
String dumpCmd = "mysqldump -uroot -proot --opt databasename > d:/test.sql";
Runtime.getRuntime().exec("cmd /c " + dumpCmd);
// 匯入 (先建庫)
String createDb = "mysqladmin -uroot -proot create databasename";
Runtime.getRuntime().exec("cmd /c " + createDb);
String importCmd = "mysql databasename < d:/test.sql";
Runtime.getRuntime().exec("cmd /c " + importCmd);
改良版:完整路徑、等待結束、錯誤處理
public static void execMySqlCmd(String cmd) throws IOException, InterruptedException {
ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", cmd);
pb.redirectErrorStream(true);
Process p = pb.start();
// 讀取輸出避免緩衝區阻塞
try (BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()))) {
String line;
while ((line = br.readLine()) != null) System.out.println(line);
}
int exitCode = p.waitFor();
if (exitCode != 0) throw new RuntimeException("MySQL command failed: " + cmd + ", exit=" + exitCode);
}
// 使用
execMySqlCmd("\"C:\\Program Files\\MySQL\\MySQL Server 8.0\\bin\\mysqldump.exe\" -uroot -proot --opt db > D:\\backup.sql");
execMySqlCmd("\"C:\\Program Files\\MySQL\\MySQL Server 8.0\\bin\\mysql.exe\" -uroot -proot db < D:\\backup.sql");
注意事項
- Windows 下需 `cmd /c` 執行重導向 (`>`, `<`);Linux 直接用 `bash -c`。
- 路徑含空格必須雙引號包裹。
- 生產環境建議改用 JDBC 批次寫入 或 MySQL 官方 Java 備份 API,避免外部進程依賴與安全風險。
- 密碼明文出現在進程列表 (`ps -ef`) 有洩露風險,可用 `--defaults-extra-file` 指定密碼檔。