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.
Sql1 isimli sunucumuz üzerinde bir TEST veri tabanı ve içerisinde mevcut olan tablo durumları aşağıdaki gibi.
Mevcut olan veri tabanının yedeğini aşağıdaki script ile alalım.
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ı.
SQL2 sunucumuzda daha önce manuel olarak elle diğer SQL sunucudan alınan yedeğin restore edilmiş hali gözükmekte.
Mevcut veri tabanını aşağıdaki script ile silelim.
ALTER DATABASE TEST SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
DROP DATABASE [TEST]
GO
TEST isimli veri tabanımız sorunsuzca silindi.
Şimdi ise aşağıdaki script ile restore işlemini yapalım.
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.
Bu nedenle aşağıdaki gibi network yoluna script ile bir map işlemi yapmamız gerekmekte.
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.
Şimdi restore işlemini aşağıdaki şekilde tekrardan deneyebiliriz.
RESTORE DATABASE CLK FROM DISK = ‘X:\TEST.BAK’
WITH RECOVERY
GO
Restore işlemi sorunsuzca tamamlandı.
Ş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.
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.
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ış.
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.
Görevimize bir isim verip ilerleyelim.
Ben bu işlemi günlük olarak yapacağım için Daily seçimini yaparak ilerliyorum.
İşlemin yapılacağı zaman dilimini ve kaç günde bir yapılacağı seçimini yaptıktan sonra ilerleyelim.
Zamanlanmış görevde yapılacak olan işlemi seçmek için Start a program seçimi ile ilerliyorum.
Zamanlanmış olarak yedek alma işlemi yapacağımız için yedekleme yapacak olan bat dosyasını Browse… butonuna tıklayarak yolunu gösterelim.
Dosyamızı seçip açalım.
Seçimi yaptıktan sonra sonraki adıma ilerleyelim.
İşlem özetini gördükten sonra Finish ile zamanlanmış görev oluşturma adımını tamamlayalım.
Yedekleme görevimiz konsola geldi.
Şu anda yedek alınmış değil. Zamanın gelmesini gözlemleyelim.
Belirlenen zaman geldikten sonra yedekleme işlemi başladı ve tamamlandı.
Şimdi aynı işlemi SQL2 sunucusu için yapalım.
İlgili bat dosyasına sql script çalıştırabilmesi için gerekli komutu girelim.
Yine bat dosyamızı başlangıca yerleştirelim.
Bu işlemden sonra restore scriptini çalıştıracak bat dosyamızı ayarlayalım.
Gerekli bat içeriğini girdikten sonra bu işlemi otomatik olarak yapabilmek için yine bir zamanlanmış görev hazırlayalım.
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.
Görevimize bir isim verip ilerleyelim.
Ben bu işlemi günlük olarak yapacağım için Daily seçimini yaparak ilerliyorum.
İşlemin yapılacağı zaman dilimini ve kaç günde bir yapılacağı seçimini yaptıktan sonra ilerleyelim.
Zamanlanmış görevde yapılacak olan işlemi seçmek için Start a program seçimi ile ilerliyorum.
Zamanlanmış olarak yedek alma işlemi yapacağımız için yedekleme yapacak olan bat dosyasını Browse… butonuna tıklayarak yolunu gösterelim.
Dosyamızı seçip açalım.
Seçimi yaptıktan sonra sonraki adıma ilerleyelim.
İşlem özetini gördükten sonra Finish ile zamanlanmış görev oluşturma adımını tamamlayalım.
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.
Zamanı gelince görevimiz çalışıyor.
Görevimizden sonra silinen veri tabanı tekrar restore ediliyor.
Veri tabanı özelliklerine baktığımızda veri tabanının bizim belirlediğimiz zaman diliminde create edildiğini görebiliyoruz.
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.
Elinize sağlık
Yekti hatası veriyor. Sanırım sqlcmd ile hariçten bağlantı yaparken kullanıcı girişi istiyor
Eline sağlık