Veritabanında küçük çaplı bozulmalarda tüm veritabanını restore etmeye gerek kalmadan sadece bozulmuş page’ler belirlenerek restore edilebilmektedir. Bozulmuş page’lerin tespiti ardından page restore işlemiyle veri bozulması rahatlıkla çözülebilir. SQL Server 2005 ve sonrası tüm sürümlerde page restore işlemi mümkündür. Offline ve online olarak iki modda page restore işlemi gerçekleştirilebilmektedir.

Page restore işlemi sadece veritabanı düzeyinde gerçekleştirilir. Ayrıca restore edilecek page’lerin bulunduğu veritabanı full veya bulk-logged backup modeline ayarlanmış olması gerekmektedir ve en azından bozulmadan önce alınmış birer tane full yedek ve log yedeği bulunuyor olması gereklidir. Restore edilecek page numarası PAGE=[file_id : page_number] şeklinde RESTORE DATABASE ifadesine eklenerek restore edilir.

1) Offline Restore Süreci

İlk olarak veritabanı offline hale çekilir ve ardından restore işlemi başlatılır. SQL Server’ın tüm edisyonlarında offline mod ile restore işlemi mümkündür.

Bir full ve iki log yedeği alınmış bir veritabanında page restore işlemi gerçekleştirelim:

USE MASTER;
GO

RESTORE DATABASE [database_name]
PAGE = '1:233',  '1:237'
FROM DISK = N'D:\SQLBackups\DatabaseName-Full1.bak'
WITH NORECOVERY;

RESTORE LOG DATABASE [database_name]
FROM DISK = N'D:\SQLBackups\DatabaseName-Log1.bak'
WITH NORECOVERY;

RESTORE LOG DATABASE [database_name]
FROM DISK = N'D:\SQLBackups\DatabaseName-Log2.bak'
WITH NORECOVERY;

RESTORE DATABASE [database_name]
WITH RECOVERY;
2) Online Restore Süreci

Online modda restore işlemi ise sadece Enterprise ve Developer sürümde mümkündür. Production’daki bir veritabanda iş süreçlerinde hiç bir kesinti sağlamayacak şekilde online olarak page restore işlemi yapılabilmektedir. Veritabanı zaten offline moddaysa restore işlemi offline olarak gerçekleştirilecektir.

Bir full ve bir log yedeği alınmış bir veritabanında page restore işlemi gerçekleştirelim. Restore işlemi sırasında online olarak log backup alıp tekrar restore edebiliyorum:

USE MASTER;
GO

RESTORE DATABASE [database_name]
PAGE = '1: 233',  '1:237'
FROM DISK=N'D:\SQL Backups\DatabaseName-Backup1.bak'
WITH NORECOVERY;

RESTORE LOG DATABASE [database_name]
FROM DISK = N'D:\SQLBackups\DatabaseName-Log1.bak'
WITH NORECOVERY;

-- Online olarak yedek alınması 
BACKUP LOG [database_name] TO N'D:\SQLBackups\DatabaseName-Log2.bak'; 

-- Son alınan yedeğin restore edilmesi
RESTORE LOG DATABASE [database_name]
FROM DISK = N'D:\SQLBackups\DatabaseName-Log2.bak'
WITH NORECOVERY;

RESTORE DATABASE [database_name]
WITH RECOVERY;

Görüldüğü üzere online işlemde restore sırası, offline işlemdeki sırayla aynıdır. Online restore sürecinde diğer kullanıcıların veriye erişimi devam etmektedir.

Kaynak:
How to perform a page level restore in SQL Server
How to Restore a Page in SQL Server Standard and Enterprise Edition