SQL Server Express Otomatik Backup Alma

Selamlar;

Bilindiği üzere SQL Server Express Editionda SQL Agent bulunmuyor. Yani herhangi bir Scheduled Job oluşturamıyoruz.
Fakat belirli aralıklarla veritabanlarımızın otomatik yedeğini aldırma ihtiyacımız olabilir.

Ben bu işlem için bir script hazırladım; Bu script server üzerindeki tüm veritabanlarının (sistem veritabanları da dahil) yedeğini alıp, verilen gün sayısından eski backup dosyalarını siliyor. Bu şekilde disk boyutunu da kontrol altında tutmuş oluyoruz. Yedekleme sonucunu da bir log dosyasına yazıyor.

Hazırladığım scripti “SQLCMD” komutları ile Windows Scheduled Tasks ile zamanlayacağız.

DECLARE @path varchar(100)
DECLARE @day int
DECLARE @date varchar(30)
DECLARE @cmd varchar(250)
DECLARE @DeleteDate datetime

---- PARAMETRE TANIMLAMALARI ----

SET @path = 'C:\Backup'  -- Backupların saklanacağı klasör yolu.
SET @day = 5             -- Verilen gün sayısından eski backupları siler.

---- PARAMETRE TANIMLAMALARI ----

SET @date = CONVERT(varchar(16),GETDATE(), 120)
print @date + ' Backup Log'
print ''
SELECT @date = REPLACE(@date,':','')
SELECT @date = REPLACE(@date,' ','')
SELECT @date = REPLACE(@date,'-','')

SET @cmd = 'IF DB_ID(''?'')<>2 BACKUP DATABASE [?] TO DISK = ''' + @path + '\?_backup_' + @date + '.bak'' WITH INIT'
EXEC sp_msforeachdb @cmd

SET @DeleteDate = DateAdd(day, -@day, GetDate())
EXECUTE master.sys.xp_delete_file 0, @path, N'bak', @DeleteDate, 0
GO

Buda SQLCMD komutumuz:

SQLCMD -S localhost -E -i backup.sql -o C:\SQLBackupOutput_%date%.log

SQLCMD komut satırından sql serverı yönetebileceğimiz bir tool.

Ben Windows 2003 Server üzerinde yapıyor olacağım bu işlemi. Diğer sistemlerde de mantık aynı.
Scheluled Task aracını açıyoruz. Ve yeni bir task ekleme sihirbazını açıyoruz.

Next dedikten sonra Browse diyoruz ve SQLCMD komutunu yazığımız .cmd dosyasını seçiyoruz.

Daha sonrasında backup periyodunu seçiyoruz, Ben günlük gece 01:00 olarak seçtim.
Bir sonraki ekranda bu scriptin hangi hesapla çalışacağı bilgisini giriyoruz. Eğer bu kullanıcı SQL Server üstünde yetkili değilse SQLCMD komutunda bir de SQL user bildirmek gerekir.
Komut satırına “SQLCMD /?” yazarsanız tüm parametrelerin açıklamasını görebilirsiniz.

Task oluştu. Şimdi test etmek için sağ tıklayıp “RUN” diyorum.

Görüldüğü gibi backuplar ve log dosyası geldi. Eğer belirttiğim gün sayısından daha eski dosyalar olsaydı o dosyalarda silinmiş olacaktı.

Buda Log Çıktısı:

2011-04-25 13:04 Backup Log

Processed 376 pages for database 'master', file 'master' on file 1.
Processed 2 pages for database 'master', file 'mastlog' on file 1.
BACKUP DATABASE successfully processed 378 pages in 0.390 seconds (7.929 MB/sec).
Processed 176 pages for database 'model', file 'modeldev' on file 1.
Processed 2 pages for database 'model', file 'modellog' on file 1.
BACKUP DATABASE successfully processed 178 pages in 0.278 seconds (5.230 MB/sec).
Processed 896 pages for database 'msdb', file 'MSDBData' on file 1.
Processed 5 pages for database 'msdb', file 'MSDBLog' on file 1.
BACKUP DATABASE successfully processed 901 pages in 1.152 seconds (6.407 MB/sec).
Processed 456 pages for database 'Northwind', file 'Northwind' on file 1.
Processed 1 pages for database 'Northwind', file 'Northwind_log' on file 1.
BACKUP DATABASE successfully processed 457 pages in 0.515 seconds (7.269 MB/sec).
Processed 20704 pages for database 'AdventureWorks', file 'AdventureWorks_Data' on file 1.
Processed 1 pages for database 'AdventureWorks', file 'AdventureWorks_Log' on file 1.
BACKUP DATABASE successfully processed 20705 pages in 12.125 seconds (13.988 MB/sec).
Processed 176 pages for database 'test', file 'test' on file 1.
Processed 1 pages for database 'test', file 'test_log' on file 1.
BACKUP DATABASE successfully processed 177 pages in 0.235 seconds (6.170 MB/sec).

Hazırladığım scripti buradan indirebilirsiniz;
backup.sql
SQLBackup.cmd

İyi çalışmalar.

Reklamlar

26 comments on “SQL Server Express Otomatik Backup Alma

  1. Geri bildirim: SQL Server Express Otomatik Backup Alma – BACKUP (Transact-SQL) « Netsis nedir? Netsis bir atıftır…

  2. Ahmet bey paylaştığınız bilgileri çok yararlı buldum. Geliştirdiğimiz bir proje için periyodik olarak backup almamız gerekiyor. verdiğiniz kodu uyguladım ancak aşağıdaki hataları aldım;
    ———————————————-
    Msg 3201, Level 16, State 1, Line 1
    Cannot open backup device ‘C:\Backup\master_backup_201206030114.bak’. Operating system error 3(Sistem belirtilen yolu bulamıyor.).
    Msg 3013, Level 16, State 1, Line 1
    BACKUP DATABASE is terminating abnormally.
    Msg 3201, Level 16, State 1, Line 1
    Cannot open backup device ‘C:\Backup\model_backup_201206030114.bak’. Operating system error 3(Sistem belirtilen yolu bulamıyor.).
    Msg 3013, Level 16, State 1, Line 1
    BACKUP DATABASE is terminating abnormally.
    Msg 3201, Level 16, State 1, Line 1
    Cannot open backup device ‘C:\Backup\msdb_backup_201206030114.bak’. Operating system error 3(Sistem belirtilen yolu bulamıyor.).
    Msg 3013, Level 16, State 1, Line 1
    BACKUP DATABASE is terminating abnormally.
    Msg 3201, Level 16, State 1, Line 1
    Cannot open backup device ‘C:\Backup\ReportServer_backup_201206030114.bak’. Operating system error 3(Sistem belirtilen yolu bulamıyor.).
    Msg 3013, Level 16, State 1, Line 1
    BACKUP DATABASE is terminating abnormally.
    Msg 3201, Level 16, State 1, Line 1
    Cannot open backup device ‘C:\Backup\ReportServerTempDB_backup_201206030114.bak’. Operating system error 3(Sistem belirtilen yolu bulamıyor.).
    Msg 3013, Level 16, State 1, Line 1
    BACKUP DATABASE is terminating abnormally.
    Msg 3201, Level 16, State 1, Line 1
    Cannot open backup device ‘C:\Backup\backupdeneme_backup_201206030114.bak’. Operating system error 3(Sistem belirtilen yolu bulamıyor.).
    Msg 3013, Level 16, State 1, Line 1
    BACKUP DATABASE is terminating abnormally.
    Msg 3201, Level 16, State 1, Line 1
    Cannot open backup device ‘C:\Backup\İLETİSİM_backup_201206030114.bak’. Operating system error 3(Sistem belirtilen yolu bulamıyor.).
    Msg 3013, Level 16, State 1, Line 1
    BACKUP DATABASE is terminating abnormally.
    Msg 22049, Level 16, State 1, Line 0
    xp_delete_file() returned error 2, ‘Sistem belirtilen dosyayı bulamıyor.’
    ———————————–

    özelden veya yorum olarak cevaplarınızı bekliyorum şimdiden teşekkürler

    • Merhaba,

      Yararlanmaniza sevindim. Hatanin sebebi buyuk ihtimalle belirttiginiz path bilgiSinden.
      C diskinde backup diye bir klasor yoksa bu hatayi verecektir.
      Verdiginiz klasor yolu var olan bir klasor olmali. Kendisi klasor olusturamiyor.

      Bu sekilde deneyip sonucunu paylasir misiniz?

      Kolay gelsin.

  3. Ahmet bey dediğiniz gibi c: de backup klasörü olmadığı için hata vermiş. şimdi klasör oluşturduğumda bir kerelik backup aldı butun database leri ancak sql cmd yi yazdıgımda bu sefer de backup.sql invalid file name hatası veriyor. Sql scriptini çalıştırdıktan sonra dırek cmd e girdim böyle bir hata verdi. önce bir yere kayıt etmemiz mi gerekiyor. ayrıca ben windows 7 kullanıyorum ve sizin bahsettiğiniz task schedule i bulamadım. görev zamanlayıcısı var en benzeri onda da görev ekleyemedim

  4. Ayrıca
    -S localhost -E -i backup.sql -o C:\SQLBackupOutput_%date%.log
    komutunu sqlcmd modda da yazdıgımda
    Incorrect syntax near ‘S’
    hatası alıyorum anladıgım kadarıyla localhost ta bir hata veriyor ama.

    • Eger backup.sql diye bir dosyan yoksa invalid file name hatasi alabiRsin. Bunu kontrol et.
      Ayrica localhost default instance icin gecerli eger instance name farklimise localhost/instancename seklinde yazmalisin. Backup.sql dosyasi ile cmd dosyasi ayni yerde olmali.

      Windows 7 de gorev zamanyacasi dogru. Oradan yeni gorev olusturmaniz gerek

  5. Ahmet Bey Merhaba… Öncelikle bu yararlı bilgiler için çok teşekkür ederim. Benim öğrenmek istediğim konu script içerisinde yer alan ve belirttiğimiz gün sayısından eski backup ların silinmesi mevzusu… Ben bu kısmı 1 olarak ayarladım ama 1 günden eski backup lar silinmiyor. Ben sql server 2008 r2 kullanıyorum. Bununla bir alakası olabilir mi? İyi çalışmalar…

    • Merhaba Hakan Bey;

      Teşekkür ederim ilginiz için. Scriptte bir hata yok. Kendimde kullanıyorum. SQL 2008 R2 üstünde de test etmiştim. Script sadece sql serverın aldığı .bak dosyalarını silebiliyor. Buna dikkat etmelisiniz. Başka dosyaları vs silemez. Tekrardan kontrol eder misiniz? hata alıyorsanız scriptinizi bana gönderin lütfen

  6. Ahmet bey merhaba,
    default gelen bütün database dosyalarını değilde sadece bizim oluşturduğumuz 1 database nasıl yedekler?

    • Merhabalar,

      Tek DB için şu scripti çalıştırabilirsiniz. Her günün tarihi ile birlikte backup alacaktır.

      DECLARE @path varchar(100)
      DECLARE @day int
      DECLARE @date varchar(30)
      DECLARE @cmd varchar(250)
      DECLARE @DeleteDate datetime
      DECLARE @DBName nvarchar(500)
       
      ---- PARAMETRE TANIMLAMALARI ----
      
      SET @DBName = 'AdventureWorks2012' -- Buraya yazılan DB backuplanır sadece.
      SET @path = 'D:\old'  -- Backupların saklanacağı klasör yolu.
      SET @day = 5             -- Verilen gün sayısından eski backupları siler.
       
      ---- PARAMETRE TANIMLAMALARI ----
       
      SET @date = CONVERT(varchar(16),GETDATE(), 120)
      SELECT @date = REPLACE(@date,':','')
      SELECT @date = REPLACE(@date,' ','')
      SELECT @date = REPLACE(@date,'-','')
       
      SET @cmd = 'BACKUP DATABASE ['+@DBName+'] TO DISK = ''' + @path + '\'+@DBName+'_backup_' + @date + '.bak'' WITH INIT,COMPRESSION'
      EXEC(@cmd)
       
      SET @DeleteDate = DateAdd(day, -@day, GetDate())
      EXECUTE master.sys.xp_delete_file 0, @path, N'bak', @DeleteDate, 0
      GO
      
  7. Ahmet Bey çok teşekkür ederim. çok makbule geçti. diğer günler testini yapacağım verilen gün sayısı kadar backuplar ve sonrasını siler umarım 😉
    Dip Not: Bendeki sürüm comp. desteklemiyorum comp. silince backup aldı 😉

    BACKUP DATABASE WITH COMPRESSION is not supported on Express Edition (64-bit).

  8. merhaba öncelikle teşekkürler fakat bir sorunum var log dosyasını oluştururken %date% kısmında sorun yaşıyorum %date% yazmazsam sistem sorunsuz calişiyor ama tarih eklenmiyor dosya adına fakat %date% yazılı olursa dosyayı oluşturamıyor ve hata veriyor yardımcı olabilirmisiniz şimdiden teşekkürler.

    • İşinize yaramasına sevindim.
      Muhtemelen işletim sistemi ile alakalı bir problem var. Hata çıktısını gönderir misiniz? Daha kolay yardım edebilirim. En azından şunu deneyip çıktısını söyler misiniz? Boş bir CMD ekranı açıp %date% yazıp entera bastığınızda ne çıkıyor?

  9. Paylaşımınız için teşekkürler, çok faydalı oldu.
    Sadece veritabanının adı _2014 gibi bir ibareyle biten veya veritabanı adında 2014 ibaresi bulunan veritabanları yedeklenmek istenirse nasıl bir kod değişikliği yapılmalıdır.

    • İşinize yaramasına sevindim.

      Kodda şu satırı alttaki ile değiştirirseniz ihtiyacınızı karşılayacaktır.

      SET @cmd = ‘IF DB_ID(”?”)2 BACKUP DATABASE [?] TO DISK = ”’ + @path + ‘\?_backup_’ + @date + ‘.bak” WITH INIT’
      SET @cmd = ‘IF (”?” like ”%_2014”) BACKUP DATABASE [?] TO DISK = ”’ + @path + ‘\?_backup_’ + @date + ‘.bak” WITH INIT’

      • İlgilendiğiniz için teşekkür ederim. Kod değişikliği başarılı bir şekilde çalışıyor.

  10. Ağ üzerindeki paylaşıma açık adreslere ( \\192.168.2.210\km\Yedekler… \\M6\E… v.b.) yedekleme yapılamıyor. Sorunun kaynağı konusunda yardımcı olabilirmisiniz?

    Msg 3201, Level 16, State 1, Server M7\SQLEXPRESS, Line 1
    Cannot open backup device ‘\\192.168.2.210\km\Yedekler\M7\V8_OtoYedek_2014Test\DEMO_2014_Yedek_201402071756.bak’. Operating system error 5(Erişim engellendi.).
    Msg 3013, Level 16, State 1, Server M7\SQLEXPRESS, Line 1
    BACKUP DATABASE is terminating abnormally.
    HResult 0x5621, Level 16, State 1
    xp_delete_file() returned error 2, ‘Sistem belirtilen dosyayı bulamıyor.’

    • Merhaba,

      Bunun sebebi sql server service accountunuzun verdiğiniz pathe yetkili olamasından kaynaklanıyor. SQL Servisini domainden bir kullanıcı ile çalıştırıp, o pathe yetki verirseniz backup alabilirsiniz.

  11. Öncellikle ilginize çok teşekkür ederim cmd de bu hatayı alıyorum ne yapmam gerekiyor yardımcı olursaız çok sevinirim

    ‘SQLCMD’ iç ya da dış komut, çalıştırılabilir
    program ya da toplu iş dosyası olarak tanınmıyor.

  12. Merhabalar Ahmet Bey
    Bu kodu Çalıştırdığım Zaman
    SQL Backup Alıyor Sorun yok ama
    Silmede Sorun yaşıyorum Yardımcı oLursanız Çok Sevinirim.

    Error : The EXECUTE permission was denied on the object ‘xp_delete_file’, database ‘mssqlsystemresource’, schema ‘sys’.

    • Merhaba, işlemi yaptığınz kullanıcının yetkisi yeterli olmadığı için hata vetmiş. Sadece database seviyesinde yetkisi var sanırım. Server seviyesinde backup role tanımlamanız gerekir. Kolay gelsin.

  13. Ahmet bey windows 10 kullanıyorum. sqlcmd dosyasını çalıştırınca eylemi yapmıyor. management stüdio da kodu çalıştırınca işlemi yapıyor sorunu nasıl çözebilirim acaba

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s