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

C# 實現 MySQL 資料庫備份與還原:調用 mysqldump/mysql 工具完整實作

     編輯:MySQL 綜合教學

在 .NET 應用中整合 MySQL 備份還原功能,最穩健的方式是調用官方命令列工具 mysqldump(備份)與 mysql(還原)。本文提供完整 C# 實作代碼,涵蓋命令執行封裝、參數建構、檔案對話框、錯誤處理與路徑空格處理等實戰細節。

核心架構:Process 呼叫命令列工具

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);
        }
    }
}

關鍵實戰細節

1. 工具路徑解析

  • 開發機:MySQL 安裝目錄 bin 已在系統 PATH,workingDirectory 可任意
  • 部署機:建議將 mysqldump.exe、mysql.exe 及依賴 DLL 複製至應用目錄,workingDirectory 設為應用目錄
  • 或在代碼中透過登錄表/環境變數動態尋找 MySQL 安裝路徑

2. 密碼安全處理

  • 避免明文寫在代碼:使用 --defaults-extra-file 指定包含密碼的 .my.cnf
  • 範例:mysqldump --defaults-extra-file=backup.cnf ...
  • backup.cnf 內容:[client]\npassword=your_password,權限 600

3. 大資料庫優化參數

// 備份大表加速
--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;

4. 路徑空格處理

代碼中已使用 \"{path}\" 雙引號包裹,解決路徑含空格導致命令解析錯誤。

5. 非同步執行與進度回報

長時間備份/還原建議用 Task.Run 背景執行,透過 Process.OutputDataReceived 事件讀取輸出流更新 UI 進度條。

替代方案:MySqlBackup.NET 函式庫

若不想依賴外部 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)實現自動化備份策略。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved