SQL Server

SQL Script ile Otomatik Backup ve Restore

Merhaba, bu makalemizde sql script ile otomatik backup ve restore işlemini ele alıyor olacağız. Bu genel bir özellik ve konu olmamasına karşın yapımızda ortaya çıkan gereksinim üzerine yaptığım işlemleri senaryo olarak yazıya döküyorum. Yapımızda birinci sunucuda bulunan veri tabanının, yazılabilir olarak ikinci sql sunucu üzerine belirli periyotlarla taşınması gerekiyordu. Elimizdeki SQL lisansının standart olmasından dolayı Allways On, ikinci veri tabanının read yapılamaması sebebi ile mirroring, ortam itibari ile işlemlerde lsn zincirinde meydana gelebilecek olan problemlerden dolayı Log Shipping ile gereksinimi çözmediğimiz için işlemimizi script ile yapmaya karar verdik.

Özetle aşağıdaki işlemi otomatik script ile yapacağız.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Sql1 isimli sunucumuz üzerinde bir TEST veri tabanı ve içerisinde mevcut olan tablo durumları aşağıdaki gibi.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Mevcut olan veri tabanının yedeğini aşağıdaki script ile alalım.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Bu script sistem veri tabanları hariç var olan veri tabanının yedeğini sıkıştırılmış olarak, copy only özelliği ile farklı bir yedekleme sistemi var ise zinciri bozmadan almakta ve yedek işleminden önce ortamda farklı yedekler varsa onları silmekte.

DECLARE @name VARCHAR(50);

DECLARE @path VARCHAR(256);

DECLARE @fileName VARCHAR(256);

DECLARE @fileDate VARCHAR(20);

DECLARE @DeleteDate DATETIME =DATEADD(wk,-1,GETDATE());

SET @path = ‘\\10.10.10.20\BACKUP\’;

SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112);

DECLARE db_cursor CURSOR FOR

SELECT name

FROM master.sys.databases

WHERE name NOT IN (‘master’,’model’,’msdb’,’tempdb’);

OPEN db_cursor;

FETCH NEXT FROM db_cursor INTO @name;

WHILE @@FETCH_STATUS = 0

BEGIN

      SET @fileName = @path + @name + ‘.BAK’; 

      BACKUP DATABASE @name TO DISK = @fileName WITH INIT,COMPRESSION,COPY_ONLY;

                  FETCH NEXT FROM db_cursor INTO @name;

END

EXEC master.sys.xp_delete_file 0,@path,’BAK’,@DeleteDate,0;

CLOSE db_cursor;

DEALLOCATE db_cursor;

GO

Yedekleme işlemi başarı ile tamamlandı.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

SQL2 sunucumuzda daha önce manuel olarak elle diğer SQL sunucudan alınan yedeğin restore edilmiş hali gözükmekte.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Mevcut veri tabanını aşağıdaki script ile silelim.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

ALTER DATABASE TEST SET SINGLE_USER WITH ROLLBACK IMMEDIATE

GO

DROP DATABASE [TEST]

GO

TEST isimli veri tabanımız sorunsuzca silindi.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Şimdi ise aşağıdaki script ile restore işlemini yapalım.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

RESTORE DATABASE CLK FROM DISK = ‘\\10.10.10.20\BACKUP\TEST.BAK’

WITH RECOVERY

GO

Geri dönüş işlemi sırasında hata aldık bunun sebebi ise doğrudan bir paylaşım üzerinden restore işlemi yapmıyor olmamız.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Bu nedenle aşağıdaki gibi network yoluna script ile bir map işlemi yapmamız gerekmekte.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

EXEC master.dbo.sp_configure ‘show advanced options’, 1

RECONFIGURE

EXEC master.dbo.sp_configure ‘xp_cmdshell’, 1

RECONFIGURE

EXEC XP_CMDSHELL ‘NET USE X: “\\10.10.10.20\BACKUP” /user:cozumpark\administrator Almanya111’

Script ile sorunsuz olarak X: sunucuna \\10.10.10.20\BACKUP yolu map edildi.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Şimdi restore işlemini aşağıdaki şekilde tekrardan deneyebiliriz.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

RESTORE DATABASE CLK FROM DISK = ‘X:\TEST.BAK’

WITH RECOVERY

GO

Restore işlemi sorunsuzca tamamlandı.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Şimdi sıra geldi çalışan bu işlemi otomatize olarak yapmaya. Öncelikle sunucumuzun her yeniden başlamasında map işlemi sonlanacağı için otomatik olarak bağlanmasını sağlayalım.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Yukarıdaki scriptimizi aşağıdaki gibi bir bat dosyasına bağlayalım. Bat dosyası ile aşağıdaki komutlar yardımı ile sql scriptin çalışmasını sağlayalım.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

sqlcmd -s localhost -i C:\Users\ADMINISTRATOR.COZUMPARK\Desktop\Sql\map.sql

Map.bat isimli dosyamızı SQL sunucumuzun startup bölümüne atalım ve açılışta otomatik olarak map işleminin olmasını sağlayalım. Bu işi yapmanın farklı yöntemleri var. Zamanlanmış görevler v.s. buradaki tercih size kalmış.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Map işlemini bu şekilde hallettiğimize göre backup ve restore işlemini ise zamanlanmış görevler ile yapıyor olacağım. Bu nedenle zamanlanmış görevler ekranında Task Scheduler menüsüne sağ tıkladıktan sonra Create Basic Task… açılır menüsüne tıklayalım.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Görevimize bir isim verip ilerleyelim.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Ben bu işlemi günlük olarak yapacağım için Daily seçimini yaparak ilerliyorum.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

İşlemin yapılacağı zaman dilimini ve kaç günde bir yapılacağı seçimini yaptıktan sonra ilerleyelim.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Zamanlanmış görevde yapılacak olan işlemi seçmek için Start a program seçimi ile ilerliyorum.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Zamanlanmış olarak yedek alma işlemi yapacağımız için yedekleme yapacak olan bat dosyasını Browse… butonuna tıklayarak yolunu gösterelim.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Dosyamızı seçip açalım.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Seçimi yaptıktan sonra sonraki adıma ilerleyelim.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

İşlem özetini gördükten sonra Finish ile zamanlanmış görev oluşturma adımını tamamlayalım.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Yedekleme görevimiz konsola geldi.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Şu anda yedek alınmış değil. Zamanın gelmesini gözlemleyelim.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Belirlenen zaman geldikten sonra yedekleme işlemi başladı ve tamamlandı.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Şimdi aynı işlemi SQL2 sunucusu için yapalım.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

İlgili bat dosyasına sql script çalıştırabilmesi için gerekli komutu girelim.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Yine bat dosyamızı başlangıca yerleştirelim.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Bu işlemden sonra restore scriptini çalıştıracak bat dosyamızı ayarlayalım.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Gerekli bat içeriğini girdikten sonra bu işlemi otomatik olarak yapabilmek için yine bir zamanlanmış görev hazırlayalım.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

sqlcmd -s localhost -i C:\Users\ADMINISTRATOR.COZUMPARK\Desktop\Sql\restore.sql

Zamanlanmış görevler ekranında Task Scheduler menüsüne sağ tıkladıktan sonra Create Basic Task… açılır menüsüne tıklayalım.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Görevimize bir isim verip ilerleyelim.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Ben bu işlemi günlük olarak yapacağım için Daily seçimini yaparak ilerliyorum.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

İşlemin yapılacağı zaman dilimini ve kaç günde bir yapılacağı seçimini yaptıktan sonra ilerleyelim.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Zamanlanmış görevde yapılacak olan işlemi seçmek için Start a program seçimi ile ilerliyorum.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Zamanlanmış olarak yedek alma işlemi yapacağımız için yedekleme yapacak olan bat dosyasını Browse… butonuna tıklayarak yolunu gösterelim.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Dosyamızı seçip açalım.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Seçimi yaptıktan sonra sonraki adıma ilerleyelim.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

İşlem özetini gördükten sonra Finish ile zamanlanmış görev oluşturma adımını tamamlayalım.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Görevimiz konsola eklendi.

Mevcut olarak bu işlemi elle yaptığımızda oluşturulan ve restore edilen test veri tabanı aşağıdaki gibi gözükmekte.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Zamanı gelince görevimiz çalışıyor.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Görevimizden sonra silinen veri tabanı tekrar restore ediliyor.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Veri tabanı özelliklerine baktığımızda veri tabanının bizim belirlediğimiz zaman diliminde create edildiğini görebiliyoruz.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Bu şekilde sürecimizi tamamladık ve ikinci sunucudan bize gerekli olan güncellikteki veri tabanından rapor çekebilir durumdayız ve birinci sunucu üzerinde işlem yaparak mevut sunucuya fazladan yük bindirmiyoruz.

Umarım yararlı olur. Bir başka makalede görüşmek dileğiyle.

Rıza ŞAHAN

www.rizasahan.com

İlgili Makaleler

3 Yorum

  1. Yekti hatası veriyor. Sanırım sqlcmd ile hariçten bağlantı yaparken kullanıcı girişi istiyor

Bir yanıt yazın

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

Başa dön tuşu