Bir önceki makalemizde sizlere Powershell’in dbatools modülünü kullanarak nasıl veritabanı yedeği alabileceğinizi anlatmıştım. Şimdi ise size aldığımız yedeği dbatools kullanarak nasıl restore edeceğinizi anlatacağım.

Öncelikli olarak, DBATools içerisinde restore içerikli hangi komutların olduğunu öğrenelim. Bunun için aşağıdaki komutu yönetici olarak çalıştırdığımız powershell konsolunda çalıştırmalıyız.

Get-Help * Restore *

Resim-1

Yukarıda ki resimde gördüğünüz gibi bir kullanabileceğimiz fonksiyon bilgisi var, fakat biz dbatools modülü içerisinde olan Restore-DbaDatabase fonksiyonunu inceliyor olacağız.

Restore-DbaDatabase

Bu komutu kullanarak belirtilen yedekleme dosyalarını kullanarak SQL geri yükleme veritabanı işlemlerini gerçekleştirebiliriz. Bu komutta birden fazla yapılandırma seçeneğimiz var. Aşağıdaki komutu kullanarak Restore-DbaDatabase bilgisinin yanı sıra kısa bilgi de alabiliriz.

Get-Help Restore-DbaDatabase

Aşağıdaki çıktıyı verir.

Resim-2

DBATools kullanarak daha önce aldığımız yedeklerimiz vardı. Şimdi bu yedekleri kullanarak restore işlemi gerçekleştirelim. ( D:\SQLBackup\MSHOWTO\ klasörü içerisine yedekleme yapmıştık.)

Resim-3

Yedeklerimiz yukarıdaki gibi, birde veritabanı listemizi kontrol edelim.

Resim-4

Gördüğünüz gibi sadece MSHOWTO isimli veritabanı var ve buna ait de elimizde farklı yedekler mevcut. Restore-DbaDatabase komutunu, sqlinstance ve path bilgisini vererek çalıştıralım bakalım neler olacak.

Restore-DbaDatabase -SqlInstance localhost -Path D:\SQLBackup\MSHOWTO

Resim-5

Yukarıdaki resimde gördüğünüz gibi var olan bir veritabanı restore etmek istediğim için hata verdi. Mevcut veritabanı değiştirmek için -WithReplace seçeneğini belirterek devam edebilirsiniz. Aşağıdaki ekran görüntüsünde belirttiğimiz path içerisinde yer alan “localhost-MSSQLSERVER-MSHOWTO-201906182024.bak” isimli yedeğin restore edildiğini görebilirsiniz.

Resim-6

SQL Restore işlemi tamamlandıktan sonra Resim-6 da gördüğünüz gibi bir işlem çıktısı ile bizlere verir. (Backup ismi, veritabanı ,ismi, veritabanı sahibi ve kullanılan script vs..)

İlk örneğimizde -withreplace kullanarak mevcut veritabanın üzerine restore işlemi gerçekleştirdik, fakat elimizdeki yedeği farklı bir dizine restore etmek istesek aşağıdaki komutu çalıştırmamız yeterli olacaktır.

Restore-DbaDatabase -SqlInstance localhost -Path D:\SQLBackup\MSHOWTO -DestinationDataDirectory D:\SQLDATA -withreplace

Komutu çalıştırdıktan sonra aşağıda çıktı bize işlem detaylarının bilgilerini vermektedir.

Resim-7

Gördüğünüz gibi MSHOWTO veritabanı artık D:\SQLData içerisine restore edilmiştir. D:\SQLData yolunu kontrol edelim.

Resim-8

Farklı bir dizine Restore işlemi nasıl gerçekleştirilir?

Şimdiye kadar restore işlemlerini gerçekleştirirken hem data dosyalarını hem de log dosyalarını aynı dizine restore ettik. Fakat biz en iyi yöntemin data ve log dosyalarının farklı diskler üzerinde olması gerektiğini biliyoruz. Yapacağımız örnekte aşağıdaki dosya yollarına restore işlemlerini gerçekleştirelim. ( Çalıştığım ortamda tek disk uygunluğum var o yüzden aynı disk üzerinde farklı dosya yollarına işlem yaptırtacağım.)

Data : D:\SQLData\DataFile ( -DestinationDataDirectory parametresine verilecek değer )

Log : D:\SQLData\LogFile ( -DestinationLogDirectory parametresine verilecek değer )

Komut :
Restore-DbaDatabase -SqlInstance localhost -Path D:\SqlBackup -DestinationDataDirectory D:\SqlData\DataFile -DestinationLogDirectory D:\SqlData\LogFile -withReplace

Komutu çalıştırdıktan sonra bize aşağıdaki çıktıyı verecektir.

Resim-9

Dosya yollarını kontrol edelim

Resim-10

Resim-11

Yeni bir isimler veritabanı nasıl restore edilir?

Önceki örneğimizde Replace seçeneği ile varolan bir veritabanı ezip, yedekten restore işlemi gerçekleştirmiştik. Fakat çoğu durumuda bu mevcut olanı ezmek yerine farklı bir isimde yeni bir veritabanı adıyla restore işlemi gerçekleştirmemiz gerekir. Bu örneğimizde de MSHOWTO veritabanı için elimizdeki yedekten MSHOWTO_Restore isimli yeni bir yedekten restore işlemi gerçekleştirelim. İşlemi gerçekleştirmeden mevcut veritabanının mantıksal ve fiziksel isim bilgilerine ihtiyacımız var, bu bilgiyi sp_helpfile komutu kullanılarak elde edilebilir. Sp_helpfile komutunun çıktısı aşağıdaki gibidir.

Resim-12

Aşağıdaki komutta –DatabaseName parametresi ile birlikte belirtilen –ReplaceDbNameInFile  ile yeni bir veritabanı belirledik.

Restore-DbaDatabase -SqlInstance localhost -Path D:\SQLBackup\MSHOWTO -DatabaseName MSHOWTO_Restore -ReplaceDbNameInFile

Yukarıdaki komut bize aşağıdaki çıktıyı vermektedir.

Resim-13

MSHOWTO_Restore veritabanı için sp_helpfile komutunu çalıştıralım. Fiziksel dosya isimlerinin değiştiğini görebiliriz. Benzer çıktı yukarıdaki resimde de mevcuttur.

Resim-14

Mantıksal dosya isimlerini değiştirmek için DBATools modülü içerisindeki Rename-DbaDatabase komutu kullanılarak restore sonrasındaki mantıksal dosya isimlerinin değiştirilmesi sağlanabilir. Böylece daha okunaklı bir restore süreci işlemiş oluruz.

Rename-DbaDatabase -SQLInstance localhost -DatabaseName MSHOWTO_Restore -LogicalName “MSHOWTO_Restore”

Resim-15

Sp_helpfile ile kontrol ettiğimizde mantıksal isimlerin değiştiğini görebiliriz.

Yukarıdaki resimden görüldüğü gibi mantıksal isim değişikliğ sağlanmış fakat data ve log türünde isimlendirme tanımlamak istersek aşağıdaki komuttaki gibi <DBN>_<FT> biçiminde bir kullanım gerçekleştirebiliriz. Böylece DBN kısımı için veritabanı adı ile değiştirecek, _FT ekini ekleyecektir.

Rename-DbaDatabase -SQLInstance localhost -Database MSHOWTO_Restore -LogicalName “<DBN>_<FT>”

Yukarıdaki komutu çalıştırdıktan sonra sp_helpfile ile tekrar kontrol ettiğimizde aşağıdaki gibi bir sonuç ile karşılaşıyor olacağız.

Resim-17

NoRecovery modunda bir Restore işlemi nasıl gerçekleştirilir?

DbaTools modülü kullanarak daha önce differential ( fark ) ve Log yedeklerini nasıl alınabildiğini göstermiştik. Bu aldığımız yedekler tek başına dönülebilecek yedekler olmadıklarından dolayı herhangi bir yedek döndükten sonra veritabanının “NORECOVERY” yada “STANDBY” durumda olmaları anında dönülebilirler. Bu gereksinimi Dbatools kullanarak gerçekleştirmek için -NoRecovery parametresini kullanabiliriz.

Restore-DbaDatabase -SQLInstance localhost -Path D:\SqlBackup\MSHOWTO -Database “MSHOWTO_NORECOVERY” -ReplaceDbNameInFile  –NoRecovery

Komutun çıktısı ise aşağıdaki gibidir.

Resim-18

SSMS’den yaptığımız işlemi doğruluğunu kontrol edelim.

Resim-19

Bu veritabanı için ( MSHOWTO_NORECOVERY ) için artık differential yada log backup restore edilebilir. Bu restore işlemlerini de tamamladıktan sonra bu veritabanı tekrar kullanılabilir hale getirmek için aşağıdaki komutu kullanabiliriz.

Restore-DbaDatabase -SQLInstance Localhost -DatabaseName MSHOWTO_NORECOVERY –Recover

Komutun çıktısı aşağıdaki gibidir.

Resim-20

SSMS’den kontrol ettiğimizde ise MSHOWTO_NORECOVERY veritabanın artık erişilebilir olduğunu görüyoruz.

Resim-21

Powershell gücü ve DbaTools modülünün yetkinliği ile önceki makalelerimizde veritabanı yedeğini almıştık, bugünde artık aldığımız yedekleri geri yüklemeyi / restore etmeyi öğrendik. Bir sonraki DbaTools içeriğinde görüşmek üzere!