---恢復內容開始---web
如何作到將客戶服務器數據庫的備份,下載到本地的雲服務上? 在開發這個程序中中途也遇到了一下問題,下面我將本身如何進解決的辦法寫出來供你們參考。數據庫
一.首先我須要進行描述一下問題:安全
1.好比有兩臺服務器A,B(雲服務器) 將A中的服務器中的數據庫的備份進行下載到B的雲服務中並保存。服務器
2.固然這臺A服務器的外網是能夠進行訪問,若是外網訪問不了的話,那也是沒有辦法的。ide
3.而後在B服務器中按期的進行刪除數據庫備份,定時的下載。並進行保存最新一個星期的數據庫備份。測試
4.在雲服務須要保存最新的數據庫備份,固然不止一個數據庫備份了,並進行按期的刪除以及下載。url
二:遇到的一些問題:spa
1.WebServices安全通道創建信任關係的異常。
日誌
2.數據庫備份過大問題,沒法下載。採用文件流的方式進行壓縮。code
3.在作定時刪除以及下載的程序的時候使用Windows服務開發仍是使用控制檯而後掛在任務計劃程序上。
4.如何進行讀或者取數據庫備份。經過FilesGetter.GetFiles(_fileDir, filter)方法。
5.壓縮問題等等。應用BZip2.Compress(srcFile, zipFile, 8192);進行壓縮以8M爲一個壓縮塊。
6.備份策略,天天,每週,每個月。應用任務計劃程序。
二:須要的使用那些技術:
1.通過考慮了一下須要建立一個WebServices。
2.須要建立3個控制檯應用程序其中分別包括(下載控制檯應用程序,刪除的控制檯應用程序,壓縮的控制檯應用程序)。
3.文件流的使用,webClient 的應用等等
三:整個下載過程的流程圖
四:各個模塊的代碼
1.先進行經過控制檯應用程序進行對客戶服務器的數據庫備份進行壓縮。
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 string fileDir = Properties.Settings.Default.DB_FILE_PATH;//客戶的服務器的數據庫備份文件的路徑
6
7 string saveCompress = Properties.Settings.Default.DB_COMPRESS_PATH; 8 try
9 { 10 #region 1.數據庫文件所在服務器的目錄的位置
11 if (string.IsNullOrEmpty(fileDir) || !Directory.Exists(fileDir)) 12 { 13 throw new Exception("配置文件目錄不正確,請檢查" + fileDir); 14 } 15 #endregion
16 #region 2.進行獲取其中的壓縮後的全部的文件
17 string[] dir = new string[] { "*.001" }; 18 List<string> dbFileUrl = new List<string>(); 19 if (dir != null) 20 { 21 foreach (var filter in dir) 22 { 23 dbFileUrl.AddRange(FilesGetter.GetFiles(fileDir, filter)); 24 } 25 } 26 #endregion
27 #region 3.引用第三方進行壓縮文件並將文件放到指定的壓縮的目錄下面
28 if (dbFileUrl != null) 29 { 30 foreach (var url in dbFileUrl) 31 { 32 //引用第三方的ZIP壓縮的方法進行壓縮文件並將壓縮的文件進行保存到客戶的服務器的指定的目錄下面
33 string zipDownUrl = saveCompress + Path.GetFileName(url) + ".rar"; 34 //進行壓縮文件越大那麼壓縮的時間越長
35 if (url != null && zipDownUrl != null) 36 { 37 Console.WriteLine("數據庫{0}文件{1}壓縮開始", Path.GetFileName(url),DateTime.Now); 38 if (BZipFile(url, zipDownUrl) == true) 39 { 40 using (StreamWriter sw = new StreamWriter(saveCompress + "數據庫備份壓縮日誌.txt", true)) 41 { 42 sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "數據庫備份壓縮開始" + "數據庫的備份的文件壓縮的文件的名稱:" + Path.GetFileName(url) + "數據庫備份壓縮的路徑:" + fileDir); 43 } 44 Console.WriteLine("數據庫{0}文件{1}壓縮結束", Path.GetFileName(url), DateTime.Now); 45 } 46 else
47 { 48 Console.WriteLine("數據庫文件壓縮失敗!"); 49 } 50 } 51 else
52 { 53 Console.WriteLine("數據庫文件壓縮失敗!"); 54 } 55 } 56 //當全部的數據庫備份文件壓縮完成後那麼將壓縮的日誌進行寫入到記事本中
57 using (StreamWriter sw = new StreamWriter(saveCompress + "數據庫備份壓縮日誌.txt", true)) 58 { 59 sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "數據庫備份壓縮結束"); 60 } 61 } 62
63 #endregion
64 } 65 catch(Exception ex) 66 { 67 //將數據庫備份的日誌寫入到記事本中去
68 using (StreamWriter sw = new StreamWriter(saveCompress + "數據庫備份壓縮日誌.txt", true)) 69 { 70 sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "數據庫備份的壓縮中進行捕捉的異常" + ex.Message); 71 } 72 } 73
74 } 75
76 /// <summary>
77 ///進行壓縮數據庫的備份的文件 78 /// </summary>
79 /// <param name="sourcefilename"></param>
80 /// <param name="zipfilename"></param>
81 /// <returns></returns>
82 public static bool BZipFile(string sourcefilename, string zipfilename) 83 { 84 bool blResult;//表示壓縮是否成功的返回結果 85 //爲源文件建立文件流實例,做爲壓縮方法的輸入流參數
86 FileStream srcFile = File.OpenRead(sourcefilename); 87 //爲壓縮文件建立文件流實例,做爲壓縮方法的輸出流參數
88 FileStream zipFile = File.Open(zipfilename, FileMode.Create); 89 try
90 { 91 //以8192節做爲一個塊的方式壓縮文件8M一塊進行壓縮
92 BZip2.Compress(srcFile, zipFile, 8192); 93 blResult = true; 94 } 95 catch (Exception ex) 96 { 97 Console.WriteLine(ex.Message); 98 blResult = false; 99 } 100 srcFile.Close();//關閉源文件流
101 zipFile.Close();//關閉壓縮文件流
102 return blResult; 103 } 104 }
2.讀取客戶服務器數據庫的備份壓縮文件的名稱,經過拼接一個下載的路徑URL,返回多個數據庫備份文件路徑的集合。
1 namespace DBDownLoad.Server.Services 2 { 3 /// <summary>
4 /// Summary description for DbFileProvider 5 /// </summary>
6 [WebService(Namespace = "http://tempuri.org/")] 7 [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 8 [System.ComponentModel.ToolboxItem(false)] 9 public class DbFileProvider : System.Web.Services.WebService 10 { 11 private static string _fileDir; 12 private static string _rootUrl; 13 [WebMethod] 14 public List<string> GetDbFile() 15 { 16 //對方客戶的數據庫文件所在服務器的目錄的位置
17 _fileDir = System.Configuration.ConfigurationManager.AppSettings["DbBackupFilePath"]; 18 //實現文件下載地址的拼接 將全部的數據庫的文件進行下載後而後進行其中的文件的拼接。
19 _rootUrl = System.Configuration.ConfigurationManager.AppSettings["DbBackupFileRootUrl"]; 20 #region 1.數據庫文件所在服務器的目錄的位置
21 List<string> displayUrlList = new List<string>(); 22 if (string.IsNullOrEmpty(_fileDir) || !Directory.Exists(_fileDir)) 23 { 24 throw new Exception("配置文件目錄不正確,請檢查" + _fileDir); 25 } 26 #endregion
27 #region 2.肯定其中的文件是否下載成功
28 string[] txt = new string[] { "*.txt" }; 29 List<string> dbTxt = new List<string>(); 30 if (txt != null) 31 { 32 foreach (var items in txt) 33 { 34 dbTxt.AddRange(FilesGetter.GetFiles(_fileDir, items)); 35 } 36 } 37 #endregion
38 if (dbTxt.Count()>0) 39 { 40 #region 3.進行獲取其中的壓縮後的全部的文件
41 string[] dir = new string[] { "*.rar" }; 42 List<string> dbFileUrl = new List<string>(); 43 if (dir != null) 44 { 45 foreach (var filter in dir) 46 { 47 dbFileUrl.AddRange(FilesGetter.GetFiles(_fileDir, filter)); 48 } 49 } 50 #endregion
51 #region 4.進行獲取備份文件的文件名和時間的集合
52 List<DBNameAndTime> dbFileNameList = new List<DBNameAndTime>(); 53 if (dbFileUrl != null) 54 { 55 foreach (var url in dbFileUrl) 56 { 57 FileInfo fi = new FileInfo(url); 58 DBNameAndTime file = new DBNameAndTime(); 59 file.FileName = fi.Name;// 文件名
60 file.FileTime = fi.LastWriteTime;// 文件時間
61 file.Url = url; 62 //進行獲取數據庫名稱
63 var strArr = fi.Name.Split('.'); 64 if (strArr.Length > 0) 65 { 66 //分離其中的文件的名稱
67 file.DataName = strArr[0].ToString(); 68 } 69 if (file != null) 70 { 71 dbFileNameList.Add(file); 72 } 73 } 74 } 75 #endregion
76 #region 5.進行獲取備份文件的數據庫名稱的集合
77 List<string> dataNameList = new List<string>(); 78 foreach (var item in dbFileNameList) 79 { 80 if (!dataNameList.Contains(item.DataName)) 81 { 82 dataNameList.Add(item.DataName); 83 } 84 } 85 #endregion
86 #region 6.進行遍歷數據庫名稱集合,獲取到每一個數據庫備份的最新的文件路徑
87
88 foreach (var dataName in dataNameList) 89 { 90 //第一步將每一個數據庫的備份找出來
91 List<DBNameAndTime> tempList = new List<DBNameAndTime>(); 92 foreach (var fileName in dbFileNameList) 93 { 94 if (dataName == fileName.DataName) 95 { 96 tempList.Add(fileName); 97 } 98 } 99 //第二步篩選出最新的文件
100 var newFile = tempList.OrderByDescending(a => a.FileTime).FirstOrDefault(); 101
102 //第三步將最新的文件的路徑添加到要下載的集合中
103 if (newFile != null) 104 { 105 //進行返回下載的文件的URL的壓縮包格式的文件
106 string downUrl = newFile.DownUrl; 107 displayUrlList.Add(downUrl); 108 } 109 } 110 #endregion
111 } 112 return displayUrlList; 113 } 114
115 //進行聲明備份數據庫的類
116 public class DBNameAndTime 117 { 118 private string fileName; 119 /// <summary>
120 /// 文件名稱 121 /// </summary>
122 public string FileName { get { return fileName; } set { fileName = value; } } 123
124 private DateTime fileTime; 125 /// <summary>
126 /// 文件的最後修改時間 127 /// </summary>
128 public DateTime FileTime { get { return fileTime; } set { fileTime = value; } } 129
130 private string dataName; 131 /// <summary>
132 /// 數據庫名稱 133 /// </summary>
134 public string DataName { get { return dataName; } set { dataName = value; } } 135
136 private string url; 137 /// <summary>
138 /// 文件路徑 139 /// </summary>
140 public string Url { get { return url; } set { url = value; } } 141
142 public string DownUrl { get { return _rootUrl + fileName; } } 143 } 144 } 145 }
3.建立控制檯應用程序進行遠程下載經過獲取WebServices 返回的List<string> 進行下載
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 //經過代碼進行創建SSL認證關係不然會出現未能爲 SSL/TLS 安全通道創建信任關係.
6 ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true; 7 ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(delegate { return true; }); 8 WebClient client = new WebClient(); 9 DbFileUrlProviderSvc.DbFileProviderSoapClient svcClient = new DbFileUrlProviderSvc.DbFileProviderSoapClient(); 10 DbFileUrlProviderSvc.ArrayOfString latstFileUrlArray = svcClient.GetDbFile(); 11 string receivePath = Properties.Settings.Default.LOCAL_PATH;//公司的雲服務器保存下載文件的路徑
12 try
13 { 14 // 對從svc取出的url循環下載獲取最新的文件
15 if (receivePath != null) 16 { 17 if (latstFileUrlArray != null) 18 { 19 foreach (var downloadPath in latstFileUrlArray.ToList()) 20 { 21 //將下載的文件進行保存到指定的文件夾
22 if (downloadPath != null) 23 { 24 //將數據庫備份的日誌寫入到記事本中去
25 using (StreamWriter sw = new StreamWriter(receivePath + "數據庫下載的日誌.txt", true)) 26 { 27 sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "數據庫備份下載開始:" + "下載的路徑:" + downloadPath + "接收的路徑:" + receivePath + "下載文件的名稱:" + Path.GetFileName(downloadPath)); 28 } 29 //下載數據庫備份文件
30 Console.WriteLine("數據庫備份壓縮包下載開始{0}!", DateTime.Now.ToString("yyyy-MM-dd-HH:mm:ss")); 31 client.DownloadFile(downloadPath, receivePath + Path.GetFileName(downloadPath)); 32 Console.WriteLine("恭喜你備份{0}文件時間{1}下載完成,進入本地{2}下面進行查看!", Path.GetFileName(downloadPath), DateTime.Now.ToString("yyyy-MM-dd-HH:mm:ss"), receivePath); 33 } 34 } 35 } 36 } 37 } 38 catch(Exception ex) 39 { 40 //將數據庫備份的日誌寫入到記事本中去
41 using (StreamWriter sw = new StreamWriter(receivePath + "數據庫下載的日誌.txt", true)) 42 { 43 sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "數據庫備份下載中進行捕捉的異常:"+ex.Message); 44 } 45 } 46
47 } 48
49 }
4.當所用的程序開發完畢後那麼就能夠進行測試了,首先須要進行在任務計劃程序中進行部署計劃任務將.exe 程序添加其中,並進行設置肯定的時間。
5.當所用的計劃任務程序都進行部署完成後那麼須要將webServices進行託管到IIS上。
6.當這些任務完成後那麼就能夠了下載數據庫備份了。
7.下一篇博客我將介紹一下如何解決按期的刪除數據庫的備份文件以及按期刪除其餘文件問題 。 以上內容均屬於原創,轉載請標明。謝謝! - 2016.11.17