SQL Server

SQL Express Sürümünde Otomatik Yedek Alma İşlemleri

Merhaba,

SQL Server’ın ücretsiz sürümü olan Express edition bir çok yerde malum sebeplerden tercih ediliyor. Bu sürümün en önemli eksiklikerinden biri de SQL Agent hizmetinin çalışmıyor olması. Bilmeyenler için şöyle diyebiliriz, bu servis SQL Server’da otomatik ve periyodik olarak çalışacak işlemleri kontrol eden servis. Otomatik ve periyodik olarak çalışan denince de akla ilk gelen işlem tabi ki sistemin yedeğinin otomatik olarak alınması.

Bir çok kişi bu eksiklik sebebiyle ya sistem yedeğini hiç almıyor, ya manuel olarak alıyor, ya da Veeam tarzı uygulamalar ile günde bir kez tüm sistemin yedeğini alıyor. Oysa gün içerisinde gerçekleşebilecek bir problemde bir gün önceki yedek yeterli olmayabilir.

Şimdi hadi gelin bu sorunu çözmek için çok pratik bir işlem yapalım.

Öncelikle veritabanımızın bir yedeğini almamız gerekiyor. Tabi birden fazla veritabanı varsa her biri için de bu işlemin otomatik olarak gerçeklemesi gerekiyor.

Bir sonraki aşamada bu yedekleri rar ile sıkıştırıp başka bir yere de kopyalamak isteyebiliriz. Onu da sadece sql scripti kullanarak yapabiliriz. Tabi makinemizde winrar kurulu olması gerekiyor.

 Aşağıdaki script işte tam olarak bu işe yarıyor. Yani otomatik olarak belirlediğimiz tüm database lerin yedeklerini alıyor. Şimdi bu scripti master db seçili iken çalıştıralım.
Tabi buradaki klasörler bilgisayarınızda yoksa oluşturmalısınız.

CREATE PROC DBBACKUP
AS
exec sp_configure 'show advanced options',1
reconfigure with override
	 
exec sp_configure 'XP_CMDSHELL',1
reconfigure with override
DECLARE @DBNAME as varchar(100)
DECLARE @BACKUPFOLDER as varchar(100)='d:\BACKUP\' --BURAYA YEDEK ALACAĞINIZ KLASÖRÜ YAZINIZ
DECLARE @COPYFOLDER as varchar(100)='d:\BACKUP\BACKUP2\' --BURAYA RARLAYIP KOPYALACAYACAĞINIZ KLASÖRÜ YAZINIZ.
														--SQL SERVER SERVİSİNİ ÇALIŞTIRAN KULLANICI BURAYA YAZMA
														--YETKİSİNE SAHİP OLMALIDIR.
DECLARE @WINRARFOLDER AS VARCHAR(200)='C:\Program Files\WinRAR\RAR' --BURAYA WINRAR UYGULAMASININ KURULU OLDUĞU KLASÖRÜ YAZINIZ.
DECLARE CRS CURSOR FOR 
SELECT NAME FROM SYSDATABASES   WHERE  NAME NOT IN ( 'master', 'model', 'msdb', 'tempdb' );
OPEN CRS
FETCH NEXT FROM CRS INTO @DBNAME
WHILE @@FETCH_STATUS =0
BEGIN
	DECLARE @SQL AS NVARCHAR(1000)
	DECLARE @FILEPATH AS VARCHAR(100)=''
	DECLARE @DATE AS VARCHAR(100)=CONVERT(VARCHAR,GETDATE(),104)
	DECLARE @TIME  AS VARCHAR(100)=CONVERT(VARCHAR,GETDATE(),108)
	SET @DATE=REPLACE(@DATE,'.','')
	SET @TIME=REPLACE(@TIME,':','')
	SET @FILEPATH=@dbName+'_'+@DATE+'_'+@TIME+'.BAK'

	--BACKUP ALAN KOMUT
	SET @SQL ='BACKUP DATABASE '+@DBNAME+' TO DISK ='''+@BACKUPFOLDER+@FILEPATH+''''
	--SELECT @SQL 
	exec sp_executesql @sql 

    DECLARE @COMMAND NVARCHAR(500);
	DECLARE @FILEPATH2 AS VARCHAR(1000)=''
	SET @FILEPATH2=REPLACE(@FILEPATH,'.BAK','')
	
	--RARLAMA İŞLEMİNİ YAPAN KOMUT
	SET @COMMAND = N'""'+@WINRARFOLDER+'" a "' + @BACKUPFOLDER+@FILEPATH2+ N'.rar"' + N' "' +@BACKUPFOLDER+ @FILEPATH + '""';
	EXEC xp_cmdshell @COMMAND, no_output;
	
	--RARLANAN DOSYAYI YEDEK KLASÖRÜNE KOPYALAYAN KOMUT
	SET @COMMAND='COPY "'+@BACKUPFOLDER+@FILEPATH2+'.rar"  "'+ @copyfolder+@FILEPATH2+'.rar"'
	EXEC xp_cmdshell @COMMAND ,no_output;

    --RARLANAN DOSYAYI SİLEN KOMUT
	SET @COMMAND='del "'+@BACKUPFOLDER+@FILEPATH2+'.rar"'
	EXEC xp_cmdshell @COMMAND,no_output;

	--BACKUP ALINAN DOSYAYI SİLEN KOMUT
	SET @COMMAND='del "'+@BACKUPFOLDER+@FILEPATH2+'.bak"'
	EXEC xp_cmdshell @COMMAND,no_output;
	select @COMMAND 


FETCH NEXT FROM CRS INTO @DBNAME
END
CLOSE CRS
DEALLOCATE CRS
EXEC sp_configure 'XP_CMDSHELL',0
reconfigure with override
EXEC sp_configure 'show advanced options',0
reconfigure with overri

Şimdi artık yedek alabilecek, onu rarlayıp istediğimiz klasöre atabilecek bir procedürümüz olduğuna göre artık ihtiyacımız olan şey bu işi otomatik olarak yaptırmak.

Otomatik olarak yaptırmak için Windows görev zamanlayıcı kullanacağız.

Şüphesiz görev zamanlayıcı bir Windows exesi ya da bat dosya çalıştırmak isteyecek. Onun için bir bat dosyası oluşturacağız.

Bat dosyası oluşturmak için aşağıdaki kodu bir notepad a yazıp uzantısını backup.bat olarak kaydedebilirsiniz.

sqlcmd -Q “EXEC MASTER.DBO.DBBACKUP”


Şimdi bu bat dosyasını elle çalıştıralım.


Gördüğümüz gibi sistem yedek aldı. D:\Backup klasörüne database lerin yedeğini aldı. Backup2 klasörüne de rarlanmış hallerini aldı.

Seçilen bak uzantılı dosyaların boyutu yaklaşık 11 MB.

 Rarlanan dosyaların boyutu ise yaklaşık 1 MB. Yani %90 oranında bir sıkıştırma durumu söz konusu.


Ben bu örnekte sıkıştırılan dosyaların ne kadar sıkıştığını göstermek amacı ile kopyalama sonrası silmedim. Oysa stored procedure ümüz. Rarlanıp kopyaladıktan sonra bunları klasörden siliyor.

Bu silme işlemi stored prcedure de burada yapılıyor. Siz de benim gibi sıkıştırma durumunu görmek isterseniz buradaki satırların başına – (iki tane -) koyabilirsiniz.


Şimdi bat dosyamızı da kaydettiğimize göre sıra geldi görev zamanlayıcıyı çalıştırmaya.

Bunun için başlat’a bastıktan sonra görev zamanlayıcı ya da task scheduler yazarsak, bu ekran karşımıza çıkacak.




Gece 00:00, Sabah 06:00, Öğlen 12:00 ve Akşam 18:00 ‘da alacak şekilde ayarlıyoruz.


Program Başlat olarak işaretliyoruz ve oluşturduğumuz bat dosyasını seçiyoruz.

Tamamdır.

Artık görev listesinde oluşturduğumuz görevi görebiliyoruz.

Şimdi elle çalıştıralım.

Gördüğümüz gibi çalıştı.

Sonuca bakalım; Bunlar bak uzantılı dosyalar,


Bunlar da rar uzantılı olanlar.


Sizler stored procedure de bir nas cihazı ya da başka bir yer vererek bu dosyaları oraya kaydettirebilirsiniz. Fakat benim tavsiyem ilk başta benimki gibi aynı diske kaydettirip çalıştığından emin olun sonra nas cihazı olarak değiştirirsiniz. Zira yetki problemi yaşamanız olası. En azından çalıştığından emin olun.

Umarım işinize yarayacak bir makale olmuştur.

Yeni yılda, barış, huzur, sağlık, mutluluk, başarı ve çokça paylaşım bizimle olsun inşallah.

Sağlıcakla…

İlgili Makaleler

10 Yorum

  1. Ömer hocam emeğinize sağlık uzun zamandır aradığım şeyi buldum. Yalnız ekstra olarak yapmak istediğim bir şey daha var. Bu backupları ayrı ayrı değilde hepsini tek bir rar dosyası içinde toplatamaz mıyız?

Bir yanıt yazın

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

Başa dön tuşu