web-dev-qa-db-fra.com

Comment planifier une sauvegarde quotidienne avec SQL Server Express?

J'exécute une petite application Web avec SQL Server Express (2005) comme serveur principal. Je peux créer une sauvegarde avec un script SQL, cependant, j'aimerais planifier cela quotidiennement. Comme option supplémentaire (devrait-avoir) je voudrais ne garder que les dernières sauvegardes X (pour des raisons d'économie d'espace évidemment) Des pointeurs?

[edit] L'agent du serveur SQL n'est pas disponible dans SQL Server Express ...

61
edosoft

Vous ne pouvez pas utiliser l'agent SQL Server dans SQL Server Express . Comme je l'ai déjà fait auparavant, vous devez créer un script SQL, puis l'exécuter sous la forme d'une tâche planifiée chaque jour. votre planning de sauvegarde/rétention. La commande que j'utilise dans la tâche planifiée est la suivante:

"C:\Programmes\Microsoft SQL Server\90\Outils\Binn\SQLCMD.EXE" -i "c:\chemin\to\sqlbackupScript.sql"

51
Sam Cogan

Eduardo Molteni avait une excellente réponse:

Utilisation de tâches planifiées Windows:

Dans le fichier batch

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

Dans 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

Utilisez simplement this script pour sauvegarder de manière dynamique toutes les bases de données sur le serveur. Créez ensuite un fichier de commandes en fonction de l'article. Il est utile de créer deux fichiers de commandes, un pour la sauvegarde complète et un pour la sauvegarde diff. Ensuite, créez deux tâches dans le Planificateur de tâches, une pour les tâches complètes et une pour les tâches 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 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

Et le fichier de commandes peut ressembler à ceci:

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

et

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

L'avantage de cette méthode est qu'il n'est pas nécessaire de changer quoi que ce soit si vous ajoutez une nouvelle base de données ou supprimez une base de données, vous n'avez même pas besoin de répertorier les bases de données dans le script. La réponse de JohnB est meilleure/plus simple pour un serveur avec une base de données, cette approche convient mieux aux serveurs multi-bases.

7
Tomas Kubes

Les personnes de MSSQLTips ont quelques articles très utiles, le plus pertinent à cet égard est " Automatisation des sauvegardes SQL Server 2005 Express et suppression des fichiers de sauvegarde plus anciens "

L'approche de base consiste à configurer deux tâches à l'aide du planificateur de tâches Windows. Une tâche exécute un script TSQL qui génère des fichiers de sauvegarde distincts pour toutes les bases de données MSSQL (à l'exception de TEMPDB) avec le nom de la base de données et un horodatage dans le nom du fichier dans un répertoire spécifié. La deuxième tâche exécute un script VBScript qui parcourt ce répertoire et supprime tous les fichiers avec une extension .BAK datant de plus de 3 jours.

Les deux scripts nécessitent des modifications mineures pour votre environnement (chemins d'accès, durée de conservation des sauvegardes de base de données), mais sont très proches du mode drop-in-and-run. 

Notez qu'il peut y avoir des problèmes de sécurité si vous êtes négligent avec ces autorisations ou avec des autorisations de répertoire, car ce sont des fichiers en texte brut qui devront être exécutés avec un certain niveau de privilège. Ne soyez pas négligés.

4
fencepost

Nous avons utilisé la combinaison de:

  1. Cobian Backup pour la planification/la maintenance

  2. ExpressMaint pour la sauvegarde

Les deux sont gratuits. Le processus consiste à script ExpressMaint pour effectuer une sauvegarde en tant qu'événement Cobian "avant la sauvegarde". Je laisse généralement cela écraser le fichier de sauvegarde précédent. Cobian en extrait ensuite un Zip/7Zip et les archive dans le dossier de sauvegarde. Dans Cobian, vous pouvez spécifier le nombre de copies complètes à conserver, effectuer plusieurs cycles de sauvegarde, etc.

Exemple de syntaxe de commande ExpressMaint:

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

Vous pouvez créer un périphérique de sauvegarde dans un objet serveur, disons 

BDTEST

puis créez un fichier batch contenant la commande suivante

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

disons avec nom 

backup.bat

alors vous pouvez appeler 

backup.bat

dans le planificateur de tâches selon votre convenance

0
Susheel Kumar