FileGroup Backup ve Restore İşlemleri(Partial Backup)
FileGroup Backup ve Restore işlemlerini genellikle büyük ve birden fazla filegroup’u olan veritabanlarında filegroup’lardan bazıları read only mode’da ise gerçekleştiririz. FileGroup ve büyük veritabanları ile ilgili detaylar için “Veritabanı Oluşturmak Deyip Geçmeyin!” isimli makaleme göz atmak isteyebilirsiniz.
Örneğin 30 TB bir veritabanınız var ve her yıl için bir partition yapılmış. “Partition Oluşturmak” isimli makalemi okumak isteyebilirsiniz.
Her yıl’a ait partition farklı bir filegroup’a konulmuş. Uygulama sadece son 1 yılın verisi üzerinde read write işlemi yapıyor ve ondan önceki veri için sadece read yapıyor. Böyle bir durumda 30 TB’ın sadece 6 TB’ı aktif iken kalan 24 TB’lık veri hiç değişmiyor. Böyle bir durumda write yapılmayan filegroup’ları “Filegroup’u Read Only Yapmak” isimli makalemde anlattığım şekilde read only mode’a alıp backup’ını sadece bir kere alırız. Backup job’ımız da sadece read write filegroup’ların backup’ını alarak backup boyutumuzu ve süremizi kısaltmış oluruz. Bu tip backup alma çeşidine Partial Backup denir. Partial backup’ta opsiyonel olarak bir yada daha fazla read only file group’unda backup’ını alabilirsiniz.
Filegroup backup ve restore işlemlerinde primary filegroup en önemli file group’tur. Çünkü primary filegroup’u restore etmeden diğer read write filegroup’ları restore edemezsiniz. Örneğimize dönecek olursak veritabanımızda default olarak 1 adet primary filegroup olur. 1 adet read write filegroup ve 1 adet de read only file group’umuz olduğunu, Read only filegroup’un backup’ını bir kere aldığımızı ve backup joblarında sadece primary ve read write filegroup’ların backup’ını aldığımızı düşünün.
Örneğimizde öncelikle veritabanının primary ve read write filegroup’larının backup’ını daha sonra read only filegroup’ların backup’ını alacağız. Daha sonra read only backup’ı kullanmadan sadece primary ve read write filegroup’ların backup’ını restore edeceğiz. Bu şekilde hem read only file group’ların backup’ını sürekli alma yükünden kurtulacağız, hem de backup süremiz kısalmış olacak. Aynı zamanda geri dönüş süremiz de ciddi anlamda kısalacak.
Aşağıdaki script yardımıyla read write(read only olmayan) filegroup’ların hepsinin backup’ını alabiliriz. Aşağıda gördüğünüz script’teki READ_WRITE_FILEGROUPS ifadesi bu işlemi yapmamızı sağlar.
BACKUP DATABASE [Test] READ_WRITE_FILEGROUPS TO DISK = N'C:\MSSQL\READWRITEFILEGROUPS.BAK' WITH NOFORMAT, NOINIT, NAME = N'Test-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 1
Aşağıdaki gibi SSMS kullanarak read write filegroup’ların hepsini teker teker belirterek de backup alabiliriz.
Öncelikle veritabanına sağ tıklayarak Tasks ve Backup diyoruz.
Karşımıza gelen ekranda Backup components kısmında Files and filegroups’a tıklıyoruz ve aşağıdaki gibi bir ekranla karşılaşıyoruz. Aşağıdaki ekranda PRIMARY ve TABLESGROUP isimli filegroup’larımız read write file group’lar olduğu için ikisini de seçiyoruz ve ok diyoruz.
Alt taraftaki Back up to kısmından Disk’i seçiyoruz ve Add diyerek backup alacağımız path’e backup ismini yazarak ok diyoruz ve yukardaki script’e tıklayarak script’ini alarak backup’ı çalıştırıyoruz. SSMS kullanarak ve read write filegroup’ları manual bir şekilde seçerek yukardaki script’in yapmış olduğu işi yapmış olduk.
Read Only file group’un backup’ını alma işlemini de aynı şekilde yaparak başka bir backup dosyasına alıyoruz.
Gelelim restore işlemine,
Read only filegroup’ları restore etmeden sadece read write filegroup’ları restore edeceğiz. Eğer full recovery model kullanıyorsanız restore sonrasında elinizdeki log backup’ları restore etmelisiniz.
Restore işlemine başlamadan önce tail log backup alarak veritabanını restoring mode’a almamız ya da replace komutunu kullanarak mevcut veritabanının üzerine overwrite etmemiz gerekiyor. Biz tail log alarak işlemimize başlayacağız. Tail log backup almak için “Tail Log Backup” isimli makalemden faydalanabilirsiniz.
Tail Log Backup’ı aldık. Sıra geldi read write filegroup’ları restore etmeye,
Aşağıdaki script’i kullanarak read write file group’ları restore ediyoruz.
use master GO RESTORE DATABASE Test FROM DISK = N'C:\MSSQL\READWRITEFILEGROUPS.BAK' WITH NORECOVERY; GO
Eğer restore database işlemini başlangıçta Tail Log Backup almadan WITH REPLACE ile yaptıysak ve elimizde log backup yoksa aşağıdaki gibi veritabanını ayağa kaldırabiliriz.
RESTORE DATABASE Test WITH RECOVERY
Eğer read write filegroup’ların backup’ını aldıktan sonra log backup aldıysak log backup’ları sırayla aşağıdaki script’i kullanarak WITH NORECOVERY ile restore etmemiz gerekir.
RESTORE LOG Test FROM DISK ='C:\MSSQL\LogBackup1.trn' WITH NORECOVERY; GO RESTORE LOG Test FROM DISK ='C:\MSSQL\LogBackup2.trn' WITH NORECOVERY; GO
Yukarıdaki script’te iki adet log backup’ımız olduğu için ikisini de WITH NORECOVERY ile restore ettik.
Son olarak aldığımız tail log backup’ı aşağıdaki script yardımıyla WITH RECOVERY ile restore ederek veritabanını ayağa kaldırıyoruz.
RESTORE LOG Test FROM DISK ='C:\MSSQL\TailLogTest.trn' WITH RECOVERY; GO
“Backup ve Restore” isimli makalemde backup çeşitlerini anlatmıştım. Differential Backup mantığını filegroup backup için de kullanabiliriz.
Differential Backup almak için mevcut read write filegroup’ların backup’ını aldığımız script’e aşağıdaki gibi DIFFERENTIAL ifadesini eklememiz gerekir.
BACKUP DATABASE [Test] READ_WRITE_FILEGROUPS TO DISK = N'C:\MSSQL\READWRITEFILEGROUPSDIFFTARIH.BAK' WITH NOFORMAT, NOINIT, NAME = N'Test-Full Database Backup', SKIP, NOREWIND,DIFFERENTIAL, NOUNLOAD, STATS = 1
Restore sonrasında tüm filegroup’ların online olduklarını görebilmek için aşağıdaki script’i çalıştırmalıyız.
SELECT [name], [state_desc] FROM Test.sys.database_files;
Bu makalede mevcut bir veritabanı üzerine sadece primary ve read write file group’ların restore işlemini yaptık.
“PieceMeal Restore” isimli makalede de öncelikle primary ve readwrite filegroup’ların backup’larını başka bir veritabanına restore edeceğiz. Daha sonra da uygulama aktif filegroup’lar üzerinde çalışırken arka planda read only filegroup’ların restore işlemini yapıyor olacağız.