SQL Server Offset Fetch kullanımı
Bugün sizlere bir veritabanı yöneticisinin en önemli iş sorumluluğunda yer alan veritabanlarında yaşanan “veritabanı bozulmalarını” tespit etmek ve bu tespit sonrasında gerekli aksiyonları almasıdır. Bu yazımızda msdb veritabanı içerisinde yer alan suspect_pages tablosunu kullanarak veritabanı bozulmalarını nasıl tespit edebileceğinizi anlatacağım.
SQL Server 2005 yılında msdb sistem veritabanında SUSPECT_PAGES tablosunun kullanılabilir olduğu bilgisini duyurmuştur. SQL Server 2005’ten bu zamana her bozulmuş sayfa bilgisi msdb.dbo.suspect_pages tablosuna eklenir. SQL Server veritabanı yapısı gereği aşağdaki hatalardan biriyle karşılaşırsa bozulmuş olarak kabul eder. (MSDN de yer alan bilgiyere göre )
- Disk hatası veya bazı donanım hataları gibi işletim sistemi tarafından CRC ( Cyclic Redundancy Check ) hatası oluşması ile 823 hatasının gerçekleşmesi. Bir Windows okuma veya yazma işteğinin başarısız olması.
- Torn Page Logical Consistency – 824 hatası – Bu hata, windows’un page’i başarılı bir şekilde okuması fakat sql server’ın page üzerinde tutarsızlık yaşanması sebebi ile oluşur. 823 hatasına benzer bir alt yapıya sahiptir.
SUSPECT_PAGES tablosuna ne zaman kayıt gelir ?
SQL Server database engine, aşağıda belirtilen işlemlerden herhangi biri sırasında karşılaşılan page bozulmalarını kayıt edilmesini sağlar.
- DBCC CHECKDB komutunun çalıştırılması sırasında
- Veritabanı Yedeklenmesi ve Restore edilmesi sırasında
- Çalıştırılan sorgunun bozulmuş bir page okuması sırasında
- DBCC CHECKDB REPAIR_ALLAW_DATA_LOSS işlemi sırasında
- Veritabanı silinirken – Drop Database işlemlerinde
Önemli Not! : Belirli aralıklarla bakım sırasında DBCC CHECKDB komutu çalıştırılmalıdır.
SUSPECT_PAGES tablosuna kayıt edilen hatalar nelerdir ?
Aşağıdaki tabloda event_type verilerine göre hataların açıklamaları yer almaktadır.
Event_type | Hata Açıklaması |
1 | İşletim sistemi seviyesinde yaşanan 823 ve 824 numaralı hata kayıtları – CRC Error |
2 | Bad CheckSum |
3 | Torn Page |
4 | Restored (The page was restored after it was marked bad) –Sayfa bozulmuştu fakat tamir edildi. |
5 | DBCC ile onarıldı |
7 | Deallocated by DBCC |
Aşağıdaki sorguyu kullanarak bozulmuş sayfaları bulabiliriz.
SELECT
SD.name AS DatabaseName
,MSP.file_id AS FileID
,SMF.physical_name AS PhysicalFilePath
,MSP.page_id AS PageID
,CASE
WHEN MSP.event_type = 1 THEN ‘823 error caused by an operating system CRC error or 824 error other than a bad checksum or a torn page’
WHEN MSP.event_type = 2 THEN ‘Bad checksum’
WHEN MSP.event_type = 3 THEN ‘Torn Page’
WHEN MSP.event_type = 4 THEN ‘Restored (The page was restored after it was marked bad)’
WHEN MSP.event_type = 5 THEN ‘Repaired (DBCC repaired the page)’
WHEN MSP.event_type = 7 THEN ‘Deallocated by DBCC’
END AS EventDescription
,MSP.error_count AS ErrorCount
,MSP.last_update_date AS LastUpdated
FROM msdb.dbo.suspect_pages MSP
INNER JOIN sys.databases SD ON SD.database_id = MSP.database_id
INNER JOIN sys.master_files SMF ON SMF.database_id = MSP.database_id AND SMF.file_id = MSP.file_id
SUSPECT_PAGES tablosunun bakımı
Veritabanı yöneticileri SUSPECT_PAGES tablosunu periyodik olarak gözden geçirmeli ve bu tablo 1000 satırla sınırlı olduğundan eski satırları silinmelidir. Eğer tablo dolu ise, o zaman yeni hatalar kayıt edilemeyecektir. SUSPECT_PAGES Tablosundan veri silebilmek için msdb veritabanından db_owner yetkisine sahip yada sysadmin yetkisine sahip bir kullanıcı ile SQL Server’a giriş yapmış olmalısınız.
DELETE FROM msdb..suspect_pages
WHERE (event_type = 4
OR event_type = 5
OR event_type = 7)