首先是C#语言调用mysql的mysqldump程序,完成备份。
//创建进程对象 Process proc = new Process(); //调用dos窗口 proc.StartInfo.FileName = "cmd.exe"; //不显示窗体 proc.StartInfo.CreateNoWindow = true; //设置dos窗口的目录路径,这里就是自己安装mysql的bin目录(我们的mysqldump.exe和mysql.exe所在目录) proc.StartInfo.WorkingDirectory = @"C:\Program Files\MySQL\MySQL Server 5.7\bin"; //允许输入流 proc.StartInfo.UseShellExecute = false; proc.StartInfo.RedirectStandardInput = true; proc.StartInfo.RedirectStandardOutput = true; proc.StartInfo.RedirectStandardError = true; //执行 proc.Start(); //登陆数据库,这里的内容和我们直接使用dos窗口备份数据库的方式一致,前面是数据库登陆信息,后面是备份路径 //更详细的教程 https://baijiahao.baidu.com/s?id=1612955427840289665&wfr=spider&for=pc proc.StandardInput.WriteLine("mysqldump --skip-add-locks -hlocalhost -P3306 -uroot -p123456 --databases 数据库名> d://backup//数据库名.sql"); proc.Close();
我们一般备份都是定时的,而且是重复执行的,定时任务形式的程序。
我的思路是采用Quartz任务调度来定期执行备份,自然就解决了这个问题。
以下是控制台程序源码:
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using Quartz; using Quartz.Impl; namespace C.Customization.AutoAction { class Program { static void Main(string[] args) { Thread taskThread = new Thread(StartTask); taskThread.Start(); Console.Out.WriteLine(""); Console.Out.WriteLine(""); Console.Out.WriteLine(" ***************************************"); Console.Out.WriteLine(" ** **"); Console.Out.WriteLine(" ** 数据库备份任务启动成功 **"); Console.Out.WriteLine(" ** **"); Console.Out.WriteLine(" ***************************************"); Console.Out.WriteLine(""); Console.Out.WriteLine(""); Console.WriteLine(" 启动时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); Console.Out.WriteLine(""); Console.WriteLine(" 若需退出请输入 exit 按回车退出...\r\n"); string userCommand = string.Empty; while (userCommand != "exit") { if (string.IsNullOrEmpty(userCommand) == false) { Console.WriteLine(" 非退出指令,自动忽略..."); } userCommand = Console.ReadLine(); } } /// <summary> /// The scheduler /// </summary> static IScheduler _scheduler = null; /// <summary> /// 备份任务定时 /// </summary> private static readonly string BackupTime = ConfigerHelper.GetConfigToString("BackupTime"); /// <summary> /// 任务执行 /// </summary> private static async void StartTask() { ISchedulerFactory sf = new StdSchedulerFactory(); if (_scheduler == null) { _scheduler = await sf.GetScheduler(); } await _scheduler.Start(); #region 数据库备份 //创建任务对象 IJobDetail job1 = JobBuilder.Create<EveryJob1>() .WithIdentity("job1", "group1") .Build(); //创建触发器 ITrigger trigger1 = TriggerBuilder.Create() .WithIdentity("trigger1", "group1") .StartNow() .WithCronSchedule(BackupTime) .Build(); #endregion await _scheduler.ScheduleJob(job1, trigger1); } } /// <summary> /// 数据库备份 /// </summary> /// <seealso cref="Quartz.IJob" /> public class EveryJob1 : IJob { /// <summary> /// mysql安装目录 /// </summary> private static readonly string MysqlInstall = ConfigerHelper.GetConfigToString("MysqlInstall"); /// <summary> /// 执行备份命令 /// </summary> private static readonly string BackupCommand = ConfigerHelper.GetConfigToString("BackupCommand"); Task IJob.Execute(IJobExecutionContext context) { return Task.Factory.StartNew(() => { EveryTask(); }); } /// <summary> /// Everies the task. /// </summary> private void EveryTask() { try { Process proc = new Process(); //调用dos窗口 proc.StartInfo.FileName = "cmd.exe"; //不显示窗体 proc.StartInfo.CreateNoWindow = true; //设置dos窗口的目录路径,这里就是自己安装mysql的bin目录(我们的mysqldump.exe和mysql.exe所在目录) proc.StartInfo.WorkingDirectory = MysqlInstall; //允许输入流 proc.StartInfo.UseShellExecute = false; proc.StartInfo.RedirectStandardInput = true; proc.StartInfo.RedirectStandardOutput = true; proc.StartInfo.RedirectStandardError = true; //执行 proc.Start(); //登陆数据库,这里的内容和我们直接使用dos窗口备份数据库的方式一致,前面是数据库登陆信息,后面是备份路径 proc.StandardInput.WriteLine(string.Format(BackupCommand, DateTime.Now.ToString("yyyyMMddHHmmss"))); proc.Close(); Console.WriteLine($"执行数据库备份任务:成功"); } catch (Exception ex) { Console.WriteLine($"执行数据库备份任务:{ex.Message}"); } } } }
控制台程序配置项
<appSettings> <!--数据库备份任务时间 每天 0 0 0 * * ? *--> <add key="BackupTime" value="0 * * * * ? *" /> <!--数据库安装目录bin--> <add key="MysqlInstall" value="C:\Program Files\MySQL\MySQL Server 5.7\bin" /> <!--备份语句--> <add key="BackupCommand" value="mysqldump --skip-add-locks -hlocalhost -P3306 -uroot -p123456 --databases 数据库名 > d://backup//数据库名-{0}.sql" /> <appSettings>
根据我们备份的文件来还原数据库
>cd D:\mysql-5.7.30-winx64\bin >mysql -uroot -p123456 -Dcarsonblog<10000.sql
-u:数据库账号
-p:数据库密码
-D:数据库名称
10000.sql:还原所需的sql路径,如果不在mysql的bin目录下,就用绝对路径。
留下您的脚步
最近评论