Restoring SQL Server System Databases
לא בכל יום מזדמן לנו (אם בכלל), לבצע פעולת שחזור לקבצי 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 הנכון.
כדי לעשות זאת נגלוש לקישור הבא, נאתר את הגרסה הנדרשת (ראה בדוגמה מתחת בצהוב) ונוריד את קבצי העדכונים הנדרשים:
נחזור שוב על פעולת ה-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 שהיו קיימים בשרת.
** טיפ **
שיהיה בהצלחה ! עידן גורן.