在 .NET 應用中整合 MySQL 備份還原功能,最穩健的方式是調用官方命令列工具 mysqldump(備份)與 mysql(還原)。本文提供完整 C# 實作代碼,涵蓋命令執行封裝、參數建構、檔案對話框、錯誤處理與路徑空格處理等實戰細節。
using System;
using System.Diagnostics;
using System.Text;
using System.Windows.Forms;
public static class CmdHelper
{
///
/// 執行命令列指令
///
/// 工具所在目錄(含 mysqldump/mysql.exe)
/// 完整命令參數
public static void Execute(string workingDirectory, string command)
{
using (Process p = new Process())
{
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.WorkingDirectory = workingDirectory;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
p.Start();
p.StandardInput.WriteLine(command);
p.StandardInput.WriteLine("exit");
// 可選:讀取輸出/錯誤流進行日誌記錄
string output = p.StandardOutput.ReadToEnd();
string error = p.StandardError.ReadToEnd();
p.WaitForExit();
if (p.ExitCode != 0 && !string.IsNullOrEmpty(error))
throw new Exception($"命令執行失敗 (ExitCode={p.ExitCode}): {error}");
}
}
}
public partial class DataBackupForm : Form
{
private void btnBackup_Click(object sender, EventArgs e)
{
try
{
// 1. 選擇儲存路徑
SaveFileDialog sfd = new SaveFileDialog
{
AddExtension = false,
CheckFileExists = false,
CheckPathExists = true,
FileName = DateTime.Now.ToString("yyyyMMddHHmmss"),
Filter = "SQL 檔案 (*.sql)|*.sql|所有檔案 (*.*)|*.*"
};
if (sfd.ShowDialog() != DialogResult.OK) return;
string backupPath = sfd.FileName;
// 2. 建構 mysqldump 命令
// 參數說明:--quick 逐行輸出、--lock-tables 鎖表、--default-character-set 指定編碼
StringBuilder cmd = new StringBuilder();
cmd.Append("mysqldump ");
cmd.Append("--quick --lock-tables --verbose --force ");
cmd.Append($"--host=localhost --port=3306 ");
cmd.Append($"--user=root --password=your_password ");
cmd.Append($"--default-character-set=utf8mb4 ");
cmd.Append($"your_database ");
cmd.Append($"-r \"{backupPath}\"");
// 3. 取得工具目錄(假設 mysqldump.exe 放在應用啟動目錄或系統 PATH)
string toolDir = Application.StartupPath + "\\"; // 或 MySQL 安裝 bin 目錄
// 4. 執行備份
CmdHelper.Execute(toolDir, cmd.ToString());
MessageBox.Show($"MySQL 資料庫已成功備份至:\n{backupPath}", "備份成功",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show($"備份失敗:{ex.Message}", "錯誤",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
public partial class DataRestoreForm : Form
{
private void btnRestore_Click(object sender, EventArgs e)
{
try
{
// 1. 選擇備份檔案
OpenFileDialog ofd = new OpenFileDialog
{
Filter = "SQL 檔案 (*.sql)|*.sql|壓縮檔 (*.gz)|*.gz|所有檔案 (*.*)|*.*",
CheckFileExists = true
};
if (ofd.ShowDialog() != DialogResult.OK) return;
string backupFile = ofd.FileName;
// 2. 二次確認(還原會覆蓋現有資料)
var result = MessageBox.Show(
"還原將覆蓋現有資料庫,原資料將永久遺失!\n確定要繼續嗎?",
"危險操作確認", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
if (result != DialogResult.Yes) return;
// 3. 建構 mysql 還原命令
// 注意:檔案路徑含空格時需雙引號包裹,重導向輸入用 <
StringBuilder cmd = new StringBuilder();
cmd.Append("mysql ");
cmd.Append($"--host=localhost --port=3306 ");
cmd.Append($"--user=root --password=your_password ");
cmd.Append($"--default-character-set=utf8mb4 ");
cmd.Append($"your_database ");
cmd.Append($"< \"{backupFile}\"");
// 4. 執行還原
string toolDir = Application.StartupPath + "\\";
CmdHelper.Execute(toolDir, cmd.ToString());
MessageBox.Show("資料庫還原成功!", "完成",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show($"還原失敗:{ex.Message}", "錯誤",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
bin 已在系統 PATH,workingDirectory 可任意mysqldump.exe、mysql.exe 及依賴 DLL 複製至應用目錄,workingDirectory 設為應用目錄--defaults-extra-file 指定包含密碼的 .my.cnfmysqldump --defaults-extra-file=backup.cnf ...backup.cnf 內容:[client]\npassword=your_password,權限 600// 備份大表加速
--single-transaction --quick --skip-lock-tables --hex-blob --routines --triggers
// 還原加速
-- 在 mysql 客戶端執行前可先:
SET autocommit=0; SET unique_checks=0; SET foreign_key_checks=0;
-- 還原後:
SET autocommit=1; SET unique_checks=1; SET foreign_key_checks=1;
代碼中已使用 \"{path}\" 雙引號包裹,解決路徑含空格導致命令解析錯誤。
長時間備份/還原建議用 Task.Run 背景執行,透過 Process.OutputDataReceived 事件讀取輸出流更新 UI 進度條。
若不想依賴外部 exe,可使用 MySqlBackup.NET (NuGet) 純 managed 實作:
using MySqlBackupNet;
using MySql.Data.MySqlClient;
var mb = new MySqlBackup(new MySqlCommand());
mb.ExportInfo.DatabaseName = "your_db";
mb.ExportToFile("backup.sql"); // 備份
mb.ImportFromFile("backup.sql"); // 還原
優點:無外部相依、跨平台、物件導向 API。缺點:極大資料庫效能不如原生工具。
調用 mysqldump/mysql 是 C# 整合 MySQL 備份還原最成熟、效能最佳的方案。關鍵在於:正確建構命令參數、安全處理密碼、妥善處理路徑空格、提供使用者友善的確認與進度回饋。生產環境建議搭配排程任務(Windows Task Scheduler / Hangfire)實現自動化備份策略。