יום שבת, 2 באפריל 2011

Mssql BackUp Application From Sketch

חשבתי רבות מה הדרך לעשות גיבויים עבור שרתי Mssql, תחילה הפתרון הפשוט להגדיר הגדרות של גיבויים ב Mssql עצמו, אבל רציתי יותר , רציתי לשמור כמה גרסאות של גיבויים לכל ה Databases שאני רוצה לגבות ע"פ זמנים שאני אקבע, רציתי גם לשמור לי את העותק של הגיבוי ע"ג שרת אחר ברשת שלי, רציתי גם לחסוך במקום ולקבץ את הקבצים בקיצור היו לי שאיפות.

אז תחילה ההיתי צריך לגבש מה בדיוק אני רוצה שהתוכנית תעשה, בהתחלה זה היה נראה דבר מאוד מובן לבצע גיבוי פשוט של ה Database אבל מה עם יכולת השליטה על מנגנון הגיבוי? , לכן דבר ראשון שחיפשתי זה שליטה, האפשרות להגיד למסד נתונים בצורה תכנותית - אני רוצה לגבות אותך אבל מרחוק... - אבל לפני הכל ההיתי צריך להבין איך מנגנון הגיבוי עובד במסדי נתונים מסוג Mssql.

אפשרויות גיבוי בעזרת Microsoft Sql Server 2005 :
בחנתי את צורת הגיבוי ב Mssql , זה נראה פשוט מאוד, לחצן ימני על ה Database שאנחנו רוצים לגבות:


השלב הבא הוא להגדיר לאן לשמור את קובץ ה Bak שזה פורמט הגיבוי עבור Mssql.

אין יותר מידי אפשרויות בוחרים נתיב לקובץ מומלץ שסוג הגיבוי יהיה Full, נותנים שם לגיבוי, וניתן להגדיר לו תוקף ע"פ ימים או תאריכים ספציפיים, אפשר להגיד שבגדול זה כל מה שצריך בתוכנת גיבוי ואלה הן התכונות העיקריות, שליטה על הזמנים היא גורם משפיע בכל הקשור למסדי נתונים הצורך להיות עם הנתונים המעודכנים ביותר הוא בלתי נמנע ולכן אפשרות זאת היא קריטית עבורי.


אבל מה בעצם לא ראיתי?
לא ראיתי את האפשרות לשמור לי גרסאות שונות ואם יש לי הרבה Databases העסק יכול להיות מסורבל, מה קורה אם אני רוצה לעשות זאת אוטומטי משרת מרוחק, ואולי גם לקבץ לי אותו ב Zip על הדרך ולשלוח לי אימייל כאשר הגיבוי התבצע, המון מחשבות רצו לי בראש ונראה לי שאני מתחיל להבין מה אני רוצה מהתוכנית הגיבויים שלי.
דרך נוספת שבדקתי היא אפשרות לגבות את הנתונים בעזרת משפט Sql , זה נראה אפשרי בעזרת הדוגמה הזאת:
BACK UP DATABASE db_name TO DISK = N'C:\backup\db_name.BAK'
אבל חסר לי פה מעקב על התהליך אני אף פעם לא יודע מתי הוא סיים ואם הוא סיים לגבות לכן הרעיון להשתמש במשפט Sql ירד משולחן הסירטוטים וההיתי צריך לחפש כיוון אחר...
הישועה הגיעה מה Mssql עצמו מסתבר של Mssql יש SDK רחב מאוד שתומך ב NET. מגרסה 2, יש מספר ספריות שנתנות לנו את האפשרות לשלוט ב Sql Agent שזה הוא ה Service שמנהל לנו את מסדי הנתונים.
Microsoft.SqlServer.ConnectionInfo
ספריה זאת אחראית על ההתחברות והאימות מול השרת.
 
Microsoft.SqlServer.Smo
מכיל מופע למנוע של ה Mssql , ובעצם זאת המחלקה העיקרית שנעבוד מולה.
 
מיקום הקבצים:
 
C:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.Smo\9.0.242.0__89845dcd8080cc91
 
בנקודה זאת הבנתי שמצאתי את מה שאני מחפש, את השליטה , חזרתי לשולחן הסירטוטים והתחלתי לעצב את הרעיון של התוכנית.
 
 
שרת אחד מפעיל בתוכו תוכנית שמתחברת מרחוק למספר שרתים שמריצים Sql Server , בעזרת פקודה מרחוק השרתים מגבים את מסדי הנתונים ישירות ליחידת גיבוי, בשלב הזה הכל כבר נראה ברור , הרעיון שלי מגובש ואפשר להתחיל לכתוב את הקוד, במאמר זה אני יתאר את הקוד שמגבה בלבד למרות שהעלתי עוד רעיונות שיכולים להתלבש על המנגנון הזה אבל אותם אני אשמור לפעם אחרת.

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;
namespace backup_mssql
{
   class Program
  {
    static void Main(string[] args)
    {
      BackupDeviceItem bdi = new BackupDeviceItem(@"\\storageunit\backup.bak",DeviceType.File);
      Backup bu = new Backup();
      bu.Database = "mydatabase";
      bu.Devices.Add(bdi);
      bu.Initialize = true;
      
      bu.PercentComplete += new PercentCompleteEventHandler(Backup_PercentComplete);
      bu.Complete +=new ServerMessageEventHandler(Backup_Complete);
     
      ServerConnection myconnection = new ServerConnection("192.1.1.1","username","password");
      Server server = new Server(myconnection);
      bu.SqlBackup(server);
      Console.WriteLine("Press any key to continue.");
      Console.ReadKey();
     }

     protected static void Backup_PercentComplete(object sender, PercentCompleteEventArgs e)
    {
      Console.WriteLine(e.Percent + "%.");
    }
   
    protected static void Backup_Complete(object sender, ServerMessageEventArgs e)
    {
      Console.WriteLine(e.ToString());
    }
  }
}

מעבר זריז על קוד מאפשר לנו לראות שתחילה אנחנו מגדירים Device , שבעצם מצביע לנתיב גיבוי חדש ע"ג יחידה חיצונית ברשת, קיימים 2 אירועים - קבלת האחוזים עד להשלמת התהליך , וסיום התהליך, קיימת נקודה חשובה בנוגע ל Device חשוב לזכור שה Sql Server Agent רץ עם הרשאות משלו ולפעמים לא ניתן לרשום את הגיבוי ליעד בגלל הרשאות כתיבה, לכן חשוב מאוד שכל ה Services של ה Mssql ירוצו עם הרשאות שמאפשרות כתיבה ליחידת גיבוי.

כפתור ימני על ה Service של Sql Server Agent אח"כ Log On יאפשר לנו להחליף את ההרשאות של ה Service למשתמש אחר.

בהצלחה...

אין תגובות:

הוסף רשומת תגובה