it-swarm.com.de

Wie kann ich eine tägliche Sicherung mit SQL Server Express planen?

Ich verwende eine kleine Webanwendung mit SQL Server Express (2005) als Backend. Ich kann ein Backup mit einem SQL-Skript erstellen, dies möchte ich jedoch täglich planen. Als zusätzliche Option (sollte man haben) möchte ich nur die letzten X-Backups behalten (aus Platzgründen natürlich).

[Bearbeiten] SQL Server-Agent ist in SQL Server Express nicht verfügbar ...

61
edosoft

Sie können den SQL Server-Agenten nicht in SQL Server Express verwenden. Die Methode, die ich zuvor gemacht habe, ist das Erstellen eines SQL-Skripts, das dann jeden Tag als geplante Aufgabe ausgeführt wird Ihr Backup-Zeitplan/Aufbewahrung. Der Befehl, den ich in der geplanten Aufgabe verwende, lautet:

"C:\Programme\Microsoft SQL Server\90\Tools\Binn\SQLCMD.EXE" -i "c:\Pfad\zu\sqlbackupScript.sql"

51
Sam Cogan

Eduardo Molteni hatte eine großartige Antwort:

Geplante Tasks von Windows verwenden:

In der Batchdatei

"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXE" -S 
(local)\SQLExpress -i D:\dbbackups\SQLExpressBackups.sql

In SQLExpressBackups.sql

BACKUP DATABASE MyDataBase1 TO  DISK = N'D:\DBbackups\MyDataBase1.bak' 
WITH NOFORMAT, INIT,  NAME = N'MyDataBase1 Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10

BACKUP DATABASE MyDataBase2 TO  DISK = N'D:\DBbackups\MyDataBase2.bak' 
WITH NOFORMAT, INIT,  NAME = N'MyDataBase2 Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10

GO
49
JohnB

Verwenden Sie einfach this script, um alle Datenbanken auf dem Server dynamisch zu sichern. Dann erstellen Sie die Batch-Datei gemäß dem Artikel. Es ist nützlich, zwei Batchdateien zu erstellen, eine für die vollständige und eine für die differenzielle Sicherung. Erstellen Sie dann zwei Aufgaben in der Aufgabenplanung, eine für vollständige und eine für diff.

-- // 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 [email protected]
            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 ' [email protected]+  ' TO DISK = '''[email protected]+ ''' WITH INIT, NAME= ''' [email protected]+''', NOSKIP, NOFORMAT'
                  END
       IF @backupType = 'D'
                  BEGIN
               SET @sqlCommand = 'BACKUP DATABASE ' [email protected]+  ' TO DISK = '''[email protected]+ ''' WITH DIFFERENTIAL, INIT, NAME= ''' [email protected]+''', NOSKIP, NOFORMAT'        
                  END
       IF @backupType = 'L' 
                  BEGIN
               SET @sqlCommand = 'BACKUP LOG ' [email protected]+  ' TO DISK = '''[email protected]+ ''' WITH INIT, NAME= ''' [email protected]+''', NOSKIP, NOFORMAT'        
                  END

-- Execute the generated SQL command
       EXEC(@sqlCommand)

-- Goto the next database
SELECT @Loop = min(ID) FROM @DBs where ID>@Loop

END

Und die Batch-Datei kann folgendermaßen aussehen:

sqlcmd -S localhost\myDB -Q "EXEC sp_BackupDatabases @backupLocation='c:\Dropbox\backup\DB\', @backupType='F'"  >> c:\Dropbox\backup\DB\full.log 2>&1

und

sqlcmd -S localhost\myDB -Q "EXEC sp_BackupDatabases @backupLocation='c:\Dropbox\backup\DB\', @backupType='D'"  >> c:\Dropbox\backup\DB\diff.log 2>&1

Der Vorteil dieser Methode besteht darin, dass Sie keine Änderungen vornehmen müssen, wenn Sie eine neue Datenbank hinzufügen oder eine Datenbank löschen. Sie müssen nicht einmal die Datenbanken im Skript auflisten. Die Antwort von JohnB ist für Server mit einer Datenbank besser/einfacher. Dieser Ansatz eignet sich besser für mehrere Datenbankserver.

7
Tomas Kubes

Die Leute bei MSSQLTips enthalten einige sehr hilfreiche Artikel. Der relevanteste Artikel ist " Automatisieren von SQL Server 2005 Express-Sicherungen und Löschen älterer Sicherungsdateien "

Der grundlegende Ansatz besteht darin, zwei Aufgaben mit dem Windows-Aufgabenplaner einzurichten. Eine Task führt ein TSQL-Skript aus, das für alle MSSQL-Datenbanken (außer TEMPDB) separate Sicherungsdateien mit dem Datenbanknamen und einem Datums-/Zeitstempel im Dateinamen in einem angegebenen Verzeichnis generiert. Die zweite Task führt ein VBScript-Skript aus, das dieses Verzeichnis durchläuft, und löscht alle Dateien mit der Erweiterung .BAK, die älter als 3 Tage sind.

Beide Skripts erfordern eine geringfügige Bearbeitung für Ihre Umgebung (Pfade, wie lange diese Datenbank-Dumps aufbewahrt werden sollen), sind jedoch dem Drop-in-and-Run sehr nahe. 

Beachten Sie, dass es mögliche Auswirkungen auf die Sicherheit geben kann, wenn Sie mit diesen oder mit Verzeichnisberechtigungen sloppy sind, da es sich um reine Textdateien handelt, die mit einer gewissen Berechtigungsstufe ausgeführt werden müssen. Sei nicht schlampig.

4
fencepost

Wir haben die Kombination aus:

  1. Cobian Backup zur Planung/Wartung

  2. ExpressMaint für die Sicherung

Beide sind kostenlos. Der Prozess besteht darin, ExpressMaint mit einem Skript als "Cobian-Ereignis" vor der Sicherung "zu sichern. Normalerweise lasse ich die vorherige Sicherungsdatei überschreiben. Cobian entnimmt daraus einen Zip/7Zip und archiviert diesen im Sicherungsordner. In Cobian können Sie die Anzahl der vollständigen Kopien angeben, mehrere Sicherungszyklen erstellen usw.

Beispiel für die ExpressMaint-Befehlssyntax:

expressmaint -S Host\SQLEXPRESS -D ALL_USER -T DB -R logpath -RU WEEKS -RV 1 -B backuppath -BU HOURS -BV 3 
3
mika

Sie können beispielsweise ein Sicherungsgerät in einem Serverobjekt erstellen 

BDTEST

und erstellen Sie dann eine Batchdatei mit folgendem Befehl

sqlcmd -S 192.168.1.25 -E -Q "BACKUP DATABASE dbtest TO BDTEST"

lassen Sie uns mit Namen sagen 

backup.bat

dann kannst du anrufen 

backup.bat

im Taskplaner nach Ihren Wünschen

0
Susheel Kumar