Suspect Olmuş Veritabanını Kurtarmak
Veritabanının suspect mode’a düşmesi her dba’in korkulu rüyasıdır. Sağlam bir backup stratejisi ile bu sıkıntının önlemini almak gerekir. İlk olarak suspect olmuş veritabanını kesinlikle detach etmemelisiniz. SQL Server 2014’te detach etmemize izin vermiyor. Bu özelliğin hangi sürümden itibaren geldiğini hatırlamıyorum ama önceki bazı sürümlerde bu işlemi yapmamıza izin verdiği için bu hatırlatmayı yapmak istedim.
Veritabanınız suspect mode’a düştüğünde aşağıdaki komutla bunu teyit edelim. Veritabanının suspect olduğu teyidini yaptıktan sonra kurtarmak için girişime başlamadan önce yapmamız gereken ilk işin bu haliyle bir backup’ını almak olmalı!!!
SELECT DATABASEPROPERTYEX (N'Test', N'STATUS') AS N'Status';
Sorguyu çalıştırdığımda veritabanının statüsünün suspect olduğunu görüyorum.
Veritabanını kurtarmanın birkaç yöntemi var.
1) En son sağlıklı backup’tan dönmek. En sağlıklı yöntem budur. Full backup’tan dönmek yerine sadece suspect olmuş page’leri bulup bu page’leri restore edebilirsiniz. Aşağıdaki script yardımıyla suspect olmuş page’leri bulabilirsiniz.
select * from msdb..suspect_pages
Page Restore için “Page Restore” isimli makalemden faydalanabilirsiniz. Page Restore tamamlandıktan sonra DBCC CHECKDB (N’Test’) komutunu kullanarak veritabanının suspect olma sorunun çözülüp çözülmediğini kontrol etmelisiniz. CHECKDB işlemi tamamlandıktan sonra hata almadıysa aşağıdaki script yardımıyla son kontrol’ü de yapmalısınız.
EXEC SP_RESETSTATUS 'Test' SELECT DATABASEPROPERTYEX (N'Test', N'STATUS') AS N'Status';
Eğer page restore ile sorununuz çözülmediyse elinizdeki full backup’tan restore işlemini yapmalısınız. Backup restore işlemleri için “Backup Restore İşlemleri” isimli makalemden faydalanabilirsiniz.
2)Eğer backup’ınız yoksa aşağıdaki script yardımıyla veritabanının suspect mode’a düşme sebebini bulabiliriz.
EXEC SP_RESETSTATUS 'Test' ALTER DATABASE [Test] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; GO DBCC CHECKDB (N'Test') WITH NO_INFOMSGS, ALL_ERRORMSGS; GO
Eğer gelen hata mesajlarında suspect olma sebebi index’lerden kaynaklanıyorsa aşağıdaki script yardımıyla veritabanımızı kurtarabiliriz.
EXEC SP_RESETSTATUS 'Test' ALTER DATABASE [Test] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; GO DBCC CHECKDB (N'Test',REPAIR_REBUILD) WITH NO_INFOMSGS, ALL_ERRORMSGS; GO
3)Eğer 2.seçenekteki gibi sorun index’lerden kaynaklanmıyorsa aşağıdaki script yardımıyla veritabanımızı kurtarabiliriz. Ama bu seçenekte veri kaybını göze almanız gerekiyor. Bu yüzden 1.seçenek ve 2.seçenekle veritabanınızı kurtaramıyorsanız son çare olarak bu yöntemi kullanabilirsiniz. DBCC CHECKDB komutunun detayları için “DBCC CHECKDB Detayları” isimli makalemi okumanızı öneririm.
EXEC SP_RESETSTATUS 'Test' ALTER DATABASE [Test] SET EMERGENCY; GO ALTER DATABASE [Test] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; GO DBCC CHECKDB (N'Test', REPAIR_ALLOW_DATA_LOSS) WITH NO_INFOMSGS, ALL_ERRORMSGS; GO