技术思绪摘录旅行笔记
之前用惯了SQLServer,SQLServer的备份都是任务全自动的,大微软的东西就是简单易用;但是mysql就不太好弄,本身就是开源,提倡轻便,不带这些功能;那么我们只有自己弄,好在mysql服务安装包提供了程序,我们只需要调用就行,本文就提供了C#语言调用的案例。

首先是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目录下,就用绝对路径。

CarsonIT 微信扫码关注公众号 策略、创意、技术

留下您的脚步

 

最近评论

查看更多>>

站点统计

总文章数:276 总分类数:18 总评论数:90 总浏览数:170.64万

精选推荐

阅读排行

友情打赏

请打开您的微信,扫一扫