首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 備份與還原實戰:Java 程式調用、批次檔腳本與命令列完整指南

     編輯:MySQL 綜合教學

MySQL 備份與還原實戰:Java 程式調用、批次檔腳本與命令列完整指南

一、Java 程式碼整合 mysqldump / mysql 命令

在應用層直接呼叫資料庫工具,適合建立自動化備份排程或管理後台功能。

1. 備份單一資料庫

/**
 * 備份單個資料庫
 * @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;
    }
}

2. 還原單一資料庫

/**
 * 還原單個資料庫
 * @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,否則緩衝區滿會導致進程掛起。

二、Windows 批次檔自動備份腳本

適合排程器定時執行,無需開發環境。

@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 指定加密配置檔。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved