首先是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目录下,就用绝对路径。
川公网安备 51010702003150号
留下您的脚步
最近评论