Restoring SQL Server System Databases

May 8, 2019

 

לא בכל יום מזדמן לנו (אם בכלל), לבצע פעולת שחזור לקבצי System Databases.

לכן, רואה לנכון לשתף אתכם בחוויה זו אשר כללה מספר הפתעות בדרך..

 


אז לאחרונה נתקלתי במשימה מאתגרת – Restore System Databases !

הסיבה לכך - אחד ממערכי הווירטואליזציה של אחד מלקוחותיי הותקף על ידי וירוס רציני והשבית את הישויות הבאות:
 

  • שרת ה-Host.

  • שרתים וירטואליים אחרים אשר מותקנים על גבי ה-Host, ביניהם שרת SQL.

  • גיבויי ה-Snapshots של המכונות נפגעו (מזל שגיבויי ה-DBs היו זמינים ממקור אחסון אחר).


תחילה, הכין עבורי הלקוח שרת חדש עם מערכת הפעלה נקייה וביקש שאחזיר את השרת למצבו האחרון עם כל ההגדרות, ג'ובים ובסיסי הנתונים השונים.

 

שלב 1: ביצוע התקנה נקייה של SQL Server 2016

  • חובה להתקין את גרסת ה-SQL בהתאם לזו שהייתה מותקנת לפני התקלה (כולל העדכונים).
    אל דאגה - במידה ואינך זוכר את הגרסה המדויקת שהותקנה, בהמשך המדריך תתקבל הודעת שגיאה אשר תציג את הגרסה הנדרשת :-)

     

שלב 2: שחזור System Databases

  • נעצור את הסרביסים הפעילים של ה-SQL.

  • כעת נתחיל בשחזור master database.

  • נעביר את ה-SQL Server למצב single mode ע"י הוספת הפרמטר (m-) במסך ה-SQL Server Configuration.

  • נפעיל את ה-Service של ה-SQL Server.

  • על מנת להיכנס למסך Query של SQL, נפתח מסך תוכנת CMD ונרשום את הפקודה:

        sqlcmd – S ServerName

    • יש להחליף את ServerName עם שם השרת.
       

  • כעת נרשום פקודה עבור Restore Database:

RESTORE database master from disk = 'C:\Temp\master.bak' with replace;

 

אופססס... חטפנו שגיאה – הגיבוי של ה-master האחרון היה בגרסה מתקדמת יותר של ה-SQL.

  • גרסה נוכחית מההתקנה: 13.00.1601

  • גרסה נדרשת: 13.00.4001
     

כעת נתקין את הגרסה הנדרשת. במקרה הזה נדרש להתקין את ה-Build הנכון.

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

https://sqlserverbuilds.blogspot.com/

 

 

  • נחזור שוב על פעולת ה-Restore וכעת הפעולה הצליחה ! 
     


** טיפ **

  • להוסיף לשם קובץ הגיבוי של ה-master (או בכלל) את נתוני גרסת ה-SQL שברשותכם.
    זה ייקצר זמנים ויחסוך תסכולים :-) 

  • להלן קטע קוד:

/******************************************
    Step-1: Preparing Variables
******************************************/

    -- Variables:

DECLARE @timestamp VARCHAR(255)

                ,@path VARCHAR(255)
                ,@SQLVersion varchar(50);

 

    -- Timestamp:  

SET @timestamp = REPLACE(CONVERT(VARCHAR(255), GETDATE(), 20) ,':','-');

 

    -- SQL Version:
        ;WITH GetSQLVersion
            AS (
                SELECT    CASE 
                            WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('productversion')) like '8%' THEN 'SQL2000'
                            WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('productversion')) like '9%' THEN 'SQL2005'
                            WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('productversion')) like '10.0%' THEN 'SQL2008'
                            WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('productversion')) like '10.5%' THEN 'SQL2008 R2'
                            WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('productversion')) like '11%' THEN 'SQL2012'
                            WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('productversion')) like '12%' THEN 'SQL2014'
                            WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('productversion')) like '13%' THEN 'SQL2016'     
                            WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('productversion')) like '14%' THEN 'SQL2017' 
                            ELSE 'unknown'
                        END AS MajorVersion
                  ,SERVERPROPERTY('ProductLevel') AS ProductLevel
                  ,SERVERPROPERTY('ProductVersion') AS ProductVersion
                )
        SELECT @SQLVersion = REPLACE (CONVERT(VARCHAR(20), MajorVersion)
                                    +'_'+CONVERT(VARCHAR(20), ProductLevel)
                                    +'_'+CONVERT(VARCHAR(20), ProductVersion)
                                , '.', '-')
        FROM GetSQLVersion;

 

-- Full Backup Path Include Date and SQL Version:
        SET @path = 'H:\Temp\master_'+ @SQLVersion +'_'+ @timestamp +'.bak';

/******************************************
    Step-2: Execute Backup Database
******************************************/

        BACKUP DATABASE [master] TO DISK = @path ;  
     

 

 

 

שלב 3: הפעלה וחיבור ל-SQL Server

  • בשלב זה ה-סרביס של ה-SQL נמצא במצב Stopped.

  • כעת נסיר את הפרמטר m- ונפעיל את הסרביס.

  • התקבלה השגיאה הבאה:

  • מבדיקת השגיאה ביומן האירועים של השרת עולה כי בבסיס הנתונים - master, אשר מכיל מידע שהיה מוגדר לפני התקלה, מוגדרים הנתיבים של שאר קבצי System Databases לנתיבים אחרים.

  (שגיאה זו הופיעה עבור model, msdb ו-tempdb).

 

לכן, כדי לפתור את הבעיה עליי לבצע:

  • יצירת הנתיב המבוקש.

  • מתן הרשאה מלאה על הנתיב לחשבון שמריץ את הסרביס של ה-SQL.

  • להפעיל שוב את הסרביס של ה-SQL.

  • וכעת ה-SQL מתחבר !

  • בשלב זה ניתן לשחזר את שאר User Databases שהיו קיימים בשרת.
     

** טיפ **

  • לאחר שה-SQL עלה, ניתן לשנות את נתיבי קבצי ה-Database לפי המדריכים הבאים:

 

שיהיה בהצלחה !
עידן גורן.

 

 

 

Please reload

Featured Posts

I'm busy working on my blog posts. Watch this space!

Please reload

Recent Posts

October 31, 2017

October 29, 2017

Please reload

Archive
Please reload

Search By Tags