Why should you monitor corruption alerts

October 10, 2016

 

 ארז חסמן, DBA בחברה פנסיונית.

 

לפני כמה שנים, הרצתי סקריפט מבית ברנט אוזר sp_Blitz,

בתוצאות הופיעה שורה המצביעה שכדאי לנתר ע"י Alerts הודעות מסוג 823-825 -

וכך עשיתי.

 

השבוע קיבלתי הודעה למייל - Error 824 Unknown Hardware or System Problem

SQL Server detected a logical consistency-based I/O error: incorrect checksum (expected: 0x88679fd4; actual: 0x60a95cea). It occurred during a read of page (1:17875757) in database ID 9 at offset 0x0000221865a000 in file 'D:\Data\XXX.mdf'.  Additional messages in the SQL Server error log or system event log may provide more detail. This is a severe error condition that threatens database integrity and must be corrected immediately. Complete a full database consistency check (DBCC CHECKDB). This error can be caused by many factors; for more information, see SQL Server Books Online.

ההודעה התריאה שבדיקתchecksum  נפלה בקובץ - D:\Data\XXX.mdf. ויש חשד לדף פגום - 1:17875757 (FileID:PageID).

 

שלבים לפתרון הבעיה:

1. מציאת האוביקט החשוד כבעייתי בעזרת DBCC PAGE :

גיליתי שהאובייקט הוא טבלת dbo.Y  על האינדקס הראשי CLUSTERED שגודלה הוא כ10GB.

DBCC PAGE(Database-ID, File-ID, Page-ID)

DBCC TRACEON (3604);

DBCC PAGE (9, 1, 17875757);

DBCC TRACEOFF (3604);

2. בדיקת הטבלה החשודה

ביצעתי CHECKTABLE על ה- Clustered Index ולאחר כשעה חזר הפלט הבא –

 

DBCC CHECKTABLE ("Table Name", @indid);

DBCC CHECKTABLE ('dbo.Y', 1);

 

 

Msg 8909, Level 16, State 1, Line 1

Table error: Object ID 0, index ID -1, partition ID 0, alloc unit ID 0 (type Unknown), page ID (1:17875759) contains an incorrect page ID in its page header. The PageId in the page header = (0:0).

CHECKTABLE found 0 allocation errors and 2 consistency errors not associated with any single object.

Msg 8980, Level 16, State 1, Line 1

Table error: Object ID 382624406, index ID 1, partition ID 72057594260946944, alloc unit ID 72057594269532160 (type In-row data). Index node page (1:32688937), slot 255 refers to child page (1:17875758) and previous child (1:17875757), but they were not encountered.

DBCC results for 'Y'.

There are 29862480 rows in 1390854 pages for object "dbo.Y".

CHECKTABLE found 0 allocation errors and 8 consistency errors in table 'Y' (object ID 382624406).

repair_allow_data_loss is the minimum repair level for the errors found by DBCC CHECKTABLE (XXX.dbo.Y, UNQ_Y)

DBCC execution completed. If DBCC printed error messages, contact your system administrator.

על פי השגיאות שהוצגו על הצג, הבנתי שנאלץ לאבד חלק מהמידע שקיים בטבלה.

בשלב זה הייתי רוצה להרחיב קצת על הארכיטקטורה-

קיימת לנו רפליקציה(Transactional) בין השרת החשוד לשרת נוסף(כיעד).

גיבוי נתונים:

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

 

  SELECT * INTO [dbo].[BackupT]

  FROM [dbo].[Y]

 

תיקון הדפים:

שימוש ב - REPAIR_ALLOW_DATA_LOSS  מחייב אותנו בהשבתה , מכיוון שמעברים את בסיס הנתונים למצב Single User

ALTER DATABASE MY_DB SET SINGLE_USER WITH ROLLBACK IMMEDIATE

DBCC CHECKTABLE ( 'dbo.Y', REPAIR_ALLOW_DATA_LOSS)

המשמעות היא שהפקודה מאפשרת למנוע (Engine) לתקן את הדפים על חשבון המידע שקיים בטבלה.

לאחר כשעתיים נתקבל הפלט הבא –

DBCC results for 'Y'.

Repair: The Clustered index successfully rebuilt for the object "dbo.Y" in database "X".

Repair: The page (1:17875757) has been deallocated from object ID 382624406, index ID 1, partition ID 72057594260946944, alloc unit ID 72057594269532160 (type In-row data).

Repair: The page (1:17875758) has been deallocated from object ID 382624406, index ID 1, partition ID 72057594260946944, alloc unit ID 72057594269532160 (type In-row data).

Repair: The page (1:17875759) has been deallocated from object ID 382624406, index ID 1, partition ID 72057594260946944, alloc unit ID 72057594269532160 (type In-row data).

Repair: The Nonclustered index successfully rebuilt for the object "dbo.Y, PK_Y" in database "X".

למען הסר הספק הרצתי שוב CHECKTABLE על הטבלה כולה:

DBCC CHECKTABLE ('dbo.Y')

אשר החזיר תוצאות תקינות, אך נמצא שחסרות 69 רשומות חסרות בטבלה.

השלמת הנתונים מהטבלה ששמרנו בצד – BackupT

 

USE [MY_DB]

GO

INSERT INTO [dbo].[Y] (COL1 ,COL2 ,COL3)

SELECT     BT.COL1

           ,BT.COL2

           ,BT.COL3

FROM   [dbo].[BackupT] BT

LEFT JOIN  dbo.Y YT ON BT.Col1 = YT.Col1

WHERE YT.Col1 IS NULL

 

כניקיון מחקתי את הטבלה ששמרנו בצד.

 

 

ישנם מספר אפשרויות לבדוק האם יש לנו שגיאות שקשורות לCorruption.

  1. הרץ בתדירות מספקת CheckDB ובדוק תוצאות.

  2. עקוב אחר טבלה suspect_pages שנמצאת בmsdb.

  3. יישם התראות(SQL Alerts) 823-825 בשרת.

 

מקווה שזה יעזור לכל מי שנתקל בתופעה.

 

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