Back Up and Restore database from code

9 בספטמבר 2013

תגיות: ,
אין תגובות

בעבר הצגתי (צילומי מסך) של תהליך הגיבוי ושיחזור של בסיס נתונים, לעיתים יש צורך לעשות מקוד.

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

(קוד המקור להורדה)

להלן דוגמה לקוד הזה (בסיס הקוד לגיבוי ושיחזור נלקח מכאן)

נכתוב קוד html פשוט מאוד עבור הדוגמא

Code Snippet
<form action="@Url.Action("Process", "Home")" method="post">
    <input type="file" name="file" />
    <input type="submit" />
</form>

<hr />

<form action="@Url.Action("Restore", "Home")" method="post">
    <select name="file">
        <option>Select File</option>
        @foreach (var item in ViewBag.Files)
        {
            <option>@item</option>
        }
    </select>

    <input type="submit" />
</form>

נגדיר טופס שבזמן לחיצה על submit יפעיל תהליך בשרת בשם Process וישלח כפרמטר את הקובץ (כמובן בדוגמא שלנו נתעלם ממנו לחלוטין)

בנוסף יהיה עוד טופס אשר מציג את כל שמות הקבצים לשחזור (שם הקובץ יהיה תאירך השיחזור) לחיצה על submit תשחזר את הקובץ.

 

נעבור לצד שרת.

ראשית נראת את מתודת Index אשר אליה המשתמש גולש

Code Snippet
public ActionResult Index()
{
    ViewBag.Files = GetFiles();
    return View();
}

private string[] GetFiles()
{
    string directory = Server.MapPath("~/backup");
    if (!Directory.Exists(directory))
    {
        Directory.CreateDirectory(directory);
    }

    DirectoryInfo dir = new DirectoryInfo(directory);
    string[] names = dir.GetFiles("*.bak").Select(x => x.Name).ToArray();
    return names;
}

נשמור ב – ViewBag את רשימת הקבצים אשר נקבל אותם מתוך תיקיית backup בספריית השורש של האתר.

מתודת Process תקבל את הקובץ ותבצע גיבוי לבסיס הנתונים.

Code Snippet
public ActionResult Process(HttpPostedFileBase file)
{
    //file.SaveAs("");……

    ServerConnection con = new ServerConnection(@".");
    smo.Server server = new smo.Server(con);
    smo.Backup source = new smo.Backup();
    source.Action = smo.BackupActionType.Database;
    source.Database = "g";
    string fileName = Server.MapPath("~/Backup/" + DateTime.Now.ToString("dd-MM-yyyy hh-mm") + ".bak");
    smo.BackupDeviceItem destination = new smo.BackupDeviceItem(fileName, smo.DeviceType.File);
    source.Devices.Add(destination);
    source.SqlBackup(server);
    con.Disconnect();

    return RedirectToAction("Index");
}

ה – ctor של ServerConnection יודע כמובן לקבל שם משתמש וסיסמא, הקידומת של smo זה קיצור דרך (המוגדר ב – using) של Microsoft.SqlServer.Management.Smo.

כעת פשוט נבצע backup ונחזור לדף (נוכל לראות ב – select את הקובץ החדש שנוצר)

 

מתודת Restore תבצע שחזור של המידע

Code Snippet
public ActionResult Restore(string file)
{
    file = Server.MapPath("~/Backup/" + file);
    if (System.IO.File.Exists(file))
    {
        ServerConnection con = new ServerConnection(@".");
        smo.Server server = new smo.Server(con);
        smo.Restore destination = new smo.Restore();
        destination.Action = smo.RestoreActionType.Database;
        destination.Database = "g";
        destination.Restart = true;
        smo.BackupDeviceItem source = new smo.BackupDeviceItem(file, smo.DeviceType.File);
        destination.Devices.Add(source);
        destination.ReplaceDatabase = true;
        destination.SqlRestore(server);
    }

    return RedirectToAction("Index");
}

נקבל את שם הקובץ, נמצא את הנתיב המלא ובמידה והקובץ קיים נשחזר אותו (השורה שבה אנחנו מבצעים Restart לבסיס הנתונים, חשובה, אחרת נוכל להכשל אם מישהו מחובר לבסיס הנתונים)

צריך את ה – dlls הבאים:

Microsoft.SqlServer.ConnectionInfo.dll
Microsoft.SqlServer.Management.Sdk.Sfc.dll
Microsoft.SqlServer.Smo.dll
Microsoft.SqlServer.SmoExtended.dll

 
הם נמצאים C:\Program Files\Microsoft SQL Server\VERSION\SDK\Assemblies
הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *