您的当前位置:首页正文

mysql定时数据备份工具(c#)

2020-11-09 来源:品趣旅游知识分享网

此博文的出处 为 http://blog.csdn.net/zhujunxxxxx/article/details/40124773zhujunxxxxx@163.com ,如有问题请联系作者 为了确保数据的安全,我们往往要对数据进行备份。但是为了减少我们的工作量,我写了一个简单的数据备份工具,实现定时备份数据库。 其

此博文的出处 为 http://blog.csdn.net/zhujunxxxxx/article/details/40124773zhujunxxxxx@163.com,如有问题请联系作者

为了确保数据的安全,我们往往要对数据进行备份。但是为了减少我们的工作量,我写了一个简单的数据备份工具,实现定时备份数据库。

其实程序很简单,数据备份的工作就是几个mysql的命令而已。

先看看程序的运行界面


可以看到界面是十分的简单的

我们使用的是命令行来进行数据备份,所以我们的程序需要一个能够执行命令行的函数

/// 
 /// 执行Cmd命令
 /// 
 /// 要启动的进程的目录
 /// 要执行的命令
 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();
 }

 /// 
 /// 执行Cmd命令
 /// 
 /// 要启动的进程的目录
 /// 要执行的命令
 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("数据库备份失败!");
 }

 }

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

 }
}
显示全文