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.

Übernahme von MSSQL-Datenbank-Servern in unsere Verantwortung

Unser Arbeitgeber sieht eine seiner Kernkompetenzen im Bereich Outsourcing, dadurch kommen immer wieder neue Umgebungen, Installationen und Situationen rund um die Betreuung von MSSQL-Servern auf uns zu.
Somit stehen wir fast täglich vor der Aufgabe diese neuen Server erstmal zu analysieren und überprüfen, damit wir einen groben Überblick haben. Hierzu gehören Themen wie:

  • Welche Edition ist installiert? Standard, Enterprise? 32 oder 64 Bit?
  • Wieviele Instanzen gibt es?
  • Wie groß sind die Datenbanken?
  • Wo liegen die Datenbanken? Liegen die vielleicht sogar auf dem C-Laufwerk?
  • Wieviel Plattenplatz steht noch zur Verfügung?
  • Wann ist das letzte Backup gelaufen und womit wird gesichert?
  • Welche Wartungspläne gibt es? Wann laufen die?
  • Gibt es Auffälligkeiten in den Error-/System-Logs?
  • Welche User verfügen über „sysadmin“-Rechte?
  • Werden unsere „Best-Practise“-Standards eingehalten?
  • Können wir unsere Security-Baseline einhalten oder müssen wir Anpassungen durchführen?

Diese Fragestellungen tauchen jedes Mal wieder auf und jedes Mal benötigt man mehrere Stunden für einen Server, um sich die relevanten Punkte einzeln zusammenzuklicken. Dann müssen die entsprechend dokumentiert und ausgewertet werden. Jede MSSQL-Datenbank-Installation bzw Instanz muss dann aus diesen gesammelten Daten in eine CMDB eingepflegt werden.

Wie kann man solche wiederkehrenden Tätigkeiten vereinfachen?
Kann man das nicht irgendwie skripten?

Kann man bestimmt! Da wir aber nicht unbedingt die Experten in Sachen TSQL-Entwicklung sind, andere bestimmt ähnliche Themen haben und sich schon mal Gedanken gemacht haben, bemühten wir eine bekannte Suchmaschine… Zahlreiche Beiträge, Ideen und Skripte gelesen und ausprobiert.

Brentozar.com - sp_BLITZ - MSSQL Server Takeover Script
Brentozar.com - sp_BLITZ - SQL Server Takeover Script

Das einfachste und beste, was uns im Zusammenhang mit solchen „Betriebsübernahmen“ in die Hände kam, war die StoredProcedure „sp_blitz“ von Brent Ozar.
Brent und sein Team haben hier ein (aus unserer Sicht) super Skript geschrieben, es analysiert weitestgehend alle relevanten Themen wie Backup, Performance und Security und liefert zu jeder gefundenen „Auffälligkeit“ eine ausführliche und gut dokumentierte Beschreibung und Lösungsansätze. Mittels dieser ersten Analyse, welche wir in unserem Sharepoint ablegen, erhalten wir einen großen Teil an Informationen und Hinweise auf mögliche bestehende Probleme, hieraus erstellen wir dann einen ToDo-Plan für jeden MSSQL-Datenbankserver, den wir dann mit dem zuständigen Ansprechpartner besprechen und zur Umsetzung einen „Fahrplan“ aufsetzen.

Für alle anderen für uns wichtigen Punkte, die wir für unsere CMDB benötigen, ermitteln wir ebenfalls per Skript, dieses haben wir allerdings selbst geschrieben und ist auf unsere CMDB abgestimmt. Mittels beider Skripte konnten die benötigte Zeit für solch eine Übernahme mit gutem Gewissen von fast einem Tag auf gut 1 Stunde reduzieren.
Auch hier kommt wieder uns grundlegendes Motto zum Tragen: Nur ein ruhiger Tag ist ein guter Tag… möglichst alles automatisiert, standardisiert und dadurch genügend Zeit gewinnen um sich um andere Dinge zu kümmern. (z.B. aktuell MSSQL 2012 – Cluster Installation in den verschiedensten Ausprägungen – mit und/oder ohne AvailibilityGroups usw – darüber berichten wir später)

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.