標籤:style blog http color io os ar 使用 for
此博文的出處 為 http://blog.csdn.net/zhujunxxxxx/article/details/40124773如果進行轉載請註明出處。本文作者原創,郵箱[email protected],如有問題請聯絡作者
為了確保資料的安全,我們往往要對資料進行備份。但是為了減少我們的工作量,我寫了一個簡單的資料備份工具,實現定時備份資料庫。
其實程式很簡單,資料備份的工作就是幾個mysql的命令而已。
先看看程式的運行介面
可以看到介面是十分的簡單的
我們使用的是命令列來進行資料備份,所以我們的程式需要一個能夠執行命令列的函數
/// <summary> /// 執行Cmd命令 /// </summary> /// <param name="workingDirectory">要啟動的進程的目錄</param> /// <param name="command">要執行的命令</param> public static void StartCmd(String workingDirectory, String command) { 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"); }
接下來是一個備份資料庫的函數
public void bakup_db() { try { //String command = "mysqldump --quick --host=localhost --default-character-set=gb2312 --lock-tables --verbose --force --port=連接埠號碼 --user=使用者名稱 --password=密碼 資料庫名 -r 備份到的地址"; //構建執行的命令 StringBuilder sbcommand = new StringBuilder(); StringBuilder sbfileName = new StringBuilder(); sbfileName.AppendFormat("{0}", DateTime.Now.ToShortDateString()).Replace("-", "").Replace(":", "").Replace(" ", "").Replace("/", ""); String fileName = sbfileName.ToString(); String directory = bakpath + fileName+".bak"; sbcommand.AppendFormat("mysqldump --quick --host=localhost --default-character-set=utf8 --lock-tables --verbose --force --port=3306 --user={0} --password={1} {2} -r \"{3}\"", uname, upass, dbname, directory); String command = sbcommand.ToString(); //擷取mysqldump.exe所在路徑 //String appDirecroty = System.Windows.Forms.Application.StartupPath + "\\"; StartCmd(appDirecroty, command); } catch (Exception ex) { } }
還原資料庫
public void recovery_db() { //string s = "mysql --port=連接埠號碼 --user=使用者名稱 --password=密碼 資料庫名<還原檔案所在路徑"; try { StringBuilder sbcommand = new StringBuilder(); OpenFileDialog openFileDialog = new OpenFileDialog(); if (openFileDialog.ShowDialog() == DialogResult.OK) { String directory = openFileDialog.FileName; //在檔案路徑後面加上""避免空格出現異常 sbcommand.AppendFormat("mysql --host=localhost --default-character-set=utf8 --port=3306 --user={0} --password={1} {2}<\"{3}\"",uname,upass,dbname,directory); String command = sbcommand.ToString(); //擷取mysql.exe所在路徑 //String appDirecroty = System.Windows.Forms.Application.StartupPath + "\\"; DialogResult result = MessageBox.Show("您是否真的想覆蓋以前的資料庫嗎?那麼以前的資料庫資料將丟失!!!", "警告", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); if (result == DialogResult.Yes) { StartCmd(appDirecroty, command); MessageBox.Show("資料庫還原成功!"); } } } catch (Exception ex) { MessageBox.Show("資料庫還原失敗!"); } }
為了實現定時備份,我們使用的是一個Timer組件,來實現定時的資料備份
private void timer1_Tick(object sender, EventArgs e) { int h = DateTime.Now.Hour; if (h == hour) { bakup_db(); } }
給出完整的代碼
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Diagnostics;namespace MysqlBak{ public partial class Form1 : Form { //備份檔案的路徑 public String bakpath="d:\\db_bak\\"; public String appDirecroty = @"C:\Program Files (x86)\MySQL\MySQL Server 6.0\bin"; public String uname = "root"; public String upass = "root"; public String dbname = "losscar_db"; public int hour=18; public Form1() { InitializeComponent(); timer1.Interval=1000*10; timer1.Start(); txt_uname.Text = uname; txt_upass.Text = upass; txt_dbname.Text = dbname; txt_bakpath.Text = bakpath; txt_mysql.Text = appDirecroty; txt_hour.Text = hour.ToString(); } /// <summary> /// 執行Cmd命令 /// </summary> /// <param name="workingDirectory">要啟動的進程的目錄</param> /// <param name="command">要執行的命令</param> public static void StartCmd(String workingDirectory, String command) { 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"); } private void btn_bak_Click(object sender, EventArgs e) { try { //String command = "mysqldump --quick --host=localhost --default-character-set=gb2312 --lock-tables --verbose --force --port=連接埠號碼 --user=使用者名稱 --password=密碼 資料庫名 -r 備份到的地址"; //構建執行的命令 StringBuilder sbcommand = new StringBuilder(); StringBuilder sbfileName = new StringBuilder(); sbfileName.AppendFormat("{0}", DateTime.Now.ToShortDateString()).Replace("-", "").Replace(":", "").Replace(" ", "").Replace("/", ""); String fileName = sbfileName.ToString(); String directory = bakpath + fileName + ".bak"; sbcommand.AppendFormat("mysqldump --quick --host=localhost --default-character-set=utf8 --lock-tables --verbose --force --port=3306 --user={0} --password={1} {2} -r \"{3}\"", uname, upass, dbname, directory); String command = sbcommand.ToString(); //擷取mysqldump.exe所在路徑 //String appDirecroty = System.Windows.Forms.Application.StartupPath + "\\"; StartCmd(appDirecroty, command); MessageBox.Show(@"資料庫已成功備份到 " + directory + " 檔案中", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception ex) { MessageBox.Show("Database Backup失敗!"); } } public void bakup_db() { try { //String command = "mysqldump --quick --host=localhost --default-character-set=gb2312 --lock-tables --verbose --force --port=連接埠號碼 --user=使用者名稱 --password=密碼 資料庫名 -r 備份到的地址"; //構建執行的命令 StringBuilder sbcommand = new StringBuilder(); StringBuilder sbfileName = new StringBuilder(); sbfileName.AppendFormat("{0}", DateTime.Now.ToShortDateString()).Replace("-", "").Replace(":", "").Replace(" ", "").Replace("/", ""); String fileName = sbfileName.ToString(); String directory = bakpath + fileName+".bak"; sbcommand.AppendFormat("mysqldump --quick --host=localhost --default-character-set=utf8 --lock-tables --verbose --force --port=3306 --user={0} --password={1} {2} -r \"{3}\"", uname, upass, dbname, directory); String command = sbcommand.ToString(); //擷取mysqldump.exe所在路徑 //String appDirecroty = System.Windows.Forms.Application.StartupPath + "\\"; StartCmd(appDirecroty, command); } catch (Exception ex) { } } private void btn_recovery_Click(object sender, EventArgs e) { recovery_db(); } public void recovery_db() { //string s = "mysql --port=連接埠號碼 --user=使用者名稱 --password=密碼 資料庫名<還原檔案所在路徑"; try { StringBuilder sbcommand = new StringBuilder(); OpenFileDialog openFileDialog = new OpenFileDialog(); if (openFileDialog.ShowDialog() == DialogResult.OK) { String directory = openFileDialog.FileName; //在檔案路徑後面加上""避免空格出現異常 sbcommand.AppendFormat("mysql --host=localhost --default-character-set=utf8 --port=3306 --user={0} --password={1} {2}<\"{3}\"",uname,upass,dbname,directory); String command = sbcommand.ToString(); //擷取mysql.exe所在路徑 //String appDirecroty = System.Windows.Forms.Application.StartupPath + "\\"; DialogResult result = MessageBox.Show("您是否真的想覆蓋以前的資料庫嗎?那麼以前的資料庫資料將丟失!!!", "警告", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); if (result == DialogResult.Yes) { StartCmd(appDirecroty, command); MessageBox.Show("資料庫還原成功!"); } } } catch (Exception ex) { MessageBox.Show("資料庫還原失敗!"); } } private void btn_edit_Click(object sender, EventArgs e) { if (btn_edit.Text=="修改") { txt_dbname.Enabled = true; txt_uname.Enabled = true; txt_upass.Enabled = true; txt_bakpath.Enabled = true; txt_mysql.Enabled = true; txt_hour.Enabled = true; btn_edit.Text = "確定"; } else if (btn_edit.Text == "確定") { uname = txt_uname.Text; upass = txt_upass.Text; dbname = txt_dbname.Text; appDirecroty = txt_mysql.Text; bakpath = txt_bakpath.Text; hour = int.Parse(txt_hour.Text); MessageBox.Show("修改成功!"); btn_edit.Text = "修改"; txt_dbname.Enabled = false; txt_uname.Enabled = false; txt_upass.Enabled = false; txt_bakpath.Enabled = false; txt_mysql.Enabled = false; txt_hour.Enabled = false; } } private void timer1_Tick(object sender, EventArgs e) { int h = DateTime.Now.Hour; if (h == hour) { bakup_db(); } } }}
mysql定時資料備份工具(c#)