dibadu
Goto Top

SQL-Express Datenbanksicherung

Diese Anleitung beschriebt wie eine SQL-Datenbank in einem SQL-Express - Datenbank -Server auf Windows Server gesichert werden kann. Ich hatte das Problem da es für eine SQL-Express-Datenbank keine Backup-Möglichkeit von Microsoft gibt. Daher musste ich mir selber helfen....

back-to-topMeine Voraussetzungen

  • Installierter und funktionsfähiger SQL-Server 2017 Express
  • ODBC- Treiber Version 17
  • Installiertes Microsoft SQL-Server Management Studio 18.5 (SSMS)
  • die zu sichernde Datenbank ist bereits eingerichtet

back-to-topÜbersicht

  • Mit Hilfe des SSMS wird eine Prozedur erstellt
  • Diese Prozedur wir mithilfe eines Scripts aufgerufen
  • Dieses Script wir mittels „geplanten Tasks“ regelmäßig aufgerufen

los gehts....

back-to-topProzedur erstellen

SSMS aufrufen und mit dem Server Verbinden
sql-sicherung_anmeldung

Datei → Neu → Abfrage mit aktueller Verbindung
sql-sicherung_neueabfrage

den folgenden Code in das sich öffnende Fenster kopieren
/ Copyright © Microsoft Corporation.  All Rights Reserved.

// This code released under the terms of the

// Microsoft Public License (MS-PL, http://opensource.org/licenses/ms-pl.html.)

    USE [master] 

    GO 

    /****** Object:  StoredProcedure [dbo].[sp_BackupDatabases] ******/ 

    SET ANSI_NULLS ON 

    GO 

    SET QUOTED_IDENTIFIER ON 

    GO 

     

    -- ============================================= 

    -- Author: Microsoft 

    -- Create date: 2010-02-06

    -- Description: Backup Databases for SQLExpress

    -- Parameter1: databaseName 

    -- Parameter2: backupType F=full, D=differential, L=log

    -- Parameter3: backup file location

    -- =============================================

     

    CREATE PROCEDURE [dbo].[sp_BackupDatabases]  

                @databaseName sysname = null,

                @backupType CHAR(1),

                @backupLocation nvarchar(200) 

    AS 

     

           SET NOCOUNT ON; 

               

                DECLARE @DBs TABLE

                (

                      ID int IDENTITY PRIMARY KEY,

                      DBNAME nvarchar(500)

                )

               

                 -- Pick out only databases which are online in case ALL databases are chosen to be backed up

                 -- If specific database is chosen to be backed up only pick that out from @DBs

                INSERT INTO @DBs (DBNAME)

                SELECT Name FROM master.sys.databases

                where state=0

                AND name=@DatabaseName

                OR @DatabaseName IS NULL

                ORDER BY Name

               

                -- Filter out databases which do not need to backed up

                IF @backupType='F'  

                      BEGIN

                      DELETE @DBs where DBNAME IN ('tempdb','Northwind','pubs','AdventureWorks')  

                      END

                ELSE IF @backupType='D'  

                      BEGIN

                      DELETE @DBs where DBNAME IN ('tempdb','Northwind','pubs','master','AdventureWorks')  

                      END

                ELSE IF @backupType='L'  

                      BEGIN

                      DELETE @DBs where DBNAME IN ('tempdb','Northwind','pubs','master','AdventureWorks')  

                      END

                ELSE

                      BEGIN

                      RETURN

                      END

               

                -- Declare variables

                DECLARE @BackupName varchar(100)

                DECLARE @BackupFile varchar(100)

                DECLARE @DBNAME varchar(300)

                DECLARE @sqlCommand NVARCHAR(1000) 

            DECLARE @dateTime NVARCHAR(20)

                DECLARE @Loop int                  

                           

                -- Loop through the databases one by one

                SELECT @Loop = min(ID) FROM @DBs

     

          WHILE @Loop IS NOT NULL

          BEGIN

     

    -- Database Names have to be in [dbname] format since some have - or _ in their name

          SET @DBNAME = '['+(SELECT DBNAME FROM @DBs WHERE ID = @Loop)+']'  

     

    -- Set the current date and time n yyyyhhmmss format

          SET @dateTime = REPLACE(CONVERT(VARCHAR, GETDATE(),101),'/','') + '_' +  REPLACE(CONVERT(VARCHAR, GETDATE(),108),':','')    

     

    -- Create backup filename in path\filename.extension format for full,diff and log backups

          IF @backupType = 'F'  

                SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_FULL_'+ @dateTime+ '.BAK'  

          ELSE IF @backupType = 'D'  

                SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_DIFF_'+ @dateTime+ '.BAK'  

          ELSE IF @backupType = 'L'  

                SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_LOG_'+ @dateTime+ '.TRN'  

     

    -- Provide the backup a name for storing in the media

          IF @backupType = 'F'  

                SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' full backup for '+ @dateTime  

          IF @backupType = 'D'  

                SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' differential backup for '+ @dateTime  

          IF @backupType = 'L'  

                SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' log backup for '+ @dateTime  

     

    -- Generate the dynamic SQL command to be executed

     

           IF @backupType = 'F'   

                      BEGIN

                   SET @sqlCommand = 'BACKUP DATABASE ' +@DBNAME+  ' TO DISK = '''+@BackupFile+ ''' WITH INIT, NAME= ''' +@BackupName+''', NOSKIP, NOFORMAT'  

                      END

           IF @backupType = 'D'  

                      BEGIN

                   SET @sqlCommand = 'BACKUP DATABASE ' +@DBNAME+  ' TO DISK = '''+@BackupFile+ ''' WITH DIFFERENTIAL, INIT, NAME= ''' +@BackupName+''', NOSKIP, NOFORMAT'          

                      END

           IF @backupType = 'L'   

                      BEGIN

                   SET @sqlCommand = 'BACKUP LOG ' +@DBNAME+  ' TO DISK = '''+@BackupFile+ ''' WITH INIT, NAME= ''' +@BackupName+''', NOSKIP, NOFORMAT'          

                      END

     

    -- Execute the generated SQL command

           EXEC(@sqlCommand)

     

    -- Goto the next database

    SELECT @Loop = min(ID) FROM @DBs where ID>@Loop

     

    END

auf ausführen klicken
sql-sicherung_abfrageerstellen

Das Programm schließen, die Änderungen müssen nicht gespeichert werden.


back-to-topScript erstellen

  • den Ordner C:\Datensicherung SQL\ erstellen
  • die Datei backup.bat erstellen, bearbeiten und den folgenden Befehl einfügen
sqlcmd -U SA -P 123456 -S .\SQLEXPRESS -Q "EXEC sp_BackupDatabases  @databaseName = vmeister, @backupLocation =N'C:\Datensicherung SQL\', @BackupType=N'F'"   
  • 123456 muss durch das Passwort für den Benutzer SA des SQl-Servers ersetzt werden!
  • Die Datei speichern und 1x aufrufen. Nach einigen Sekunden müsste eine neue Datei im Ordner erstellt werden.
  • den Datenbanknamen (im Beispiel "vmeister") muss man an seinen eigenen Datenbanknamen anpassen!



back-to-topgeplanten Task erstellen

  • Die Windows Aufgabenplanung öffnen
  • auf „Einfache Aufgabe erstellen…“ klicken
sql-sicherung_task1

Aufgabenbeschreibung ausfüllen damit die Aufgabe später nochmal nachvollzogen werden kann → Weiter
sql-sicherung_task2

Täglich anklicken → Weiter
sql-sicherung_task3

Die Startzeit auf 0:30h legen → Weiter
sql-sicherung_task4

Programm starten → Weiter
sql-sicherung_task5

Den Pfad zum Script eingeben oder Auswählen → Weiter
sql-sicherung_task6

Angaben kontrollieren, dann → Fertigstellen
sql-sicherung_task7

Links unter „Aufgabenplanungsbibliothek“ wird der Auftrag jetzt aufgelistet und kann bei Bedarf bearbeitet werden.
sql-sicherung_task8

Am Ende die erstellte Aufgabe nochmal doppelt anklicken und die Einstellung „Unabhängig von der Benutzeranmeldung ausführen“ anklicken und speichern.
sql-sicherung_task_benutzer

back-to-topHinweise und Links



back-to-topältere Backups löschen

da die SQL-Backups jetzt täglich gesichert werden, wird natürlich der Datenbestand im Sicherungsordner immer größer. Mit dem folgenden Script lösche ich alle Backups, die älter als 4 Tage sind (natürlich nachdem ich sie vorher au ein externes Medium gesichert habe):
Eine Datei C:\Datensicherung\aufraemen.bat erstellen mit folgendem Inhalt:
mkdir C:\TEMP
robocopy.exe C:\Datensicherung C:\TEMP *.bak /E /MOVE /MINAGE:4 /R:1 /W:1
rmdir C:\TEMP /s /q
Das Script verschiebt alle älteren Dateien in einen neuen Ordner und löscht diesen dann....


Bei Hinweisen, Fehlern, Ergänzungen... bitte eine Nachricht schicken. Viel Erfolg

Content-ID: 607303

Url: https://administrator.de/contentid/607303

Ausgedruckt am: 21.11.2024 um 20:11 Uhr

monstermania
monstermania 25.09.2020 um 08:57:16 Uhr
Goto Top
Klar, kann man auch händisch machen...
Ich nutze seit vielen Jahren das Tool SQLBackupAndFTP für die Datenbanksicherung von SQLExpress-Servern. Das Tool bietet dann noch ein paar Goodies, wie z.B. das automatische Zippen der Sicherungen und auch eine Transaktionsprotokollsicherung.
Die Free-Version dürfte für die meisten User vollkommen ausreichen.
Th0mKa
Th0mKa 25.09.2020 um 11:54:21 Uhr
Goto Top
Zitat von @DiBaDu:

Ich hatte das Problem da es für eine SQL-Express-Datenbank keine Backup-Möglichkeit von Microsoft gibt. Daher musste ich mir selber helfen....

Wenn es keine Backupmöglichkeit von Microsoft gibt, warum benutzt du dann ausschließlich Tools und Code von Microsoft für dein Backup? 🙃 Aber gute Anleitung... 👍

/Thomas
DiBaDu
DiBaDu 25.09.2020 um 14:15:35 Uhr
Goto Top
Zitat von @Th0mKa:
...
Wenn es keine Backupmöglichkeit von Microsoft gibt, warum benutzt du dann ausschließlich Tools und Code von Microsoft für dein Backup? 🙃 Aber gute Anleitung... 👍

/Thomas
Das bezog sich auf die Tatsache, das man bei den "vollwertigen" SQL- Servern eine Backup-Möglichkeit direkt von MS mitgeliefert bekommt. Beim Express-Server muss man sich halt selber helfen.
DiBaDu
DiBaDu 25.09.2020 um 14:18:26 Uhr
Goto Top
Zitat von @monstermania:
Ich nutze seit vielen Jahren das Tool SQLBackupAndFTP für die Datenbanksicherung von SQLExpress-Servern. Das Tool bietet dann noch ein paar Goodies, wie z.B. das automatische Zippen der Sicherungen und auch eine Transaktionsprotokollsicherung.
Die Free-Version dürfte für die meisten User vollkommen ausreichen.

Danke für den Hinweis. Ich werde mir auch das Tool mal ansehen und vielleicht hilft es jemand anderem ja auch weiter. Ich finde es gut wenn man mehrere Möglichkeiten zur Auswahl hat und sich dann die für sich optimale heraussuchen kann.
Danke
nocheinnoobmehr
nocheinnoobmehr 10.10.2020 um 17:58:36 Uhr
Goto Top
Einen Schwachpunkt sehe ich in der "backup.bat". Dort muß das Passwort der DB im Klartext hinterlegt sein.

btw: Sqlbackupandftp nutze ich auch schon länger. Top Tool!
it-frosch
it-frosch 13.10.2020 um 09:13:43 Uhr
Goto Top
Hallo,

ich nutze das Script auch, verwende aber zum routieren der Backups die delag32.exe
und für die E-Mail Benachrichtigung blat.

Bis jetzt (SQL 2012) funktioniert das prima.

grüße vom it-frosch