MSSQL Server FileGroup Backup and  Restore

Bu makalede filegroup bazında backup alma işlemini ele almış olacağız. Filegroup bazında backup alma işlemi büyük ve birden fazla filegroup olan veritabanlarında geçekleştirilir.

Bu yapıda birden fazla filegroup’u olan veritabanında read-only modda olan filegrouplar var ise gerçekleştirilir. İlgili filegroup’larım read-only mod da değilse Normal partition backup işleminin komutunu paylaşmış olacağım.

Mevcut yapımızda veritabanı altında 3 filegroup görünmektedir. Mevcut verilerimiz FG2025 üzerinde dönmektedir. Backup stratejilerimiz gereği veritabanının sürekli backup’ını alırız. Veritabanı boyutumuz büyükse disk konusunda bir süre sonra sıkıntı yaşamaya başlarız. Disk konusunda sıkıntı yaşamamak ve gereksiz yere sistemimizi yormamak için bu backup stratejisi uygulanır. Veritabanımızda default olarak 1 adet primary filegroup, 1 adet read write filegroup ve 1 adet de read only file group’umuz olduğunu görmekteyiz.

Veritabanımız altında oluşturmuş olduğum 3 farklı tablonun farklı bir filegroup üzerinde olduğunu görmekteyiz.

use DATABASE_NAME
  go
  SELECT OBJECT_NAME(t.object_id) AS [Table Name], d.name AS [Filegroup Name]  FROM sys.data_spaces d 
  JOIN sys.indexes i on i.data_space_id = d.data_space_id
  JOIN sys.tables t on t.object_id = i.object_id
  WHERE i.index_id<2
  AND t.type = 'U'
  AND OBJECT_NAME(t.object_id) ='TABLE_NAME'

Bu yapımızda backup alma stratejimizi şöyle belirliyoruz. 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. 

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 filegroup’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.

Yukarıdaki senaryoyu oluşturmak için ilk başta read write filegroup backup işlemine geçiyorum.

SSMS arayüzünden  ilgili veritabanı üzerinde sağ tıklayıp Task>Back Up.. kısmına tıklıyorum.

Gelen ekranda Backup Compunent kısmında  Filed and filegroups sekmesine tıklanır.

Gelen ekranda Primary ve FG2025 isimli filegrouplarımız read write filegrouplarımız olduğu için seçiyoruz. Filegroup altında bulunan isimler ise file sekmesinde tanımlamış olduğumuz Logical Name ismi olarak karşımıza çıkmaktadır.

İlgili filegrouplarımızı seçtikten sonra alt kısımda bulunan Backup up to kısmında Disk’i seçiyoruz. Add diyerek backup alacağımız path’i seçiyoruz. 

İşlemlerimizi tamamladıktan sonra Script yazan yere tıklayarak işlemimizin backup’ını almış oluyoruz.

BACKUP DATABASE [FILEGROUP] FILEGROUP = N'PRIMARY',  FILEGROUP = N'FG2025' TO  DISK = N'C:\YY\READWRITE.BAK' WITH NOFORMAT, NOINIT, 
NAME = N'FILEGROUP-Full Database Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO

Not: Differential backup’da alınabilir. Sadece yukarıdaki kod bloğunda virgülden sonra DIFFERENTIAL Yazılır.

Bu işlemden sonra şimdi ise aynı işlemleri read-only olan filegroup içinde yapıyoruz.

BACKUP DATABASE [FILEGROUP] FILEGROUP = N'FG2024' TO  DISK = N'C:\YY\READ.BAK' WITH NOFORMAT, NOINIT, 
NAME = N'FILEGROUP-Full Database Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO

Backup işlemlerimi tamamladıktan sonra restore işlemlerine geçebiliriz.

Veritabanımızın hızlı bir şekilde ayağa kalkması için ilk olarak yapılması gereken read-write olan filegroup’un ayağa kaldırılması gerekmektedir. Full recovery model kulladığımız için en son log backup’ın alınarak sistemin veri kaybı olmadan ayağa kalkması sağlanır. Veritabanımızı restoring moda sokulur. Bunun içinde önceki backup makalesinde anlatmış olduğum tail log backup işlemini alıyorum. Tail log backup makalesini okumanızı tavsiye ederim. Aşağıda belirttiğim resimlerle tail log backup nasıl alındığını görebilirsiniz.

Backup type kısmından Transaction Log seçilip Back up to kısmından Disk seçilir ve .trn uzantısında tail log backup uzantımız belirlenir.

Aşağıdaki resimde Media Options kısmından tail log backup almamız için ilgili checkboxs seçilir.

İlgili arayüzün script’i alınır ve veritabanı restoring moda sokulur. Artık veritabanına bağlantı gelmez.

BACKUP LOG [FILEGROUP] TO  DISK = N'C:\YY\taillogbackup.trn' WITH  NOFORMAT, NOINIT,  NAME = N'FILEGROUP-log taillog', SKIP, 
NOREWIND, NOUNLOAD,  NORECOVERY ,  STATS = 10
GO

NO_TRUNCATE ifadesi hasar görmüş veritabanlarında kullanılır. Bu yüzden koduma çalıştırmadan çıkarıyorum. Veritabanımız Recovery Pending modunda olsaydı bu komut kullanılabilirdi. Bu komutla restore ederken copy-only ifadesi arayüzde görülmektedir.

Yukarıdaki komutu çalıştırdığınızda aşağıda belirtilen hataları almış olabilirsiniz. 

Bunun için Sql Server ‘Exclusive access could not be obtained because the database is in use.’ Solution to the error makalesini okumalısınız.

Veritabanımız artık restoring modunda ve hiçbir işlem üzerinde yapılamıyor.

Tail log backup’ı aldıktan sonra şimdi ise restore işlemine geçelim. Bunun için ilk başta primary ve read write filegroupları  Norecovery modda restore işlemine tabi tutuyoruz.

Üzerine herhangi bir tail log backup yüklenmeyecekse recovery modunda hemen veritabanımızı açabiliriz. Aşağıdaki komuttaki norecovery yazan yere recovery yazılırdı.

NOT: Tail log backup yüklenmeden de veritabanı ayağa kalkabilir.

use master
GO
RESTORE DATABASE FILEGROUP  
   FROM DISK = N'C:\YY\READWRITE.BAK' 
   WITH NORECOVERY; 
GO

Read write filegrupların restore işlemini yaptık. Veritabanımızı hemen ayağa kaldırmak için log backuplar ve tail log backupların yüklenmesi gerekmektedir. 3 log backup bir tail log backup’ımız varsa başlangıç olan 3 log norecovery olarak restore edilir. Log backup’ımın en son halkası olan tail log backup recovery modunda restore edilerek veritabanı ayağa kalkmış olur.

NOT: Tail log backup yüklenmedende veritabanı ayağa kalkabilir. Aşağıdaki komut yardımıyla.

RESTORE DATABASE FILEGROUP WITH RECOVERY

Daha sonra read-only backupların yükleme işlemi gerçekleştirilebilir. Read-only backup’ı sonradan yükleyeceğim için tail log backup’ı yükleyip restoring modunda veritabanını açıyorum.

RESTORE LOG FILEGROUP 
   FROM DISK ='C:\YY\taillogbackup.trn'
   WITH RECOVERY; 
GO

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 FILEGROUP.sys.database_files;

Burada şöyle bir sorun karşımıza çıkıyor. Biz aslında yukarıda sadece primary ve read-write filegroupları restore işlemlerini yapmıştık.  Dikkat edersek read-only’de restore oldu. Sadece read write filegroup’u restore işlemine alacağız. Read only modda olan filegrouplar recovery pending modda kalacak. Böylelikle kısa sürede veritabanımızın ayağa kalması sağlanır.

Yukarıdaki işlemlerin aynısı yapılarak bu yol denenir. Ben yukarıdaki işlemleri tekrardan aynı şekilde yapıyorum ama restore ifadesinde küçük bir detay ekleyerek read-write filegroupların ayakta kalmasını sağlamış olacağım. Aşağıdaki kod bloklarında full,diff ve log ve tail log backup işlemini yapıyorum

BACKUP DATABASE [FILEGROUP] FILEGROUP = N'PRIMARY',  FILEGROUP = N'FG2025' TO  DISK = N'C:\YY\READWRITE.BAK' WITH NOFORMAT, NOINIT, 
NAME = N'FILEGROUP-Full Database Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO
------------------------------------
BACKUP DATABASE [FILEGROUP] FILEGROUP = N'PRIMARY',  FILEGROUP = N'FG2025' TO  DISK = N'C:\YY\READWRITE_DIF.BAK' WITH NOFORMAT, NOINIT, 
NAME = N'FILEGROUP-Full Database Backup', SKIP, NOREWIND,DIFFERENTIAL, NOUNLOAD,  STATS = 10
GO
-------------------------------------
BACKUP LOG [FILEGROUP] TO  DISK = N'C:\YY\log1.trn' WITH NOFORMAT, NOINIT,  NAME = N'FILEGROUP-Full Database Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO
--------------------------------------
ALTER DATABASE [FILEGROUP] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
BACKUP LOG [FILEGROUP] TO  DISK = N'C:\YY\taillogbackup.trn' WITH  NO_TRUNCATE , NOFORMAT, NOINIT,  NAME = N'FILEGROUP-Full Database Backup', SKIP, 
NOREWIND, NOUNLOAD,  NORECOVERY ,  STATS = 10
GO

Restore işlemi yapılırken kod bloklarına PARTIAL ifadesinin eklenmesi gerekmektedir.

use master
GO
RESTORE DATABASE [FILEGROUP] 
FILEGROUP='PRIMARY' ,FILEGROUP='FG2025'
   FROM DISK = N'C:\YY\READWRITE.BAK' 
   WITH PARTIAL,NORECOVERY; 
GO 
------------------
 use master
GO
 RESTORE DATABASE [FILEGROUP] 
FILEGROUP='PRIMARY' ,FILEGROUP='FG2025'
   FROM DISK = N'C:\YY\READWRITE_DIF.BAK' 
   WITH NORECOVERY; 
GO 
-------------------
 RESTORE LOG [FILEGROUP] 
   FROM DISK ='C:\YY\log1.trn'
   WITH NORECOVERY; 
GO
-------------------
 RESTORE LOG [FILEGROUP] 
   FROM DISK ='C:\YY\taillogbackup.trn'
   WITH RECOVERY; 
GO
-------------------
SELECT [name], [state_desc]
FROM [FILEGROUP].sys.database_files;

Yukarıdaki resimde read only filegroupların recovery pending modunda olduğunu görebiliriz. Read only file group recovery pending modunda olduğu için select bile çekemeyiz. Select çekersek aşağıdaki hata mesajını almış oluruz.

The query processor is unable to produce a plan for the table or view ‘TABLEE’ because the table resides in a filegroup that is not online.

 En son adımda read only olan veritabanıda recovery modelde ayağa kaldırılır.

RESTORE DATABASE [FILEGROUP] FILEGROUP='FG2024' FROM DISK = N'C:\YY\READ.BAK' WITH RECOVERY

Bu makalede FileGroup Backup-Restore işlemini ele almış olduk. Başka bir makalede görüşmek dileğiyle..

“O, yeryüzünde sizin için her türde ve her renkte daha nice hayvanlar ve bitkiler yaratmıştır. Elbette bunda düşünüp öğüt alan bir toplum için büyük bir ibret ve ders vardır. ” Nahl-13

Author: Yunus YÜCEL

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir