SQL kullanıyorsanız veri tabanlarınızın yedeğini belirli aralıklarla almanız gerekiyor. Bunu yedek almak istediğiniz veri tabanına (SSMS kullandığınızı varsayarak) Sağ Tıklayıp > Tasks > Back Up… açılan pencereden işlemleri devam ettirerek alabilirsiniz.

Veri Tabanı Yedeğini alma

Daha sonra açılan pencereden kaydedilecek yeri seçip OK tuşuna basıp veri tabanınızın yedeğinizi alabilirsiniz.

Veri Tabanı Yedeği Alma 2

Fakat çok sayıda veri tabanınız varsa bu işlem oldukça uzayacaktır. Onun yerine aşağıda verdiğim scripti kullanarak sistemde bulunan bütün veri tabanlarınızın yedeğini alabileceksiniz:

DECLARE @yol VARCHAR(500)
DECLARE @vtAdi VARCHAR(500)
DECLARE @dosyaAdi VARCHAR(256)
DECLARE @zaman DATETIME
DECLARE @yil VARCHAR(4)
DECLARE @ay VARCHAR(2)
DECLARE @gun VARCHAR(2)
DECLARE @saat VARCHAR(2)
DECLARE @dakika VARCHAR(2)
DECLARE @saniye VARCHAR(2)
 


SELECT @zaman = GETDATE()
SELECT @yil   = (SELECT CONVERT(VARCHAR(4), DATEPART(yy, @zaman)))
SELECT @ay  = (SELECT CONVERT(VARCHAR(2), FORMAT(DATEPART(mm,@zaman),'00')))
SELECT @gun    = (SELECT CONVERT(VARCHAR(2), FORMAT(DATEPART(dd,@zaman),'00')))
SELECT @saat   = (SELECT CONVERT(VARCHAR(2), FORMAT(DATEPART(hh,@zaman),'00')))
SELECT @dakika = (SELECT CONVERT(VARCHAR(2), FORMAT(DATEPART(mi,@zaman),'00')))
SELECT @saniye = (SELECT CONVERT(VARCHAR(2), FORMAT(DATEPART(ss,@zaman),'00')))

 
SET @yol = 'C:\yedekler\' 
DECLARE db_cursor CURSOR FOR  
SELECT name 
FROM master.dbo.sysdatabases 
WHERE name NOT IN ('master','model','msdb','tempdb')  


OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO @vtAdi   

WHILE @@FETCH_STATUS = 0   
BEGIN
   
       SET @dosyaAdi = @yol + @vtAdi + '_' + @yil + @ay + @gun + @saat + 
@dakika + @saniye + '.BAK'  
       BACKUP DATABASE @vtAdi TO DISK = @dosyaAdi  

 
       FETCH NEXT FROM db_cursor INTO @vtAdi   
END   
CLOSE db_cursor   
DEALLOCATE db_cursor

Yukarıdaki sorguyu çalıştırdığımızda C’nin altında yedekler klasörüne sistem veri tabanları hariç bütün veri tabanlarının yediğini aldığını göreceksiniz.

Yedek Alınan Veri Tabanları

İsterseniz FROM master.dbo.sysdatabases WHERE name sorgusuna kısıt vererek sadece kendi istediğiniz veri tabanlarının da yedeğini alma imkanına sahipsiniz.

5 Replies to “SQL’de Bütün Veri Tabanlarının Yedeklerini Alan Script Kodu

  1. Hocam Paylaşım ve katkılarınızdan dolayı teşekkür ediyorum. Mümkünse çok dönemli (Yıl) DB nin içerisinden seçili (Bir/bir kaç) dönemin yedeğini almamızı sağlayacak sorgu paylaşabilirseniz çok sevinirim. Teşekkürler ve saygılarımla.

    1. Merhaba,

      Tablolarınızın isimleri herhangi bir sistematiğe bağlı mı acaba? Mesela Logo gibi bir ERP kullanıyorsanız LG_{Dönem Kodu}…. gibi başlıyor tablo isimleri. Eğer sizin de öyle ise paylaşırsanız yardımcı olmaya çalışırım.

        1. Merhaba,

          Aşağıdaki gibi bir kod işinizi görecektir diye düşünüyorum. Kod aslında yeni bir veritabanı açıp sizin verdiğiniz kısıtlara göre tabloları kopyalıyor. Ama bu sırada tabiki bütün indexler, viewler, prosedürler ve fonksiyonlar gitmiş oluyor. Eğer daha sonradan bu veritabanını dönüp işlemlere kaldığınız yerden devam etmek istiyorsanız ilk önce güncel halini yedek alıp döndükten sonra Cursor’ın içindeki SET @SQL ifadesini
          SET @SQL = CONCAT(‘DROP TABLE ‘, @TabloAdi) olarak güncellemeniz halinde ilgili tabloları silecektir. Böylece sadece işinize yarar tablolar kalmış olacaktır. Kod aşağıda paylaşıyorum:

          DECLARE @TabloAdi varchar(500)
          DECLARE @SQL Nvarchar(500)
          DECLARE @YedekVT as varchar(50)
          SET @YedekVT = ‘VTYEDEK’ –Yedek Veritabanının Adı

          SET @SQL = CONCAT(‘CREATE DATABASE ‘, @YedekVT)
          exec sp_sqlexec @sql

          DECLARE crsTablo CURSOR FOR
          SELECT NAME FROM sys.tables
          WHERE NAME LIKE ‘LG%224%’ –Tablo Kısıtı

          OPEN crsTablo
          FETCH NEXT FROM crsTablo into @TabloAdi
          WHILE @@FETCH_STATUS = 0
          BEGIN
          SET @SQL = CONCAT(‘SELECT * INTO ‘,@YedekVT,’..’, @TabloAdi,’ FROM ‘ ,@TabloAdi)
          exec sp_sqlexec @sql

          FETCH NEXT FROM crsTablo INTO @TabloAdi

          END
          CLOSE crsTablo
          DEALLOCATE crsTablo

  2. Yusuf Hocam ilgilerinize çok teşekkür ediyorum. Sizden ricam sayfa başındaki gibi ful yedek değil de firmanın sadece 2024 yılına ait olan döneminin yedeğini alabileceğimiz sayfa başındaki gibi bir script rica ediyorum mümkünse. Çok sağolun.

Bir yanıt yazın

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