Powershell ile SQL Yedeği Nasıl Alınır ? -DbaTools

Bu makalede, Powershell’in gücünü ve açık kaynak olan DBATools modülünü kullanarak bir SQL Veritabanı Yedeğini nasıl alacağımızı inceleyeceğiz.

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’u daha önce size bilgi vermiştim.

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.

Resim-1

Yukarıdaki resimdeki gibi 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. Benim gibi onay vererek işleme devam edebilirsiniz. Kurulumlarını tamamladıktan sonra uzunca bir liste gelecek, bizim ihtiyacımız modül bilgisi dbatools olan kısımlar, yani Resim-2 de göreceğiniz bölüm.

Resim-2

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.

Resim-3

Bu komutu örnek olarak ben kendi sunucumda çalıştıracağım.

Resim-4

Yukarıdaki resimde gibi bir çıktı ile daha önce hiç veritabanın yedeğini almadığımı görüyorum. Fakat ekran çıktısı çok hoşuma gitmediği için kullandığım Get-DbaLastBackup -SqlInstance localhost komutuna birde |Out-Gridview ekliyorum.

Resim-5

En azından yukarıdaki resim daha bir anlaşılır oldu. Şimdi ise hızlıca bir yedek alalım. 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.

Resim-6

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

Resim-7

Resimde gördüğünüz gibi ç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şayım. 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

Resim-8

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

Resim-9

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.

Resim-10

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

Resim-11

Aklınıza hemen yedeğin aldığımız zamanın damgasını, veritabanı ismini, aldığımız veritabanı yedek türünün ne olduğunu gibi bilgilerin bulunduğu bir yedeği nasıl alabileceğiniz geldi değil mi ? Hadi hemen bu soruyu da cevaplayalım.

Zaman Damgalı, Farklı isimlendirmeli veritabanı yedeğini nasıl alabilirsiniz?

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

Resim-12

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 )

Resim-13

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

Resim-14

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

Resim-15

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 anlattık,bir sonraki yazımda ise aldığımız bu yedekten nasıl geri dönebiliriz bunu anlatıyor oluruz. Yedeğe ihtiyaç duymayacağınız günleriniz olsun!

Bir yanıt yazın

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