SQL-Backup auf ein Netz-Laufwerk

Immer wieder stehe ich (manch anderer bestimmt auch) manchmal vor dem Problem, dass der Kunde ein separates Backup irgendwo auf einem Netzlaufwerk abgelegt haben möchte. Sei es um eine Kopie an einen Drittdienstleister weiterzugeben oder eine Jahres-Ultimo-Sicherung in den Safe zu bannen.

Man findet zahlreiche Beispiele, die unter der einen oder anderen SQL-Server Version (in Kombination mit den verschiedenen Windows-Versionen) funktionieren oder auch nicht. Ich habe vieles ausprobiert, aber war nie so wirklich glücklich. Also habe ich mich nochmal länger auf die Suche nach Lösungen begeben, als wieder mehrere Backups auf ein Netz-Laufwerk anstanden.

Mit dem folgenden Skript habe ich bisher auf unterschiedlichen Windows-Systemen und unterschiedlichen SQL-Server Versionen keinerlei Probleme gehabt, es hat immer einwandfrei funktioniert… (falls doch bitte in den Kommentaren “meckern”)

USE [master]
GO
 
DECLARE
@database_name varchar(100),
@Network_Share varchar(512),
@backupfile_name VARCHAR(512),
@backupdate varchar(8),
@SQLCMD nvarchar(512)
 
-- SET Datenbank Name
SELECT @database_name = 'Datenbankname';
 
-- Set Netzwerk-Pfad
SELECT @Network_Share = '\\hier.kommt.der.Netzwerkpfad.rein\Verzeichnis'; -- ohne abschließenden Backslash
 
-- Erzeugen Backup-Pfad und BackupFile-Name inkl. Datum
SELECT @backupdate = CONVERT(VARCHAR(8), GETDATE(), 112);
SET @backupfile_name = @Network_Share + '\' + @database_name + '_' + CONVERT(VARCHAR(8), GETDATE(), 112) + '.bak';
 
-- Altes Backup-Device löschen
IF EXISTS(SELECT * FROM sys.backup_devices where name = 'NetzLaufwerk_Device')
EXEC master.dbo.sp_dropdevice @logicalname = N'NetzLaufwerk_Device';
 
-- Erstelle neues Backup-Device
EXEC master.dbo.sp_addumpdevice @devtype = N'disk', @logicalname = N'NetzLaufwerk_Device', @physicalname = @backupfile_name;
 
-- Backup erstellen mittels neuem Backup-Device
SET @SQLCMD = N'BACKUP DATABASE [' + @database_name + '] TO [NetzLaufwerk_Device] WITH DESCRIPTION = N''Full Backup der ' + @database_name + ' auf ein Netzlaufwerk'', NOFORMAT, INIT, NAME =
N''FULL_BACKUP_' + @database_name+''', SKIP, NOREWIND, NOUNLOAD, STATS = 10, CHECKSUM, COPY_ONLY;'
 
print 'Just backing up ' + @database_name + ' to ' + @Network_Share;
exec sp_executesql @SQLCMD;
 
-- Löschen des verwendeten Backup-Devices
IF EXISTS(SELECT * FROM sys.backup_devices where name = 'NetzLaufwerk_Device')
EXEC master.dbo.sp_dropdevice @logicalname = N'NetzLaufwerk_Device';

Für dieses Skript habe ich die für besten Parts aus mehreren anderen Skripten und Blogs herausgesucht und für mich funktional optimiert zusammengesetzt.

Ich hoffe damit jemandem geholfen zu haben.

Björn arbeitet in Hamburg als Datenbank-Administrator und Head of Competence für MS SQL und mySQL. Er nimmt regelmäßig an den PASS Regionalgruppen Treffen in Hamburg, den Veranstaltungen der PASS wie SQLSaturday und SQLGrillen teil und er organisiert in Hamburg das Azure Meetup. Er interessiert sich neben den Themen rund um den SQL Server, Powershell und Azure für Science-Fiction, Snowboarden, Backen 😉 und Radfahren.

Leave a Reply

Your email address will not be published. Required fields are marked *