Selamlar... 


Çalıştığım firmada şöyle bir ihtiyacımız oldu. Canlı veritabanın yedeğini her gün bir arşiv sunucusuna yükleyip raporları buradan almamız icabetti.
Şu şekilde bir çözüme gittik.
Bir C# konsol uygulaması yazdık.
Bunu da Windows zamanlanmış görevlere yedeğin ortalama tamamlanma süresinden 1 saat kadar sonraya.
Uygulama şu şekilde çalışıyor:
- Veritabanı yedeği bir NAS cihazında(bir yedekleme sunucusunda).
- Öncelikle o sunucuya kullanıcı adı-şifre doğrulaması ile bağlanıp yedek dosyasını arşiv sunucusuna(uygulamamızın çalıştığı sunucu) alıyoruz.
- Yedekleme sunucusunda çok sayıda yedek olduğundan en güncel yedeği bulup kopyalıyor uygulamamız.
- Sonra yedeği arşiv sunucusuna kopyaladığımız yedek dosyasını veritabanına yüklüyoruz..
- Sonra yedek dosyamızı siliyoruz.
- Son olarak işlem ile ilgili bilgilendirme mesajı atıyoruz.
- Uygulamanın başlangıç ayarlarını normalde bir xml dosyasından alıyorum, ancak burada direkt kodun içinden alacak şekilde yazdım. 


Program.cs
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml;
namespace VtYedekYukleMesajAt
{
    class Program
    {
        private static string _uygulamaDizini = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
        private static string _sunucuAdresi = @"\\192.168.0.101\sqlbackup";
        private static string _sunucudakiYedekDosyaYolu = @"\\Z:\VERITABANI_backup_2015_06_16_020000_8320823.bak";
        private static string _veritabaniAdi = "VERITABANI";
        private static string _yedekDosyaYolu = _uygulamaDizini + "\\VERITABANI_Yedek.bak";
        private static string _sunucuAdi = @"\\192.168.0.55";
        private static string _veritabaniKullaniciAdi = "sa";
        private static string _veritabaniSifre = "123456";
        private static string _sunucuKullaniciAdi = "sqlbackup";
        private static string _sunucuSifre = "123456";
        private static string _fizikselDataDosyasi = "VERITABANI.mdf";
        private static string _fizikselLogDosyasi = "VERITABANI.ldf";
        private static string _mantiksalDataDosyasi = "VERITABANI_Data";
        private static string _mantiksalLogDosyasi = "VERITABANI_Log";
        private static string _sunucuDomain = "firmaismi";
        private static string _agYoluHarfi = "Z:";
        private static string _bilgiEPostaAdresi = "zamkinos@firmaismi.com.tr";
        private static string _smtpAdi = "zamkinos@firmaismi.com.tr";
        private static string _smtpSifresi = "123456";
        private static DateTime _baslangicZamani;
        private static DateTime _bitisZamani;
        static void Main(string[] args)
        {
            try
            {
                _baslangicZamani = DateTime.Now;
   dosyayiKopyala(_sunucuKullaniciAdi, _sunucuSifre);
                yedegiYukle(_veritabaniAdi, _yedekDosyaYolu, _sunucuAdi, _veritabaniKullaniciAdi, _veritabaniSifre);
                dosyayiSil(_yedekDosyaYolu);
                _bitisZamani = DateTime.Now;
                epostaYolla(_sunucudakiYedekDosyaYolu);
            }
            catch (Exception ex)
            {
                hatayiYaz(ex);
            }
        }
        private static void epostaYolla(string sunucudakiYedekDosyaYolu)
        {
            EPosta.EPostaYolla(_bilgiEPostaAdresi, "<br />" + sunucudakiYedekDosyaYolu + " yedek dosyasi basariyla yuklendi.<br />Baslangic Zamani: (" + _baslangicZamani.ToString() + ")<br />Bitiş Zamani: (" + _bitisZamani.ToString() + ")", "Yedek Yukleme Islemi", "sql@firmaismi.com.tr", "Sql Yedek", _smtpAdi, _smtpSifresi, new EPostaEki[] { });
        }
        private static void dosyayiKopyala(string username, string password)
        {
            NetworkConnection objNetworkConnection = new NetworkConnection(_sunucuAdresi, new System.Net.NetworkCredential(_sunucuKullaniciAdi, _sunucuSifre, _sunucuDomain), _agYoluHarfi);
            _sunucudakiYedekDosyaYolu = _sunucuAdresi + "\\" + objNetworkConnection.DosyaYolu;
            File.Copy(_sunucudakiYedekDosyaYolu, _yedekDosyaYolu, true);
        }
        private static void dosyayiSil(string yedekDosyaYolu)
        {
            File.Delete(_yedekDosyaYolu);
        }
        private static void yedegiYukle(String databaseName, String backUpFile, String serverName, String userName, String password)
        {
            ServerConnection conn = new ServerConnection(serverName, userName, password);
            conn.StatementTimeout = int.MaxValue;
            //conn.ServerInstance = serverName;
            Server srv = new Server(conn);
            int satir = 0;
            try
            {
                // Generate new FilePath for both Files.
                string fileMdf = System.IO.Path.Combine(srv.MasterDBPath, _fizikselDataDosyasi);
                string fileLdf = System.IO.Path.Combine(srv.MasterDBLogPath, _fizikselLogDosyasi);
                RelocateFile relocateMdf = new RelocateFile(_mantiksalDataDosyasi, fileMdf);
                RelocateFile relocateLdf = new RelocateFile(_mantiksalLogDosyasi, fileLdf);
                Restore res = new Restore();
                res.Devices.AddDevice(backUpFile, DeviceType.File);
                res.RelocateFiles.Add(relocateMdf);
                res.RelocateFiles.Add(relocateLdf);
                res.Database = databaseName;
                res.NoRecovery = false;
                res.ReplaceDatabase = true;
                satir = 1;
                srv.KillAllProcesses(databaseName); // 26.01.2016.
                satir = 2;
                res.SqlRestore(srv);
                satir = 3;
                conn.Disconnect();
            }
            catch (SmoException ex)
            {
                hatayiYaz(ex);
                throw new SmoException("[SmoException]:" + satir + ex.Message, ex.InnerException);
            }
            catch (IOException ex)
            {
                hatayiYaz(ex);
                throw new IOException("[IOException]:" + satir + ex.Message, ex.InnerException);
            }
            catch (Exception ex)
            {
                hatayiYaz(ex);
                throw new Exception("[Exception]:" + satir + ex.Message, ex.InnerException);
            }
        }
        private static void hatayiYaz(Exception ex)
        {
            StreamWriter file = new StreamWriter(_uygulamaDizini + "\\Hata.txt", true);
            file.WriteLine(Environment.NewLine + "=================");
            file.WriteLine("Tarih:" + DateTime.Now.ToString() + Environment.NewLine);
            file.WriteLine("Ex:(" + ex.Message + "), InnerEx:(" + ex.InnerException + ")");
            file.Close();
        }
    }
}


NetworkConnection.cs
using System;
using System.ComponentModel;
using System.IO;
using System.Net;
using System.Runtime.InteropServices;
namespace VtYedekYukleMesajAt
{
    public class NetworkConnection : IDisposable
    {
        #region Private Members
        private string _networkName;
        [DllImport("mpr.dll")]
        private static extern int WNetAddConnection2(NetResource netResource, string password, string username, int flags);
        [DllImport("mpr.dll")]
        private static extern int WNetCancelConnection2(string name, int flags, bool force);
        #endregion Private Members
        #region Public Members
        /// <summary>
        /// 
        /// </summary>
        public string DosyaYolu;
        #endregion Public Members
        #region Constructor
        /// <summary>
        /// 
        /// </summary>
        /// <param name="networkName"></param>
        /// <param name="credentials"></param>
        public NetworkConnection(string networkName, NetworkCredential credentials, string agYoluHarfi)
        {
            _networkName = networkName;
            var netResource = new NetResource()
            {
                Scope = ResourceScope.GlobalNetwork,
                ResourceType = ResourceType.Disk,
                DisplayType = ResourceDisplaytype.Share,
                RemoteName = networkName
            };
            var userName = string.IsNullOrEmpty(credentials.Domain)
                ? credentials.UserName
                : string.Format(@"{0}\{1}", credentials.Domain, credentials.UserName);
            var result = WNetAddConnection2(
                netResource,
                credentials.Password,
                userName,
                0);
            if (result != 0)
            {
                if (result == 1219) // Zaten baglanti var...
                {
                    System.IO.DriveInfo[] drives = System.IO.DriveInfo.GetDrives();
                    foreach (var drive in drives)
                    {
                        if (drive.Name.Equals(agYoluHarfi.Replace("\\", "").Replace(":", "")) && drive.DriveType == DriveType.Network)
                        {
                            DirectoryInfo hdDirectoryInWhichToSearch = new DirectoryInfo(agYoluHarfi);
                            guncelDosyayiBul(hdDirectoryInWhichToSearch);
                            break;
                        }
                    }
                    if (string.IsNullOrEmpty(this.DosyaYolu))
                    {
                        DirectoryInfo hdDirectoryInWhichToSearch2 = new DirectoryInfo(networkName);
                        guncelDosyayiBul(hdDirectoryInWhichToSearch2);
                    }
                }
                else
                {
                    throw new Win32Exception(result, "Error connecting to remote share");
                }
            }
            else
            {
                DirectoryInfo hdDirectoryInWhichToSearch = new DirectoryInfo(networkName);
                guncelDosyayiBul(hdDirectoryInWhichToSearch);
            }
        }
        #endregion Constructor
        #region Private Methods
        private void guncelDosyayiBul(DirectoryInfo hdDirectoryInWhichToSearch)
        {
            FileInfo[] filesInDir = hdDirectoryInWhichToSearch.GetFiles("*" + "VERITABANI" + "*.bak*");
            DateTime oncekiTarih = DateTime.MinValue;
            foreach (FileInfo foundFile in filesInDir)
            {
                if (oncekiTarih != DateTime.MinValue)
                {
                    if (oncekiTarih < foundFile.CreationTime.Date)
                    {
                        this.DosyaYolu = foundFile.Name;
                        oncekiTarih = foundFile.CreationTime.Date;
                    }
                }
                else
                {
                    oncekiTarih = foundFile.CreationTime.Date;
                    this.DosyaYolu = foundFile.Name;
                }
            }
        }
        #endregion Private Methods
        #region Public Methods
        ~NetworkConnection()
        {
            Dispose(false);
        }
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
        protected virtual void Dispose(bool disposing)
        {
            WNetCancelConnection2(_networkName, 0, true);
        }
        #endregion Public Methods
    }
    /// <summary>
    /// 
    /// </summary>
    [StructLayout(LayoutKind.Sequential)]
    public class NetResource
    {
        /// <summary>
        /// 
        /// </summary>
        public ResourceScope Scope;
        /// <summary>
        /// 
        /// </summary>
        public ResourceType ResourceType;
        /// <summary>
        /// 
        /// </summary>
        public ResourceDisplaytype DisplayType;
        /// <summary>
        /// 
        /// </summary>
        public int Usage;
        /// <summary>
        /// 
        /// </summary>
        public string LocalName;
        /// <summary>
        /// 
        /// </summary>
        public string RemoteName;
        /// <summary>
        /// 
        /// </summary>
        public string Comment;
        /// <summary>
        /// 
        /// </summary>
        public string Provider;
    }
    /// <summary>
    /// 
    /// </summary>
    public enum ResourceScope : int
    {
        /// <summary>
        /// 
        /// </summary>
        Connected = 1,
        /// <summary>
        /// 
        /// </summary>
        GlobalNetwork,
        /// <summary>
        /// 
        /// </summary>
        Remembered,
        /// <summary>
        /// 
        /// </summary>
        Recent,
        /// <summary>
        /// 
        /// </summary>
        Context
    };
    /// <summary>
    /// 
    /// </summary>
    public enum ResourceType : int
    {
        /// <summary>
        /// 
        /// </summary>
        Any = 0,
        /// <summary>
        /// 
        /// </summary>
        Disk = 1,
        /// <summary>
        /// 
        /// </summary>
        Print = 2,
        /// <summary>
        /// 
        /// </summary>
        Reserved = 8
    }
    /// <summary>
    /// 
    /// </summary>
    public enum ResourceDisplaytype : int
    {
        /// <summary>
        /// 
        /// </summary>
        Generic = 0x0,
        /// <summary>
        /// 
        /// </summary>
        Domain = 0x01,
        /// <summary>
        /// 
        /// </summary>
        Server = 0x02,
        /// <summary>
        /// 
        /// </summary>
        Share = 0x03,
        /// <summary>
        /// 
        /// </summary>
        File = 0x04,
        /// <summary>
        /// 
        /// </summary>
        Group = 0x05,
        /// <summary>
        /// 
        /// </summary>
        Network = 0x06,
        /// <summary>
        /// 
        /// </summary>
        Root = 0x07,
        /// <summary>
        /// 
        /// </summary>
        Shareadmin = 0x08,
        /// <summary>
        /// 
        /// </summary>
        Directory = 0x09,
        /// <summary>
        /// 
        /// </summary>
        Tree = 0x0a,
        /// <summary>
        /// 
        /// </summary>
        Ndscontainer = 0x0b
    }
}


EPosta.cs
using System;
using System.IO;
using System.Net.Mail;
using System.Text;
namespace VtYedekYukleMesajAt
{
    public class EPosta
    {
        public static string UygulamaDizini = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
        public static void EPostaYolla(string to, string body, string subject, string fromAddress, string fromDisplay, string credentialUser, string credentialPassword, params EPostaEki[] attachments)
        {
            string host = "mail.firmaismi.com.tr";
            //body = UpgradeEmailFormat(body);
            try
            {
                MailMessage mail = new MailMessage();
                mail.Body = body;
                mail.IsBodyHtml = true;
                mail.To.Add(new MailAddress(to));
                mail.From = new MailAddress(fromAddress, fromDisplay, Encoding.UTF8);
                mail.Subject = subject;
                mail.SubjectEncoding = Encoding.UTF8;
                mail.Priority = MailPriority.Normal;
                foreach (EPostaEki ma in attachments)
                {
                    mail.Attachments.Add(ma.File);
                }
                SmtpClient smtp = new SmtpClient();
                smtp.Credentials = new System.Net.NetworkCredential(credentialUser, credentialPassword);
                smtp.Host = host;
                smtp.Send(mail);
            }
            catch (Exception ex)
            {
                StringBuilder sb = new StringBuilder();
                sb.Append("\nTo:" + to);
                sb.Append("\nbody:" + body);
                sb.Append("\nsubject:" + subject);
                sb.Append("\nfromAddress:" + fromAddress);
                sb.Append("\nfromDisplay:" + fromDisplay);
                sb.Append("\ncredentialUser:" + credentialUser);
                sb.Append("\ncredentialPasswordto:" + credentialPassword);
                sb.Append("\nHosting:" + host);
                sb.Append("\nException:" + ex.Message);
                // Write the string to a file.
                StreamWriter file = new StreamWriter(UygulamaDizini + "\\Hata.txt", true);
                file.WriteLine(Environment.NewLine + "=================");
                file.WriteLine("Tarih:" + DateTime.Now.ToString() + Environment.NewLine);
                file.WriteLine(sb.ToString());
                file.Close();
                //ErrorLog(sb.ToString(), ex.ToString(), ErrorLogCause.EmailSystem);
            }
        }
    }
}


Saygılar...
# Kategoriler : C# Sql Server Veritabanı Yazılım
# Etiketler : Etiket Yok
# Yorumlar : 0 Yorum Yorum Yaz

Yorumlar

Yorum Eklenmemiş...

Yorum Yaz

Adınız: *
E-Mail Adresiniz: *
Web Sitesi:
Yorum: *
Güvenlik Kodu: *
 
Arama
  Ara
Sayfalar
Takvim
<Temmuz 2017>
PSÇPCCP
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456
Bağlantılar