zoukankan      html  css  js  c++  java
  • windows服务自动备份数据库

    最近写了几个windows服务用于自动备份与删除数据:

    services代码如下:

      public partial class Service1 : ServiceBase
        {
            public Service1()
            {
                InitializeComponent();
            }
            System.Timers.Timer timer1;
            static SqlConnection conn = new SqlConnection();//数据库连接
           
            protected override void OnStart(string[] args)
           { 
                    timer1 = new System.Timers.Timer();
                    timer1.Interval = (0.5*60)* 60 * 1000;  //设置计时器事件间隔执行时间
                    timer1.Elapsed += new System.Timers.ElapsedEventHandler(timer1_Elapsed);
                    timer1.Enabled = true;
              
            }
    
            protected override void OnStop()
            {
                this.timer1.Enabled = false;
            }
    
            private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
            {
                //执行SQL语句或其他操作 
    
                if (DateTime.Now.Hour == 1 || DateTime.Now.Hour == 07 || DateTime.Now.Hour == 11 || DateTime.Now.Hour == 15 || DateTime.Now.Hour == 19 || DateTime.Now.Hour == 20 ||
                    DateTime.Now.Hour == 21 || DateTime.Now.Hour == 22)//以上时间才可以备份。可以添加2个timer用于整点保存数据
                {
                    NLog.Logger log = NLog.LogManager.GetCurrentClassLogger();
                    try
                    { 
    
                        string logicalname = "BackupTradeDb_" + DateTime.Now.ToString("yyyyMMddhhmmss");
                        string physicalname = AppDomain.CurrentDomain.BaseDirectory;
    
                        string path = @"F:WindowsServesackupDB" + DateTime.Now.ToString("yyyyMMdd");//保存备份文件的路径
                        
                        if (!Directory.Exists(path))
                        {
                            Directory.CreateDirectory(path);
                        }
                        log.Info("路径为:"+path);
    
                        physicalname = Path.Combine(path, logicalname + ".bak"); 
    
                        log.Info("开始备份" );
                        StartBackup(logicalname, physicalname, "NewTradeDB");
                    }
                    catch (Exception ex)
                    {
                        System.Diagnostics.Debug.Print(ex.ToString());
    
                        log.Info(ex.ToString());
    
                    }
    
    
                    //DateTime date = DateTime.Now.AddDays(-5);
    
    
                    //foreach (DirectoryInfo item in directory)
                    //{
    
                    //    if (item.Name.Contains(date.ToString("yyyyMMdd")))
                    //    {
                    //        FileInfo[] files = item.GetFiles();
                    //        foreach (FileInfo file in files)
                    //        {
                    //            file.Delete();
                    //        }
                    //        item.Delete();
                    //    }
                    //} 这个为删除5天前的备份数据
                }
                
                 
            } 
    
            private void StartBackup(string logicalname, string physicalname,string dbName)
            {
                SqlParameter[] paras = new SqlParameter[]{
                        new SqlParameter("@devtype",SqlDbType.VarChar,20),
                        new SqlParameter("@logicalname",SqlDbType.VarChar,256),
                        new SqlParameter("@physicalname",SqlDbType.VarChar,520)
                    };
                paras[0].Value = "disk";
                paras[1].Value = logicalname;
                paras[2].Value = physicalname;
    
                NLog.Logger log = NLog.LogManager.GetCurrentClassLogger();
    
                int device = ExecuteOtherProc("sp_addumpdevice", paras);//只是添加一个备份设备
    
                log.Info("添加一个备份设备"+device);
                string sql_backup =string.Format("backup database {0} to {1} WITH  DIFFERENTIAL",dbName,logicalname);
               //差异备份
               
    
                log.Info(sql_backup);
    
                int backup = ExecuteSql(sql_backup);
    
                log.Info("执行备份语句,影响行数为"+backup);
    
            }
            public static int ExecuteOtherProc(string procName, params SqlParameter[] paras)
            {
    
                NLog.Logger log = NLog.LogManager.GetCurrentClassLogger();
                SqlCommand cmd = new SqlCommand();
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = procName;
                cmd.Connection = conn;
    
                if (paras != null)
                {
                    cmd.Parameters.AddRange(paras);
                }
                int flag = 0;
                try
                {
                    conn.Open();
                    flag = cmd.ExecuteNonQuery();
                }
                catch (Exception ex)
                {
    
                  log.Info(ex.ToString());
                }
                finally
                {
                    conn.Close();
                }
                return flag;
            }
            public static int ExecuteSql(string sql)
            {
                NLog.Logger log = NLog.LogManager.GetCurrentClassLogger();
    
                int flag = 0;
                SqlCommand cmd = new SqlCommand(sql, conn);
    
                try
                {
                    conn.Open();
                    flag = cmd.ExecuteNonQuery();
                }
                catch (Exception ex)
                {
                    log.Info(ex.ToString());
                }
                finally
                {
                    conn.Close();
                }
                return flag;
            }
    
        }
  • 相关阅读:
    resultMap之collection聚集
    try{}catch{}finally{}使用总结
    动手动脑兼课后作业2
    第一个psp0级
    原码反码补码
    动手动脑兼课后作业
    第七周进度报告
    第六周进度报告
    第五周进度报告
    《大道至简》读后感
  • 原文地址:https://www.cnblogs.com/ITHomes/p/3513475.html
Copyright © 2011-2022 走看看