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.
Daha sonra açılan pencereden kaydedilecek yeri seçip OK tuşuna basıp veri tabanınızın yedeğinizi alabilirsiniz.
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.
İ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.
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.
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.
Evet Yusuf Hocam logo ERP için rica ediyroum.
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
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.