SQL-Backup auf ein Netz-Laufwerk
Björn Peters
13. März 2015

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.
AUTOR
Björn Peters
Björn arbeitet als Senior Consultant mit Schwerpunkt Microsoft Data Platform, SQL Server, PowerShell und Azure SQL. Er unterstützt Kunden bei Betrieb, Migration, Hochverfügbarkeit, Performance-Analyse und Troubleshooting. Auf SQL aus Hamburg teilt er Erfahrungen aus realen Projekten – praxisnah, technisch und mit Blick auf stabile, nachvollziehbare Lösungen. Neben SQL Server interessiert er sich für Science-Fiction, Backen und Radfahren.
