SQL Server 2008 Express - «Meilleure» solution de sauvegarde?


20

Quelles solutions de sauvegarde recommanderiez-vous lors de l'utilisation de SQL Server 2008 Express ? Je suis assez nouveau sur SQL Server, mais comme je viens d'un milieu MySQL , j'ai pensé à configurer la réplication sur un autre ordinateur et à prendre simplement des sauvegardes Xcopy de ce serveur.

Mais malheureusement, la réplication n'est pas disponible dans l'édition Express.

Le site est largement accessible, il ne doit donc pas y avoir de retards et de temps d'arrêt. Je pense aussi à faire une sauvegarde deux fois par jour ou quelque chose.

Que recommanderais-tu? J'ai plusieurs ordinateurs que je peux utiliser, mais je ne sais pas si cela m'aide puisque j'utilise la version Express.


Est-ce que quelqu'un sait s'il y a des problèmes avec simplement l'utilisation de la sauvegarde de Windows Server pour ce faire?
James

Réponses:


30

SQL Server Express 2008 prend en charge les sauvegardes de bases de données. Il manque l'Agent SQL, qui permet de planifier des sauvegardes, et l'assistant de plan de maintenance pour créer des tâches de sauvegarde.

Vous pouvez sauvegarder des bases de données de deux manières différentes:

  1. Utilisez Microsoft SQL Server Management Studio Express qui a l'option de sauvegarde dans le menu contextuel pour chaque base de données sous «tâches».
  2. Utilisez T-SQL pour écrire manuellement votre script de sauvegarde. Lisez la documentation MSDN pour la commande T-SQL BACKUP .
    Syntaxe quelque chose comme:BACKUP DATABASE MyDatabase TO DISK='C:\MyDatabase.bak';

Si vous souhaitez planifier vos travaux de sauvegarde, vous devez écrire un script T-SQL, puis utiliser le calendrier des tâches de Windows pour appeler SQLCmd pour exécuter le script selon quel calendrier vous intéresse:

 sqlcmd -s server_name\sqlexpress -i C:\SqlJobs\backup.sql -o C:\Logs\output.txt

1
La syntaxe BACKUP ressemble à ceci: BACKUP DATABASE MyDatabase TO DISK = 'C: \ MyDatabase.bak';
Martin Marconcini

Merci pour cette information, je vais essayer.
alexn

lors de l'utilisation du script T-sql, assurez-vous que vos noms de base de données ne contiennent pas d'espaces.
redknight

+1 Encore une information: n'oubliez pas de mentionner le nom de l'instance via le -S ".\SomeInstance"si vous obtenez des erreurs de connexion de sqlcmd.
Tomalak

Il serait utile, pour le reste d'entre nous venant à cette question à la recherche de la même réponse, si vous incluez le SQL que vous utilisez pour exécuter une sauvegarde.
Ian Boyd

6

J'utilise SQLBackupAndFTP - produit fantastique et simple.


sqlbackupandftp est le meilleur .. si vous voulez revenir + compresser + supprimer automatiquement (après des jours spécifiés)
suraj jain

Oui, je l'utilise également. Fonctionne bien.
Alan B

5

J'ai été écrit un script de sauvegarde pour moi-même, installez comme indiqué dans le post par splattne :

----- Version: 2.0 - 2009-12-12 - SQL 2000 Compatible
----- Pham Kim Ngan (jbngan@gmail.com)
----- Usage:
-- Copy 7za.exe (http://www.7-zip.org/download.html - Command Line Version) to @CFG_BACKUP_PATH
-- Modify @CFG_BACKUP_PATH = <Backup Store Path> - no long filename/directory please
-- Modify @CFG_DAYS_DELETE = Days to keep backups
-- Enable 'xp_cmdshell' (SQL 2005/EXPRESS or higher)

----- Configuration Variables
DECLARE @CFG_BACKUP_PATH NVARCHAR(256)
DECLARE @CFG_DAYS_DELETE INT

SET @CFG_BACKUP_PATH = 'C:\DatabaseBackup'
SET @CFG_DAYS_DELETE = 30

DECLARE @Today DATETIME
DECLARE @TodayName CHAR(8)
SET @Today = GETDATE()
SET @TodayName = CONVERT(CHAR(8), @Today, 112)

DECLARE @id INT
DECLARE @name VARCHAR(50)
DECLARE @path VARCHAR(256)
DECLARE @cmd VARCHAR(256)

----- Create Temporarity Directory
DECLARE @TempDir VARCHAR(256)
SET @TempDir = @CFG_BACKUP_PATH + '\' + CONVERT(VARCHAR(256), NEWID())
SET @cmd = 'md ' + @TempDir
EXEC xp_cmdshell @cmd, no_output

----- List of current databases, only 'ONLINE' databases to be backup
DECLARE @dbList TABLE
    (
      dbno INT IDENTITY,
      dbname NVARCHAR(256)
    )

INSERT  INTO @dbList ( dbname )
        SELECT  name
        FROM    master.dbo.sysdatabases
        WHERE   ( name NOT IN ( 'tempdb' ) )
                AND DATABASEPROPERTYEX(name, 'Status') = 'ONLINE'


------ Starting backup, one by one
SELECT  @id = dbno,
        @name = dbname
FROM    @dbList
WHERE   dbno = 1
WHILE @@ROWCOUNT = 1
    BEGIN
        PRINT N'++ Backup: ' + @name
        SET @path = @TempDir + '\' + @name + '.bak'

        BACKUP DATABASE @name TO DISK = @path

        SELECT  @id = dbno,
                @name = dbname
        FROM    @dbList
        WHERE   dbno = @id + 1
    END

PRINT N'++ Compressing: ' + @TempDir

----- Delete output file if existed
SET @cmd = 'del /f /q ' + @CFG_BACKUP_PATH + '\' + @TodayName + '.ZIP'
EXEC xp_cmdshell @cmd, no_output

DECLARE @Count INT
DECLARE @StartTime DATETIME
SET @StartTime = GETDATE()
----- Compress, -mx1 = Set Compression Ratio to 1 (very low)
SET @cmd = @CFG_BACKUP_PATH + '\7za.exe a -bd -y -tzip -mx1 '
SET @cmd = @cmd + @CFG_BACKUP_PATH + '\' + @TodayName + '.ZIP ' + @TempDir + '\*.bak"'
EXEC xp_cmdshell @cmd, no_output

SET @Count = DATEDIFF(second, @StartTime, GETDATE())
PRINT N'++ Compression Time: ' + CONVERT(VARCHAR, @Count) + ' seconds'
SET @Count = DATEDIFF(second, @Today, GETDATE())
PRINT N'++ Total Execution Time: ' + CONVERT(VARCHAR, @Count) + ' seconds'

---- Delete temporarity directory
SET @cmd = 'rd /s /q ' + @TempDir
EXEC xp_cmdshell @cmd, no_output

---- Delete previous backup versions
DECLARE @OlderDateName CHAR(8)
SET @OlderDateName = CONVERT(CHAR(8), @Today - @CFG_DAYS_DELETE, 112)

----- List all .ZIP files
CREATE TABLE #delList
    (
      subdirectory VARCHAR(256),
      depth INT,
      [file] BIT
    )
INSERT  INTO #delList
        EXEC xp_dirtree @CFG_BACKUP_PATH, 1, 1
DELETE  #delList
WHERE   RIGHT(subdirectory, 4) <> '.ZIP'

SELECT  @Count = COUNT(1)
FROM    #delList
PRINT N'++ Number of Backups: ' + CONVERT(NVARCHAR, @Count)

SELECT TOP 1
        @name = subdirectory
FROM    #delList
WHERE   LEN(subdirectory) = 12
        AND RIGHT(subdirectory, 4) = '.ZIP'
        AND REPLACE(subdirectory, '.ZIP', '') < @OlderDateName

WHILE ( @@ROWCOUNT = 1 ) 
    BEGIN
        PRINT N'++ Delete Older Backup: ' + @name
        SET @cmd = 'del /f /q ' + @CFG_BACKUP_PATH + '\' + @name
        EXEC xp_cmdshell @cmd, no_output

        DELETE  #delList
        WHERE   subdirectory = @name

        SELECT TOP 1
                @name = subdirectory
        FROM    #delList
        WHERE   LEN(subdirectory) = 12
                AND RIGHT(subdirectory, 4) = '.ZIP'
                AND REPLACE(subdirectory, '.ZIP', '') < @OlderDateName
    END

DROP TABLE #delList

PRINT N'++ Done.'
PRINT ''
PRINT ''
PRINT ''

2

J'utilise ExpressMaint , et cela fonctionne très bien comme tâche planifiée. Passez simplement les paramètres appropriés pour le type de travail que vous effectuez.

Le code source est également disponible. Nous l'avons légèrement modifié pour ajouter une entrée dans l'échec du journal des événements d'application.


1

Sur la base du post d'UndertheFold, j'ai fait une recherche sur Google et trouvé les détails d'ExpressMaint. Je n'avais jamais vu cela auparavant, donc je suis très heureux de l'avoir trouvé.

Pour info, la page web est, http://expressmaint.codeplex.com/

J'ai ensuite utilisé l'un des exemples que j'ai trouvés pour créer ce fichier de commandes que j'ai prévu d'exécuter pendant la nuit tous les jours.

c:\expressmaint\expressmaint -S (local)\SQLExpress -D ALL_USER -T DB -R E:\backups\sqlexpress\backupreports -RU WEEKS -RV 1 -B E:\backups\sqlexpress -BU DAYS -BV 4 -V -C

Cela prend une sauvegarde, conserve chaque sauvegarde ( -BU) pendant quatre jours, vous obtenez donc un historique en cas de corruption. Les journaux ( -RU) sont conservés pendant une semaine.

Je ne l'utilise que depuis quelques semaines, mais j'en suis très content, car c'est une approche mains libres. Localement, je place les sauvegardes sur un deuxième disque, puis j'utilise JungleDisk pour faire une sauvegarde hors site vers le stockage cloud Amazon EC2 .


Le problème avec expressmaint est qu'il ne prend pas en charge SQL Server 2008 R2. Cela fonctionnera avec 2008 et cela fonctionnera si vous installez 2008 puis effectuez une mise à niveau vers 2008 R2, mais il ne trouvera pas les bases de données sur une nouvelle installation de 2008 R2. C'est un bug connu avec un correctif soumis mais l'exécutable n'a pas été mis à jour avec le correctif.
James

1

Vous pouvez utiliser DBSave . C'est un excellent outil gratuit pour sauvegarder et restaurer MS SQL Server. C'est très simple à configurer et à utiliser.


0

J'utilise un travail de planificateur Windows pour sauvegarder la base de données SQL Server express toutes les quelques heures à l'aide d'un fichier de commandes. Semble bien fonctionner.


Vous devez également mentionner comment un fichier de commandes sauvegarde une base de données.
Ian Boyd

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.