在應用層直接呼叫資料庫工具,適合建立自動化備份排程或管理後台功能。
/**
* 備份單個資料庫
* @param dbName 資料庫名稱
* @return 備份成功與否
*/
public boolean backup(String dbName) {
try {
logger.info(dbName + " 開始備份!");
// 路徑支援空格,雙引號包裹
String cmd = "\"\" \"" + dataBaseBS.getInstallPath() + "bin\\mysqldump\" -h localhost -uroot -p123456 " + dbName
+ " > \"" + uploadPath + dbName + ".sql\"";
// cmd /c start /b 於背景執行,無視窗閃現
Process process = Runtime.getRuntime().exec("cmd /c start /b " + cmd);
// 讀取錯誤流防止阻塞
InputStreamReader isr = new InputStreamReader(process.getErrorStream());
LineNumberReader input = new LineNumberReader(isr);
String line;
while ((line = input.readLine()) != null) { /* 可記錄錯誤 */ }
logger.info(dbName + " 備份成功!");
return true;
} catch (Exception e) {
logger.error(dbName + " 備份失敗!", e);
return false;
}
}
/**
* 還原單個資料庫
* @param dbName 資料庫名稱
* @return 還原成功與否
*/
public boolean restore(String dbName) {
try {
logger.info(dbName + " 開始還原!");
String cmd = "\"\" \"" + dataBaseBS.getInstallPath() + "bin\\mysql\" -h localhost -uroot -p123456 " + dbName
+ " < \"" + uploadPath + dbName + ".sql\"";
Process process = Runtime.getRuntime().exec("cmd /c start /b " + cmd);
// 還原時讀取標準輸出流
InputStreamReader isr = new InputStreamReader(process.getInputStream());
LineNumberReader input = new LineNumberReader(isr);
String line;
while ((line = input.readLine()) != null) { /* 可記錄輸出 */ }
logger.info(dbName + " 還原成功!");
return true;
} catch (Exception e) {
logger.error(dbName + " 還原失敗!", e);
return false;
}
}
\"\" \"...\" 確保命令正確解析。cmd /c start /b 讓命令在背景靜默執行。ErrorStream 或 InputStream,否則緩衝區滿會導致進程掛起。適合排程器定時執行,無需開發環境。
@echo off
echo.
echo MySQL 資料庫備份
echo *****************************
echo.
echo 今天是 %date%
echo 時間是 %time%
echo.
echo *****************************
:: 設定日期變數格式 yyyyMMdd
set "Ymd=%date:~,4%%date:~5,2%%date:~8,2%"
:: 建立日期資料夾
md "D:\JDBC\%Ymd%"
:: 備份命令(多個資料庫以空格分隔)
"mysqldump" --single-transaction --databases dbName -uroot -p123456 --default-character-set=gbk > "D:\JDBC\%Ymd%\backup.sql"
echo.
echo MySQL 資料庫備份完成,請進行檢查。。。
echo.
echo.
pause
備份檔將產生於 D:\JDBC\20160612\backup.sql(依日期動態建立資料夾)。
| 操作 | 命令範例 |
|---|---|
| 備份單庫 | mysqldump -u root -p dbName > backup.sql |
| 備份多庫 | mysqldump -u root -p --databases db1 db2 > backup.sql |
| 備份全庫 | mysqldump -u root -p --all-databases > full_backup.sql |
| 還原單庫 | mysql -u root -p dbName < backup.sql |
| 還原全庫 | mysql -u root -p < full_backup.sql |
--single-transaction(InnoDB)確保一致性備份,不鎖表。gzip 壓縮:mysqldump ... | gzip > backup.sql.gz。--defaults-extra-file 指定加密配置檔。