IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration SQL Server Discussion :

[sql2005] pblm script sauvegarde


Sujet :

Administration SQL Server

  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Par défaut [sql2005] pblm script sauvegarde
    Bonjour,

    Suite à un problème de place pour les sauvegardes , je mets en place un job qui liste l'ensemble des bases et ensuite fait la sauvegarde et la compression des bases.

    Cependant je ne sais pas pourquoi la sauvegarde et la compression ne se fait pas pour toutes les bases (seulement 10 sur 240).
    je n'ai pas de message d'erreur et tous semble s'exécuter normalement

    ce que je ne comprend c'est que lorsque je remplace les traitements dans les if part des print @nom_base , il m'affiche bien le nom de toutes les bases


    Ci dessous le code .

    une idée ?

    Cordialement,


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    -- déclaration variable
    Declare @nom_base varchar(255),
    		@FileName varchar(255),
    		@backup varchar(255),
    		@CMD varchar(255),
    		@File_Exists int;
     
    --recupération de la liste des bases
     
     
    declare curseur_liste_base cursor for select [name] from sys.databases where  sys.databases.name != 'tempdb' ;
    Open curseur_liste_base
    while (1=1) 
    	BEGIN ;
     
    --parcours de la liste des bases 
    		Fetch next from curseur_liste_base into @nom_base; 
    	    IF @@FETCH_STATUS < 0 BREAK;
     
    		SELECT @FileName='D:\Backup\'+ @nom_base 
    		SET @backup= @FileName + '\' + @nom_base + REPLACE(REPLACE(REPLACE(CONVERT(CHAR(16),CURRENT_TIMESTAMP, 120), '-', ''), ' ', ''), ':', '') + '.bak' --chemin + nom sauvegarde
     
     
     
     
    		EXEC Master.dbo.xp_fileexist @FileName, @File_Exists OUT  --test de l'existance du recpertoite de sauvegarde 	
    		IF @File_Exists = 1 --si exite  sauvegarde 
    			Begin
    				BACKUP DATABASE @nom_base TO DISK = @backup WITH NOFORMAT, NOINIT,  NAME = @nom_base,  STATS = 10 
    				SET @CMD = 'C:\WINDOWS\system32\gzip ' + @backup -- compression 
    				EXEC xp_cmdshell @CMD 
     
    			END
    		Else -- si n'existe pas 
    			Begin 
    				SET @CMD = 'MD '+ @FileName -- creation du repertoire 
    				EXEC xp_cmdshell @CMD 
    				BACKUP DATABASE @nom_base TO DISK = @backup WITH NOFORMAT, NOINIT,  NAME = @nom_base, SKIP, NOREWIND, NOUNLOAD,  STATS = 10 
    				SET @CMD = 'C:\WINDOWS\system32\gzip ' + @backup --compression 
    				EXEC xp_cmdshell @CMD		
     
    			END
     
        END;
     
    -- Close and deallocate the cursor.
    CLOSE curseur_liste_base;
    DEALLOCATE curseur_liste_base;

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Février 2008
    Messages
    758
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 758
    Par défaut
    - Il faudrait ajouter ... and state_desc = 'ONLINE' dans le curseur, ça évitera d'essayer de backuper des bases offline ou restoring.
    - Au lieu de faire une boucle infinie avec un break, tester le statut de @@fetch_status directement dans le while():

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    declare curseur_liste_base cursor FOR SELECT [name] FROM sys.DATABASES WHERE  sys.DATABASES.name <> 'tempdb' and state_desc = 'ONLINE';
    Open curseur_liste_base
    Fetch next FROM curseur_liste_base INTO @nom_base; 
     
    while (@@FETCH_STATUS = 0) 
    	BEGIN ;
     
    --parcours de la liste des bases 
    		Fetch next FROM curseur_liste_base INTO @nom_base; 
    (...)
    etc

  3. #3
    Membre Expert

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Par défaut
    Citation Envoyé par dbaffaleuf Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     SELECT [name] FROM sys.DATABASES WHERE  sys.DATABASES.name != 'tempdb' ;
    Noter au passage que l'opérateur != n'est pas du SQL !
    Par contre <> l'est !
    Etienne ZINZINDOHOUE
    Billets-Articles

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Février 2008
    Messages
    758
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 758
    Par défaut
    @etienne c'est corrigé thx

  5. #5
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Par défaut
    Bonjour,

    Merci pour les info.

    j' ai donc modifié le script avec vos recommandations mais toujours sans résultats.

    ci dessous le code avec l'ajout de quelques print pour mieux comprendre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    -- déclaration variable
    Declare @nom_base varchar(255),
    		@FileName varchar(500),
    		@backup varchar(500),
    		@CMD varchar(500),
    		@File_Exists int;
     
    --recupération de la liste des bases
     
    declare curseur_liste_base cursor FOR SELECT [name] FROM sys.DATABASES WHERE  sys.DATABASES.name <> 'tempdb' AND state_desc = 'ONLINE';
     
    Open curseur_liste_base
    Fetch next FROM curseur_liste_base INTO @nom_base; 
     
    while (@@FETCH_STATUS = 0) 
    	BEGIN ;
     
    --parcours de la liste des bases 
     
    		Fetch next FROM curseur_liste_base INTO @nom_base; 
     
    		SELECT @FileName='D:\Backup\'+ @nom_base 
    		SET @backup= @FileName + '\' + @nom_base + REPLACE(REPLACE(REPLACE(CONVERT(CHAR(16),CURRENT_TIMESTAMP, 120), '-', ''), ' ', ''), ':', '') + '.bak' --chemin + nom sauvegarde
    		print @nom_base
    		print @FileName
    		print @backup
    		print '==================='
     
     
    		EXEC Master.dbo.xp_fileexist @FileName, @File_Exists OUT  --test de l'existance du recpertoite de sauvegarde 	
    		IF @File_Exists = 1 --si exite  sauvegarde 
    			Begin
    				print @backup
    				BACKUP DATABASE @nom_base TO DISK = @backup WITH NOFORMAT, NOINIT,  NAME = @nom_base, SKIP, NOREWIND, NOUNLOAD,  STATS = 10 
    				SET @CMD = 'C:\WINDOWS\system32\gzip ' + @backup -- compression 
    				EXEC xp_cmdshell @CMD 
     
    			END
    		Else -- si n'existe pas 
    			Begin 
    				print @backup
    				SET @CMD = 'MD '+ @FileName -- creation du repertoire 
    				EXEC xp_cmdshell @CMD 
    				BACKUP DATABASE @nom_base TO DISK = @backup WITH NOFORMAT, NOINIT,  NAME = @nom_base, SKIP, NOREWIND, NOUNLOAD,  STATS = 10 
    				SET @CMD = 'C:\WINDOWS\system32\gzip ' + @backup --compression 
    				EXEC xp_cmdshell @CMD		
     
    			END
     
        END;
     
    -- Close and deallocate the cursor.
    CLOSE curseur_liste_base;
    DEALLOCATE curseur_liste_base;


    ci dessous le résultat des message affiché :

    (1 row(s) affected)
    BDD_CMS01
    D:\Backup\BDD_CMS01
    D:\Backup\BDD_CMS01\BDD_CMS01201206081417.bak
    ===================

    (1 row(s) affected)
    D:\Backup\BDD_CMS01\BDD_CMS01201206081417.bak

    (2 row(s) affected)
    Processed 422832 pages for database 'BDD_CMS01', file 'BDD_CMS01' on file 1.
    100 percent processed.
    Processed 2 pages for database 'BDD_CMS01', file 'BDD_CMS01_log' on file 1.
    BACKUP DATABASE successfully processed 422834 pages in 555.032 seconds (6.240 MB/sec).

    (1 row(s) affected)
    BDD_CMS02
    D:\Backup\BDD_CMS02
    D:\Backup\BDD_CMS02\BDD_CMS02201206081435.bak
    ===================

    (1 row(s) affected)
    D:\Backup\BDD_CMS02\BDD_CMS02201206081435.bak

    (2 row(s) affected)
    Processed 438680 pages for database 'BDD_CMS02', file 'BDD_CMS02' on file 1.
    100 percent processed.
    Processed 2 pages for database 'BDD_CMS02', file 'BDD_CMS02_log' on file 1.
    BACKUP DATABASE successfully processed 438682 pages in 542.796 seconds (6.620 MB/sec).

    (1 row(s) affected)
    BDD_CMS03
    D:\Backup\BDD_CMS03
    D:\Backup\BDD_CMS03\BDD_CMS03201206081452.bak
    ===================

    (1 row(s) affected)
    D:\Backup\BDD_CMS03\BDD_CMS03201206081452.bak

    (2 row(s) affected)
    Processed 654024 pages for database 'BDD_CMS03', file 'BDD_CMS03' on file 1.
    100 percent processed.
    Processed 2 pages for database 'BDD_CMS03', file 'BDD_CMS03_log' on file 1.
    BACKUP DATABASE successfully processed 654026 pages in 854.211 seconds (6.272 MB/sec).

    (1 row(s) affected)

    D:\Backup\
    D:\Backup\ \ 201206081519.bak
    ===================

    (1 row(s) affected)
    D:\Backup\ \ 201206081519.bak

    Msg 911, Level 16, State 11, Line 44
    Could not locate entry in sysdatabases for database ' '. No entry found with that name. Make sure that the name is entered correctly.
    Msg 3013, Level 16, State 1, Line 44
    BACKUP DATABASE is terminating abnormally.
    On constate qu'il y à problème avec le nom de la base qui ne ressort pas on a juste la date "D:\Backup\ \ 201206081519.bak".

    j'ai regardé il n'y a pas de nom avec des espaces , le nom le plus long et "compliqué" est celui ci : SharePoint_AdminContent_a3b9384c-78b2-474a-892c-18532a5ec6bf.

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Février 2008
    Messages
    758
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 758
    Par défaut
    que renvoie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT [name] FROM sys.DATABASES WHERE  sys.DATABASES.name <> 'tempdb' AND state_desc = 'ONLINE';

  7. #7
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Par défaut
    elle me renvoie bien les 240 bases (même résultat que sp_databases en enlevant la tempdb et les bases hors ligne)
    J'ai aussi comparé à la main , RAS le nom est le bon pour toutes les bases , pas de problème de nom tronqué ...

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Février 2008
    Messages
    758
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 758
    Par défaut
    J'utiliserai un type sysname pour stocker le nom de la base plutôt qu'un varchar.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    -- déclaration variable
    Declare @nom_base sysname,
    		@FileName varchar(500),
    		@backup varchar(500),
    		@CMD varchar(500),
    		@File_Exists int;
     
    --recupération de la liste des bases
     
    declare curseur_liste_base cursor FOR SELECT [name] FROM sys.DATABASES WHERE  sys.DATABASES.name <> 'tempdb' AND state_desc = 'ONLINE';
     
    Open curseur_liste_base
    Fetch next FROM curseur_liste_base INTO @nom_base; 
     
    while (@@FETCH_STATUS = 0) 
    	BEGIN ;
     
    --parcours de la liste des bases 
     
    		Fetch next FROM curseur_liste_base INTO @nom_base; 
    		SELECT 'NOM BASE: '+case when (@nom_base is null) then 'NULL' else @nom_base end
     
        END;
     
    -- Close and deallocate the cursor.
    CLOSE curseur_liste_base;
    DEALLOCATE curseur_liste_base;
    - Qu'est - ce qu'il y a après la base BDD_CMS03 ?
    - Essaye de relancer en positionnant SET CONCAT_NULL_YIELDS_NULL = OFF, bien qu'à priori ta chaîne @nom_base ne soit pas concaténée...

  9. #9
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Par défaut
    Re,

    j'ai :
    NOM BASE: BDD_CMS03
    NOM BASE: SharePoint_Config
    NOM BASE: SharePoint_AdminContent_900c1e88-d43d-4069-8fbf-f78b7b20430b
    .
    .
    .


    et ce message d'erreur ensuite :

    The query has exceeded the maximum number of result sets that can be displayed in the results grid. Only the first 100 result sets are displayed in the grid.

  10. #10
    Membre Expert

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Par défaut
    Depuis SSMS va dans :
    Outils > Options > SQL Server Object Explorer
    là sélectionner Commands
    dans le tableau Table and View Options
    sur la ligne Value for select Top <n> Rows command remplacer 100 par 1000
    Etienne ZINZINDOHOUE
    Billets-Articles

  11. #11
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Par défaut
    Re,

    impossible d'affiché le mais bon qd je l'envoie dans du text j’obtiens bien le bon nombre de base et aucun nom de base en "vide"

    exemple :

    NOM BASE: BDD_CMS03

    (1 row(s) affected)


    ------------------------------------------------------------------------------------------------------------------------------------------
    NOM BASE: SharePoint_Config

    (1 row(s) affected)


    ------------------------------------------------------------------------------------------------------------------------------------------
    NOM BASE: SharePoint_AdminContent_900c1e88-d43d-4069-8fbf-f78b7b20430b
    cependant lorsque j'exclus les BDqui ont bien été sauvegardées avant l'erreur , ça semble fonctionner

  12. #12
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Par défaut
    Bonjour,

    je viens d'ajouter un test afin de m'assurer que la variable '@nom_base' contenant le nom de la base de donnée existe bien.
    Si elle n'existe pas il est censé m'afficher un message d'erreur et continuer pour les autres bases mais il m'affiche bien le message mais s’arrête ensuite en success :/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
     
    -- déclaration variable
    Declare @nom_base sysname,
    		@FileName varchar(500),
    		@backup varchar(500),
    		@CMD varchar(500),
    		@File_Exists int,
     
     
    --recupération de la liste des bases
     
     
    declare curseur_liste_base cursor FOR SELECT [name] FROM sys.DATABASES WHERE  sys.DATABASES.name <> 'tempdb' AND sys.DATABASES.name  <> 'CMS4-MYBREAD COM' AND state_desc = 'ONLINE';
     
    Open curseur_liste_base
    Fetch next FROM curseur_liste_base INTO @nom_base; 
     
    while (@@FETCH_STATUS = 0) 
    	BEGIN ;
     
    --parcours de la liste des bases 
    		Fetch next FROM curseur_liste_base INTO @nom_base; 
     
    	IF EXISTS(Select [name] from sys.DATABASES where [name] = @nom_base	)
    		BEGIN
    			SELECT @FileName='D:\Backup\'+ @nom_base 
    			SET @backup= @FileName + '\' + @nom_base + REPLACE(REPLACE(REPLACE(CONVERT(CHAR(16),CURRENT_TIMESTAMP, 120), '-', ''), ' ', ''), ':', '') + '.bak' --chemin + nom sauvegarde
     
     
    			EXEC Master.dbo.xp_fileexist @FileName, @File_Exists OUT  --test de l'existance du recpertoite de sauvegarde 	
    			IF @File_Exists = 1 --si exite  sauvegarde 
    				Begin
    					print @backup
    					BACKUP DATABASE @nom_base TO DISK = @backup WITH NOFORMAT, NOINIT,  NAME = @nom_base, SKIP, NOREWIND, NOUNLOAD,  STATS = 10 
    					SET @CMD = 'C:\WINDOWS\system32\gzip ' + @backup -- compression 
    					EXEC xp_cmdshell @CMD 
    				END
    			Else -- si n'existe pas 
    				Begin 
    					print @backup
    					SET @CMD = 'MD '+ @FileName -- creation du repertoire 
    					EXEC xp_cmdshell @CMD 
    					BACKUP DATABASE @nom_base TO DISK = @backup WITH NOFORMAT, NOINIT,  NAME = @nom_base, SKIP, NOREWIND, NOUNLOAD,  STATS = 10 
    					SET @CMD = 'C:\WINDOWS\system32\gzip ' + @backup --compression 
    					EXEC xp_cmdshell @CMD		
     				END
    		END
    	Else
    			BEGIN
    				PRINT 'la variable ne corespond a aucune base'
    			END		
    	END;
     
    -- Close and deallocate the cursor.
    CLOSE curseur_liste_base;
    DEALLOCATE curseur_liste_base;
    Une idée sur comment continuer même lorsqu'il rencontre sur une sauvegarde ?

    Ps je vous ai rajouté la liste des BD que j'ai pour info
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Script sauvegarde totale rman oracle 10g
    Par milka dans le forum Recovery Manager
    Réponses: 26
    Dernier message: 17/11/2010, 17h52
  2. [Sql server 2005 Express]script Sauvegarde Base
    Par nabil1 dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 09/06/2009, 11h47
  3. Script sauvegarde journalière
    Par tekpi dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 27/05/2009, 13h19
  4. Réponses: 4
    Dernier message: 11/12/2008, 11h57
  5. [sql2005] Composant Script et PostExecute
    Par Monnier Eric dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 08/04/2008, 11h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo