Merhaba arkadaşlar powershell ile SQL yedeği nasıl alınır bu konudan bahsedeceğim, her kuruluş beklenmeyen aksama sürelerine karşı iş kaybını önlemek için bir Felaket Kurtarma planı hazırlamalıdır. Elektrik kesintisi, veri merkezi sorunları, siber saldırılar, doğal afet vb. olabilir. Bu tür olaylara hazırlamak için düzenli bir felaket tatbikatı yapmalıyız. Veritabanı yöneticileri de bu süreçlerde hayati rol oynamaktadır.

Herhangi bir veri kaybı olduğu durumda, veritabanı yedekleme yapınızın geçerli olduğuna ve geri dönüş senaryolarınızı hazır tutmanız gerekmektedir. Bu sebepten yedek almak ve yedekten dönme işlemleri farklı zamanlarda kontrol edilerek geri bu senaryo canlandırılmalıdır. Fakat belirli bir sıklıkta bu işlemi tekrarlamak bir zaman sonra sıkıcı olmaya başlayacaktır. Ayrıca bu geri dönüş senaryolarından sonra DBCC CHECKDB yaparak ilave bir tutarlılık kontrolüde yapmanız gerekiyor. Bu süreci özetleyecek olursak ;

  • Veritabanlarının düzenli olarak yedeklerinin alınması ve bu alınan yedekleri belirli periyotlarda geri yüklenmesi.
  • Geri yüklemeler sonrasında veritabanı tutarlılığının tespiti için DBCC CHECKDB işlemlerinin gerçekleştirilmesi.

SQL Server üzerinde yukarıdaki işlemleri gerçekleştirebilmek için T-SQL kodu yazabilir, Maintenance Plan oluşturabilir yada SSIS paketi hazırlayabilirsiniz. Fakat bu işlemleri gerçekleştirmek için ilave bilgiye ihtiyaç duyabilirsiniz. Bu bilgiye ihtiyaç duymadan veritabanı yedeklemesi (backup) ve geri yükleme (restore) işlemleri için DBATools kullanabilirsiniz.

DBATools kullanmak için Azure Data Studio’da kullanabilirsiniz fakat biz Powershell üzerinden işlemlerimizi gerçekleştiriyor olacağız.

Powershell’i çalıştıyoruz. Get-Help komutunu kullanarak Backup geçen yapıları kontrol ediyoruz.

Get-Help *Backup* gibi basit bir kullanımı var.Eğer daha önce kullanmadıysanız Get-Help ile ilgili kendisini güncelleştirmek adına powershell kurulumlar gerçekleştirmek adına sizden onay istiyor. Onay vererek işleme devam edebilirsiniz.

Kurulumlarını tamamladıktan sonra uzunca bir liste karşımıza geliyor.

Gördüğünüz gibi içerisinde DBATools kullanarak içerisinde Backup geçen çok sayıda işlemi gerçekleştirecek function hazır.

Öncelikli olarak biz Get-DbaLastBackup komutunu kullanarak son veritabanı yedeklemeleri bir kontrol edelim. Tabi öncesinde yine Get-Help Get-DbaLastBackup komutunu çalıştırıp fonksiyonun nasıl çalıştığını öğrenelim.

Örnek olması için komutu kendi sunucumda çalıştırıyorum. Çıktıda görüldüğü üzere veri tabanın hiç yedeği alınmamış görünüyor.

Biraz daha görsele dayalı bir çıkıt almak için Get-DbaLastBackup -SqlInstance localhost komutuna da|Out-Gridview ekliyoruz.

Yedek almak için *Backup* dan dönenler içerisinde gördüğümüz Backup-DBaDatabase kullanacağız. Hemen bu komut için de yardım dosyasına bakalım.

Yardım dosyasının içeriğinde komutun kullanımı için ihtiyaç duyabileceğimiz herşey var aslında, Syntax şekli, örnek hazır komut kullanımları vs. Bu bilgilerden yola çıkarak ben yine localhost’um üzerinde var olan veritabanlarının yedeğini almak için aşağıdaki komutu yazıyorum.

Backup-DbaDatabase -SqlInstance localhost

Görüldüğü üzere çok basit bir komut kullanımı ile veritabanlarının yedeğini alıyorum. Buradaki en önemli kısım benim belirlediğim veritabanı yada veritabanları nereye alacağımı nasıl belirtebilirim? Aslında bu sorunuzun cevabı da yardım dosyasındaki syntax içerisinde mevcut.

Öncelikli olarak istediğiniz bir veritabanı yedeğini nasıl alabilmeniz için ihtiyaç duyacağınız komutu paylaşıyorum. Aşağıdaki komut ile localhost üzerinde sadece master veritabanın yedeğini alırsınız.

Backup-DbaDatabase -SqlInstance localhost -Database master

Birden fazla veritabanı yedeğini almak isterseniz de aşağıdaki kod parçasını kullanabilirsiniz. ( master ve model veritabanları için yedek alır.)

Backup-DbaDatabase -SqlInstance localhost -Database master, model

Peki veritabanlarını belirledik ama nereye alacağımızı bildirmedik. Varsayılan olarak SQL Server Database Settings’de belirttiğiniz alana yedek almaktadır. Fakat değiştirmek isterseniz nasıl yapacaksınız ?

Aşağıdaki komut ile localhost’da bulunan master veritabanın yedeğini D:\SQLBackup dosya dizinine alabilirsiniz.

Backup-DbaDatabase -SqlInstance localhost -Database master -BackupDirectory D:\SQLbackup

Get-DbaLastBackup komutunu kullanarak aldığımız yedekleri doğruluğunu kontrol edelim.

Komut kullanımında farklılık olarak Out-GridView ile sonuç kümesini grid yapısında görüntülenmesini sağladık.

Verileri kontrol ettiğimde sadece Full Backup aldığımı görüyorum, ben differantial yada log backup almak istesem nasıl alıyor olacağım? Veritabanı yöneticileri için diff ve log backup alabilmek tıpkı full backup alabilmek kadar önemlidir ve veritabanı yedekleme mimarisi içerisinde yer almalıdır.

DbaTools modülünü kullanarak full yedek aldığımız gibi aslında diff ve log backup da alabiliyoruz. Bunun için Backup-DbaDatabase komutu içerisinde Type parametresini kullanmamız gerekiyor.

Hemen bir örneğini yapalım ve localhost da MSHOWTO veritabanı için diff backup alalım. ( Tabi bu işlemi gerçekleştirebilmek için MSHOWTO veritabanın Full yedeğinin öncelikli olarak alınması gereklidir. Unutmayın!)

Backup-DbaDatabase -SqlInstance localhost -Database master -BackupDirectory D:\SQLBackup -Type Differential

Yukarıda gördüğünüz gibi yazdığımız komut ile işlemi başarılı bir şekilde gerçekleştirdik, fakat burada yeni gördüğümüz -ReplaceInName kullanımı var. Hemen açıklayayım. ReplaceInName ; backupfilename içindeki dizeleri gerçek değerlerle değiştirmek için bu komutu backup komutunda belirtmeliyiz. ReplaceInName kullanımı istediğimiz dbname,  timestamp bilgilerini aldığımız yedeğe verebildik. İsterseniz burada backuptype bilgisi de ekleyebilirdiniz. ( -BackupFileName instancename-dbname-backuptype-timestamp.bak )

Son olarak ise her bir veritabanını kendi isiminde bir klasöre yedeklemek isterseniz nasıl bir komut çalıştırmalısınız onu göstereyim. Aşağıdaki komutu çalıştıracak olursanız eğer localhost üzerinde MSHOWTO veritabanın D:\SQLBackup dosya yolunda MSHOWTO isimli bir klasör oluşturup yedeği onun içerisine almış olduğunu göreceksiniz.

Backup-DbaDatabase -SqlInstance localhost -Database MSHOWTO -BackupDirectory D:\SqlBackup -BackupFilename servername-instancename-dbname-timestamp.bak -ReplaceInName -CreateFolder

Başarılı bir şekilde yedeği aldığını görüyoruz, fakat hemen kontrol edelim.

Gördüğünüz gibi D:\SQLBackup adresinde MSHOWTO isiminde bir klasör oluşturup bizim istediğimiz yedekleme isiminde başarılı bir yedek almış. Eğer dosya yolunda benzer isimli bir dosya var ise yeni bir klasör oluşturmaz ve sadece yedekleme işlemini gerçekleştirir.

Veritabanı yönetici olarak yedekleme işlemini gerçekleştirirken kullandığımız SQL Server versiyon bilgisine göre compress backup alabiliyoruz ve tabi ayrıca aldığımız yedeği doğruluğu içinde checksum ve verify ediyoruz. Bu işlemleri nasıl yapabiliriz bunları yapabilmeniz için ihtiyaç duyacağız kod blokları ise aşağıdaki gibidir.

Compress Backup ( Sıkıştırılmış backup ) almak için;

Backup-DbaDatabase -SqlInstance localhost -Database MSHOWTO -BackupDirectory D:\SqlBackup -BackupFilename servername-instancename-dbname-timestamp.bak -ReplaceInName -CreateFolder -CompressBackup

Aldığımız yedeğini doğruluğunu teyit etmek için;

Backup-DbaDatabase -SqlInstance localhost -Database MSHOWTO -BackupDirectory D:\SqlBackup -BackupFilename servername-instancename-dbname-timestamp.bak -ReplaceInName -CreateFolder   –CompressBackup -Checksum -Verify

Yedekleme yapısını bozmadan CopyOnly backup almak için;

Backup-DbaDatabase -SqlInstance localhost -Database MSHOWTO -BackupDirectory D:\SqlBackup -BackupFilename servername-instancename-dbname-timestamp.bak -ReplaceInName -CreateFolder                    –CompressBackup -Checksum -Verify -CopyOnly

Yukarıdaki komutlardan istediğiniz kullanıp ihtiyacınıza yönelik yedekleme şeklini belirleyebilirsiniz. Yedekleme ve aldığınız yedekten geri dönme konuları kuruluşunuz için çok büyük önem arz etmektedir. Powershell kullanarak SQL Server’da yedekleme ihtiyacınızı nasıl giderebileceğinizi anlatmış olduk.

Bir yanıt yazın