locked
sauvegarde de mes bases sous SQL Serveur Express 2005 RRS feed

  • Question

  • <!-- /* Font Definitions */ @font-face {font-family:"Century Gothic"; panose-1:2 11 5 2 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:11.0pt; mso-bidi-font-size:12.0pt; font-family:"Century Gothic"; mso-fareast-font-family:"Times New Roman"; mso-bidi-font-family:"Times New Roman"; mso-ansi-language:FR-CH;} @page Section1 {size:595.3pt 841.9pt; margin:42.55pt 1.0cm 1.0cm 1.0cm; mso-header-margin:35.45pt; mso-footer-margin:35.45pt; mso-paper-source:0;} div.Section1 {page:Section1;} -->

    Je désire sauvegarder mes bases de données Express Server 2005 avec la requête suivante :

     

    CREATE PROCEDURE dbo.SP_System_SauvegardesTotales

    @SauvegardeLogs AS int,

    @SauvegardeBases AS int,

    @RepertoireSauvegarde AS VarChar(8000)

    AS

    DECLARE @name sysname

    DECLARE @status int

    DECLARE @TestAutoTruncate bit

    DECLARE @LaRequette varchar(8000)

    DECLARE @DateJour varchar(20)

    DECLARE @Repertoire varchar(8000)

    DECLARE @RepertoireDefaut varchar(100)

    SET @DateJour = REPLACE(CONVERT(VARCHAR, GetDate(), 102), '.', '_')

    SET @RepertoireDefaut = 'C:\BACKUPBASES\'

    PRINT '-----------------------------------------------------'

    PRINT ' DATE DE LA SAUVEGARDE LANCEE : '+ @DateJour

    PRINT '-----------------------------------------------------'

    IF RTRIM(@RepertoireSauvegarde) != ''

    BEGIN

    PRINT 'Répertoire Fourni à la SP'

    IF RIGHT(@RepertoireSauvegarde, 1) != '\'

    SET @Repertoire = @RepertoireSauvegarde + '\'

    ELSE

    SET @Repertoire = @RepertoireSauvegarde

    END

    ELSE

    BEGIN

    PRINT 'Répertoire Non Fourni à la SP - Création du répertoire par défaut : '+ @RepertoireDefaut

    SET @LaRequette = 'master.dbo.xp_cmdshell ''MKDIR '+ @RepertoireDefaut +''', NO_OUTPUT '

    PRINT 'Requette : '+ @LaRequette

    EXECUTE (@LaRequette)

    SET @Repertoire = @RepertoireDefaut

    END

    PRINT 'Répertoire de Sauvegarde des Bases et Logs : '+ @Repertoire

    DECLARE TESTCURSEUR CURSOR

    FOR SELECT master.dbo.sysdatabases.name, master.dbo.sysdatabases.status

    FROM master.dbo.sysdatabases

    OPEN TESTCURSEUR

    FETCH NEXT FROM TESTCURSEUR

    INTO @name, @status

    WHILE @@FETCH_STATUS = 0

    BEGIN

    SET @TestAutoTruncate = @status & 8

    IF (@SauvegardeLogs = 1) AND (@TestAutoTruncate = 0)

    BEGIN

    PRINT ''

    PRINT '-----------------------------------------------------'

    PRINT 'BACKUP DU LOG DE LA BASE DE DONNEES : '+ @name

    SET @LaRequette = 'USE '+ @name +' EXEC sp_addumpdevice ''DISK'', '''+ @name +'Log'', '''+ @Repertoire + @name +'Log.BAK'' BACKUP LOG '+ @name +' TO '+ @name +'Log'

    PRINT 'Requette : '+ @LaRequette

    EXECUTE (@LaRequette)

    SET @LaRequette = 'USE '+ @name +' EXEC sp_dropdevice '''+ @name +'Log'' '

    PRINT 'Requette : '+ @LaRequette

    EXECUTE (@LaRequette)

    SET @LaRequette = 'master.dbo.xp_cmdshell ''C:\WINDOWS\system32\makecab /V[1] /L '+ @Repertoire +' '+ @Repertoire + @name +'Log.BAK '+ @name +'Log_'+ @DateJour +'.cab'', NO_OUTPUT '

    PRINT 'Requette : '+ @LaRequette

    EXECUTE (@LaRequette)

    SET @LaRequette = 'master.dbo.xp_cmdshell ''DEL '+ @Repertoire + @name +'Log.BAK'', NO_OUTPUT '

    PRINT 'Requette : '+ @LaRequette

    EXECUTE (@LaRequette)

    END

    IF @SauvegardeBases = 1

    BEGIN

    PRINT ''

    PRINT '-----------------------------------------------------'

    PRINT 'BACKUP DE LA BASE DE DONNEES : '+ @name

    SET @LaRequette = 'USE '+ @name +' BACKUP DATABASE '+ @name +' TO DISK ='''+ @Repertoire + @name +'.BAK'''

    PRINT 'Requette : '+ @LaRequette

    EXECUTE (@LaRequette)

    SET @LaRequette = 'master.dbo.xp_cmdshell ''C:\WINDOWS\system32\makecab /V[1] /L '+ @Repertoire +' '+ @Repertoire + @name +'.BAK '+ @name +'_'+ @DateJour +'.cab'', NO_OUTPUT '

    PRINT 'Requette : '+ @LaRequette

    EXECUTE (@LaRequette)

    SET @LaRequette = 'master.dbo.xp_cmdshell ''DEL '+ @Repertoire + @name +'.BAK'', NO_OUTPUT '

    PRINT 'Requette : '+ @LaRequette

    EXECUTE (@LaRequette)

    END

    PRINT ''

    PRINT '-----------------------------------------------------'

    FETCH NEXT FROM TESTCURSEUR

    INTO @name, @status

    END

    CLOSE TESTCURSEUR

    DEALLOCATE TESTCURSEUR

    GO

     

     

    La requête semble fonctionner mais lorsque je lance son exécution par la requète suivante :

     

    EXEC master.dbo.SP_System_SauvegardesTotales 1, 1, 'C:\BackupExpress\'

     

    J'ai les messages d'erreurs suivants :

     

     

    -----------------------------------------------------

      DATE DE LA SAUVEGARDE LANCEE : 2009_06_22

    -----------------------------------------------------

    Répertoire Fourni à la SP

    Répertoire de Sauvegarde des Bases et Logs : C:\BackupExpress\

     

    -----------------------------------------------------

    BACKUP DE LA BASE DE DONNEES : master

    Requette : USE master BACKUP DATABASE master TO DISK ='C:\BackupExpress\master.BAK'

    376 pages traitées pour la base de données 'master', fichier 'master' dans le fichier 1.

    3 pages traitées pour la base de données 'master', fichier 'mastlog' dans le fichier 1.

    BACKUP DATABASE a traité avec succès 379 pages en 0.263 secondes (11.805 Mo/s).

    Requette : master.dbo.xp_cmdshell 'C:\WINDOWS\system32\makecab /V[1] /L C:\BackupExpress\ C:\BackupExpress\master.BAK master_2009_06_22.cab', NO_OUTPUT

    Requette : master.dbo.xp_cmdshell 'DEL C:\BackupExpress\master.BAK', NO_OUTPUT

     

    -----------------------------------------------------

     

    -----------------------------------------------------

    BACKUP DE LA BASE DE DONNEES : tempdb

    Requette : USE tempdb BACKUP DATABASE tempdb TO DISK ='C:\BackupExpress\tempdb.BAK'

    Msg 3147, Niveau 16, État 3, Ligne 1

    La sauvegarde et la restauration ne sont pas autorisées sur la base de données tempdb.

    Msg 3013, Niveau 16, État 1, Ligne 1

    BACKUP DATABASE s'est terminé anormalement.

    Requette : master.dbo.xp_cmdshell 'C:\WINDOWS\system32\makecab /V[1] /L C:\BackupExpress\ C:\BackupExpress\tempdb.BAK tempdb_2009_06_22.cab', NO_OUTPUT

    Requette : master.dbo.xp_cmdshell 'DEL C:\BackupExpress\tempdb.BAK', NO_OUTPUT

     

    -----------------------------------------------------

    -----------------------------------------------------

    BACKUP DE LA BASE DE DONNEES : SL_M2-200901

    Requette : USE SL_M2-200901 BACKUP DATABASE SL_M2-200901 TO DISK ='C:\BackupExpress\SL_M2-200901.BAK'

    Msg 102, Niveau 15, État 1, Ligne 1

    Syntaxe incorrecte vers '-'.

    Msg 102, Niveau 15, État 1, Ligne 1

    Syntaxe incorrecte vers '-'.

    Requette : master.dbo.xp_cmdshell 'C:\WINDOWS\system32\makecab /V[1] /L C:\BackupExpress\ C:\BackupExpress\SL_M2-200901.BAK SL_M2-200901_2009_06_22.cab', NO_OUTPUT

    Requette : master.dbo.xp_cmdshell 'DEL C:\BackupExpress\SL_M2-200901.BAK', NO_OUTPUT

     

    -----------------------------------------------------

     

     

     

    Qu'est-ce qui n'est pas correct ?

     

    Par ailleurs, comment dois-je procéder pour ne sauvegarder que les bases d'une certaine instance ou que les bases commençant par exemple par sl ?

     

    De plus, que risque-t-on lorsque l'on fait une sauvegarde par une simple copie des fichiers MDF/LDF ou du répertoire Data ? Que cela change-t-il par rapport à un agent de sauvegarde d'un logiciel spécifique ? Cela pose-t-il vraiment un problème de faire à chaud même si aucun utilisateur ne travaille sur le base ?

     

    Merci d'avance !

    mardi 23 juin 2009 09:30

Toutes les réponses

  • Bonjour,

    J'ai fait un test avec vote ligne de commande

    j'obtiens le message suivant :

    Msg911, Niveau16, tat1, Ligne1

    La base de donnes 'SL_M2' n'existe pas. Assurez-vous que le nom a t saisi correctement.

    Par contre , avec :
    USE [SL_M2-200901]

     

    BACKUP DATABASE [SL_M2-200901] TO DISK ='C:\BackupExpress\SL_M2-200901.BAK'

     

     

    j'obtiens :

    184 pages traites pour la base de donnes 'SL_M2-200901', fichier 'SL_M2-200901' dans le fichier 1.

    3 pages traites pour la base de donnes 'SL_M2-200901', fichier 'SL_M2-200901_log' dans le fichier 1.

    BACKUP DATABASE a trait avec succs 187 pages en 0.116secondes (12.531Mo/s).

    le - n'est pas un caractère autorisé pour un nom d'objet SQL Server , alors il faut entourer le nom de la base avec des[] ce qui n'est pas pratique dans votre script sauf si dedans vous incluez les [] ( ce qui est une pratique recommandée par Microsoft, sinon comment pourriez-vous utiliser une base dont le nom est "base avec espaces" )

     

    voir le BOL
    http://msdn.microsoft.com/fr-fr/library/ms175874(SQL.90).aspx

    valable pour SQL Server 2000/2005/2008

    Bonne journée

    PS : je suis désolé pour la couleur , je n'arrive pas à la maîtriser


    Mark Post as helpful if it provides any help.Otherwise,leave it as it is.
    mercredi 24 juin 2009 22:00
  • Rebonjour,

    Je ne connais qu'un seul cas où l'on n'a pas ce problème , c'est en utilisant SMO dans un programme ( mais c'est une autre histoire )

    Bonne journée
    Mark Post as helpful if it provides any help.Otherwise,leave it as it is.
    mercredi 24 juin 2009 22:03