SQL Server’da Bir Database’i Page Seviyesinde Backup’tan Dönme

SQL Server’da data ve index’ler 8KB’lık page ler halinde saklanır. Bir sorgu çalıştığında bu page’ler ram’de değilse diskten ram’e alınır oradan da okuma işlemi gerçekleştirilerek kullanıcıya sonuç döndürülür. Yani SQL Server’ın en küçük yapıtaşı 8KB’lık page bloklarıdır. Bazen bu page’lerde fiziki bozulmalar yaşarız. Genel olarak sebebi de donanımsaldır. Benim en çok başıma gelen diskte bad sector ya da storage üzerinde cache e yazılan verinin herhangi bir sebepten diske yazılamamasıdır. Elektrik kesilmesi ve akabinde storage’in bataryarsının yeterince dolu olmaması burada en çok karşılaştığımız sebeplerdir. Şimdi şöyle düşünün 1 TB büyüklüğünde bir database’iniz var. Bu database’de 500 GB’lık bir tablo var bu tabloda sadece 1-2 satırı ilgilendiren 8 KB’lık bir page bozuldu. Bu durumda SELECT COUNT(*) FROM TABLO  sorgunuz çalışmayacaktır. Sonuç itibariyle database’de bozuk olan page’in tespit edilip yedekten dönülmesi gerekebilir. Database tamamen de yedekten dönülebilir ancak bu durumda veri kaybı yaşanacaktır. Hadi gelin şimdi hep birlikte bir page i bozalım ve page seviyesinde database’i restore edelim. –TEST İSİMLİ BİR DB OLUŞTURUYORUZ. CREATE DATABASE TEST GO –RECOVERY MODEL ÖZELLİĞİNİ FULL YAPIYORUZ. ALTER DATABASE TEST SET RECOVERY FULL; GO –DATABASE İMİZİN PAGE VERIFY ÖZELLİĞİNİ CHECKSUM OLARAK İŞARETLİYORUZ. ALTER DATABASE TEST SET PAGE_VERIFY CHECKSUM  GO –DATABASE İMİZ HAZIR. Bir test tablosu oluşturuyoruz. Page de fazla yer kaplasın diye 2000 karakterlik bir char(2000) alan ekliyoruz. CREATE TABLE DATES(ID INT IDENTITY(1,1),DATE_ DATETIME2, UNIQEID UNIQUEIDENTIFIER,LONGSTR CHAR(2000)) Tablomuzdaki kayıtlar bu şekilde. DBCC CHECKDB komutu ile database i kontrol ediyoruz ve herhangi bir sorun yok. Bu haliyle yedek alıyoruz. Gördüğümüz gibi kayıtlar geliyor. Şimdi biz bu page leri sanki bir donanımsal arıza varmış gibi bozacağız. Şimdi aynı sorgumuzu tekrar çekiyoruz. Gördüğümüz gibi hata mesajı aldık ve bu kayıtları okuyamadık. Şimdi bir de tablonun tamamını çekelim. Sadece iki tane page bozuk olmasına rağmen tüm tabloyu bozuk gibi algıladı. Şimdi database imizi yedekten dönsek yedek aldımız zamandan bu zamana kadar olan kayıtları da kaybederiz. Oysa sadece page i dönersek ihtiyacımız olan kadar yedekten dönmüş oluruz. Bunun için test database i üzerinde tasks>restore>page diyoruz. Karşımıza çıkan pencerede Check database pages diyoruz. Scriptini alıyoruz. Çalıştırıyoruz. Gayet hızlı bir şekilde çalıştı. Başka bir yazıda görüşmek üzere. Sağlıcakla…