SQL Stored Procedure kullanarak veritabanı yedeklemesi

Microsoft SQL sunucularda, windows komut satırı kullanılarak sunucuda bulunan veritabanlarının yedeklemesi yapılabilir.

Bu şekilde yedekleme yapabilmek için MS SQL sunucuda “xp_cmdshell” desteğinin aktif olması gerekiyor.
Bu özelliği açmak için aşağıdaki SQL sorgusu kullanılabilir:

USE master
GO
EXEC sp_configure ‘show advanced options’, 1
GO
RECONFIGURE WITH OVERRIDE
GO
EXEC sp_configure ‘xp_cmdshell’, 1
GO
RECONFIGURE WITH OVERRIDE
GO
EXEC sp_configure ‘show advanced options’, 0
GO

Bir güvenlik önlemi olarak, xp_cmdshell stored procedure’ı veritabanı yöneticisi tarafından kaldırıldıysa (ki Microsoft’un bunu pek de önerdiği söylenemez), tanımlamak için xpsql70.dll dosyasının sistemde bulunması yeterli. Bunun için aşağıdaki SQL sorgusunun çalıştırılması gerekir:

EXEC sp_addextendedproc ‘xp_cmdshell’, ‘xpsql70.dll’

 

Aşağıdaki SQL sorgusu kullanılarak MS SQL sunucusu üzerindeki veritabanı veya veritabanları bilgisayarda belirtilen bir klasöre yedeklenir.

DECLARE @name VARCHAR(50) — database name
DECLARE @path VARCHAR(256) — path for backup files
DECLARE @fileName VARCHAR(256) — filename for backup
DECLARE @fileDate VARCHAR(20) — used for file name
DECLARE @command VARCHAR(255) — used for creating a folder for backup date
DECLARE @full_path varchar(500)

SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112)

SET NOCOUNT ON
SET @path = ‘C:\Backup\’
SET @full_path = @path + @fileDate
SET @command = ‘mkdir ‘ + @full_path
EXEC master..xp_cmdshell @command , no_output
SET NOCOUNT OFF

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 @name

WHILE @@FETCH_STATUS = 0
BEGIN
SET @fileName = @full_path + ‘\’ + @name + ‘_’ + @fileDate + ‘.BAK’
BACKUP DATABASE @name TO DISK = @fileName

FETCH NEXT FROM db_cursor INTO @name
END

CLOSE db_cursor
DEALLOCATE db_cursor

 

Yukarıdaki SQL sorgusunu “*.sql” olarak kaydedip aşağıdaki komut ile Windows Komut Ekranı kullanarak yedekleme işlemini yapabiliriz:

SQLCMD -S<SQL Sunucu Adı> -U<Kullanıcı Adı> -P<Sifre> -i<SQL Sorgu dosyası>