dataiotech Labs
Runbooks Library/sqlserver/#59
Runbook #59
sqlserver
MaintenanceSEV1 · CRITICAL OUTAGE30-60 dakika / 30-60 minssysadmin / CONTROL SERVER

SQL Server Corruption - Error 823/824/825: DBCC CHECKDB & Page Restore

Emergency corruption triage for Msg 823, 824, 825 I/O errors and suspect_pages: surgical Page Restore with log chains, nonclustered index rebuilds, and REPAIR_ALLOW_DATA_LOSS disaster procedures without taking DB offline.

Related Metrics:M31M33
#sqlserver#corruption#error-823#error-824#error-825#dbcc-checkdb#page-restore#suspect-pages

Operational Safety & Risk Notice

This runbook contains operational intervention steps; several are write-impacting (KILL, terminate, DROP, RESIZE). Verify in a staging environment first, and apply sequentially in production with verification.

🟢 Salt Okunur (Read-Only)·🟡 Geri Alınabilir (Reversible)·🔴 Yüksek Etkili / Geri Alınamaz (High Impact)

1. Symptom & Signals

- `Msg 823, Level 24, State 2: I/O error (cyclic redundancy check CRC) detected during read`.

- `Msg 824, Level 24, State 2: SQL Server detected a logical consistency-based I/O error: torn page`.

- `Msg 825, Level 10, State 2: A read of the file succeeded after retrying n times` (ölmekte olan disk uyarısı).

- `msdb..suspect_pages` tablosunda yeni bozuk sayfa kayıtları oluştu; sorgular Severity 24 ile düşüyor.

2. Business & Technical Impact

P1 Kritik Kesinti. Bozuk sayfalara denk gelen tablolar okunamaz veya güncellenemez; disk sürücüsündeki fiziksel hasar genişleyebilir; yanlış müdahale (örneğin kontrolsüz restart veya tam yedeğin üzerine yazma) veritabanını tamamen kurtarılamaz hale getirebilir.

3. Diagnosis & Root-Cause Analysis

🔴 HIGH RISK / IRREVERSIBLE1. **ALTIN KURAL: VERİTABANINI HEMEN OFFLINE YAPMAYIN VEYA RESTART ETMEYİN!**

- Veritabanı offline olursa suspect moda geçebilir ve tekrar online olmayabilir.

- Mevcut sağlam full/diff/log yedeklerini koruyun; asla bozuk DB'nin yedeğini sağlam yedeklerin üzerine yazdırmayın.

🟢 Read-Only2. **Hasar Tespiti ve Error Log İncelemesi:**
sql
-- 1. Error log'dan 823/824 kayıtlarını çekin
EXEC sp_readerrorlog 0, 1, '824';
EXEC sp_readerrorlog 0, 1, '823';

-- 2. suspect_pages tablosunu sorgulayın
SELECT database_id, file_id, page_id, event_type, error_count, last_update_date 
FROM msdb.dbo.suspect_pages 
WHERE database_id = DB_ID('MyDB');

-- 3. Detaylı tutarlılık taraması (Trace 3604 ile SSMS ekranına bas)
DBCC TRACEON(3604);
DBCC CHECKDB('MyDB') WITH NO_INFOMSGS, ALL_ERRORMSGS;
🟢 Read-Only3. **Hata Türü ve Aciliyet Matrisi:**
Hata KoduHata AnlamıKök Neden & Müdahale
**823**İşletim sistemi / Donanım I/O hatasıFiziksel disk, SAN veya RAID controller arızası; storage ekibini hemen çağırın.
**824**Mantıksal I/O tutarsızlığı (Bad Checksum / Torn Page)8 KB sayfa diske eksik yazılmış; Page Restore ile kurtarılabilir.
**825**Okuma tekrar deneme sonrası başarılı (Read-retry)Disk sürücüsü sessizce ölmek üzere; proaktif disk değişimi planlayın.

4. Remediation & Action Plan

### Seçenek A: Tek / Birkaç Sayfa Bozuk — PAGE RESTORE (En Güvenli, Enterprise Edition)

Ön koşul: Sağlam Full Backup ve kesintisiz Transaction Log zinciri. Veritabanı online kalır!

sql
-- 1. Bozuk sayfayı Full yedekten geri yükleyin (Örnek: File 1, Page 234)
RESTORE DATABASE MyDB PAGE='1:234' 
FROM DISK = 'D:\Backups\MyDB_FULL.bak' WITH NORECOVERY;

-- 2. Ardışık differential ve log yedeklerini uygulayın
RESTORE LOG MyDB FROM DISK = 'D:\Backups\MyDB_LOG1.trn' WITH NORECOVERY;
RESTORE LOG MyDB FROM DISK = 'D:\Backups\MyDB_LOG2.trn' WITH NORECOVERY;

-- 3. Sayfayı online kurtarmaya alın
RESTORE DATABASE MyDB WITH RECOVERY;

-- 4. Tablo seviyesinde bütünlük denetimi yapın
DBCC CHECKTABLE('dbo.Orders') WITH NO_INFOMSGS;

### Seçenek B: Bozulma Sadece Nonclustered Index'te İse

Eğer CHECKDB hatası sadece kümelenmemiş bir indekste ise (heap veya clustered index sağlamsa):

sql
-- İndeksi sıfır veri kaybı ile online yeniden oluşturun
ALTER INDEX [IX_Orders_OrderDate] ON dbo.Orders REBUILD WITH (ONLINE = ON);
DBCC CHECKTABLE('dbo.Orders');

### Seçenek C: Son Çare — REPAIR_ALLOW_DATA_LOSS (Veri Kaybı Riski!)

⚠️ **SADECE YEDEK YOKSA VE YÖNETİM VERİ KAYBI ONAYI VERDİYSE!**

sql
-- Veritabanını tek kullanıcı moduna alın
ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
DBCC CHECKDB('MyDB', REPAIR_ALLOW_DATA_LOSS);
ALTER DATABASE MyDB SET MULTI_USER;

-- İşlem biter bitmez tüm veriyi temiz yeni bir veritabanına aktarın!

5. Verification & Health Checks

- `DBCC CHECKDB('MyDB') WITH NO_INFOMSGS;` komutunun 0 hata döndürdüğünü teyit edin.

- `msdb.dbo.suspect_pages` tablosundaki ilgili satırların temizlendiğini veya çözüldüğünü doğrulayın.

- En kritik 10 iş tablosunda satır sayısı ve sağlama toplamlarını (`CHECKSUM_AGG`) kontrol edin.

6. Rollback & Contingency Plan

- `REPAIR_ALLOW_DATA_LOSS` geri alınamaz; komut çalıştırılmadan önce DB'nin MDF/LDF dosyalarının salt okunur kopyası alınmalıdır.

- **Kök Neden ve Önleme Standartları:**

- [ ] Storage ekibi SAN switch, disk bad sector ve RAID kontrolcü pilini inceledi mi?

- [ ] Tüm veritabanlarında `PAGE_VERIFY CHECKSUM` zorunlu kılındı mı?

sql
SELECT name, page_verify_option_desc FROM sys.databases;
-- CHECKSUM değilse derhal güncelleyin:
ALTER DATABASE MyDB SET PAGE_VERIFY CHECKSUM;

- [ ] Antivirüs yazılımının SQL veri ve log dizinlerini (`.mdf`, `.ldf`, `.ndf`) taraması engellendi mi (Exclusion List)?

- [ ] Haftalık SQL Agent `DBCC CHECKDB` bakım işi aktif ve alarmlı mı?

- **İletişim:** 823/824 görüldüğü anda `#dba-p1` kanalını ve Altyapı/Storage ekibini ayağa kaldırın.

Engineering Triad: Diagnostic Scripts

Diagnostic scripts recommended during this runbook triage to pinpoint the root cause:

All Scripts (100)
#46 · SQLBackup

SQL Server Last Backup Status and RPO Check

Shows the latest full, differential and log backup per database. Quickly finds databases without recent backups or log backups.

#55 · SQLPerformance

SQL Server Disk I/O Latency by File

Calculates read/write latency in ms for every data and log file. Used to prove disk-related slowness.

More SQLSERVER Runbooks