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 :

restore filelistonly


Sujet :

Administration SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 24
    Par défaut restore filelistonly
    Bonjour tout le monde

    Pour mon script de restauration j'ai besoin de faire un restore filelistonly.
    En effet il faut que je récupére le nom du fichier de données pour restaurer mes bases.
    Le problème est que certains fichiers de données finissent par _Dat et d'autres par _Data !!

    restore filelistonly permet de connaître le vrai nom de chaque fichier de données. En effet il renvoie un jeu de résultats avec le premier champ 'LogicalName' qui concerne les noms des fichiers de données et de logs.
    Voici ma ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    restore filelistonly from disk='c:\backup\MA_BASE
    Il faut que je puisse exploiter ce résultat et le mettre dans une varialbe mais je ne sais pas comment faire.

    Visiblement ce n'est pas possible d'utiliser un curseur.

    Si quelqu'un peut me dire comment récupérer la valeur ce champ pour l'utiliser dans mon restore database, ça m'aiderait beucoup.

    Merci
    Nicolas

  2. #2
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 24
    Par défaut petites précisions
    Bon je n'ai peut être pas été très clair.

    J'ai un script qui sauvegarde automatiquement les bases d'un serveur et met les fichiers de sauvegarde dans un répertoire.

    J'en ai un autre qui restore automatiquement ces bases en fonction du répertoire dans lequel se trouvent les fichiers de sauvegarde.

    le problème est au niveau de la commande RESTORE.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            restore database @database_name
    			from disk=@path_name
    			with 
    			/*on indique le nouvel emplacement du fichier de données*/
    			move @database_data 
    			to @database_data_path,
    			/*on indique le nouvel emplacement du fichier de log*/
    			move @database_log
    			to @database_log_path,
    			/*si la base existe déjà, on la supprime et on la recrée*/
    			REPLACE
    Le problème est au niveau de la variable @database_data qui contient normalement le nom de la base + _Data.
    exemple : Gestion_Data.
    Pour l'obtenir, c'est simple, je concaténe le nom de ma base de donnée (déjà stocké dans la variable @database_name) avec _Data.
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set @database_data = @database_name + '_data
    [/code].

    Le problème et que certain fichiers de données finissent par _Dat au lieu de _Data.
    Donc le script ne marche pas pour les bases dont le fichier finit par _Dat
    Il faut donc que j'aille chercher directement le nom du fichier de données au lieu de le fabriquer.

    c'est pour ça que j'ai pensé au restore filelistonly qui renvoie bien le nom du fichier de données mais je ne sait pas comment le récupérer.

    J'ai aussi pensé à stocker les nom des fichiers de données dans le script de sauvegarde soit dans un fichier soit dans une table temporaire.

    Mais je ne vois pas trop comment faire.

    Si quelqu'un a compris mon charrabia et à une idée ça m'aiderait beaucoup

    Merci d'avence
    Nicolas

  3. #3
    Membre chevronné
    Inscrit en
    Août 2002
    Messages
    354
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 354
    Par défaut
    Slt,

    J'ai ecrit il ya quelques temps une procedure qui fait cela, voila le code, tu peux t'en inspirer :

    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
     
    drop Procedure RestaurationAutomatique
    go
     
    Create Procedure RestaurationAutomatique 
      @evchBase varchar(100),
      @evchFichierBackup varchar(1000),
      @eintDebug integer = 0
    As
     
    set nocount on
     
    Declare @vchData as varchar(100)
    Declare @vchLog as varchar(100)
    Declare @vchFichierData as varchar(1000)
    Declare @vchFichierLog as varchar(1000)
     
     
    if @evchBase is null and @evchFichierBackup is null
      Return
     
    -- kill de toutes les connexions sur la base cible
    create table #Connections
    (
    SPID int
    )
     
    Insert into  #Connections
    Select p.spid
    from master.dbo.sysprocesses p (nolock)
    join master..sysdatabases d (nolock) on p.dbid = d.dbid
    Where d.[name] = @evchBase
     
    Declare @vchSQLText varchar(200), @intSPID int
     
    While 1 = 1
    Begin
     
    	Select top 1 @intSPID = SPID
    	From  #Connections
    	Where SPID > IsNull(@intSPID, 0) 
    	order by SPID asc
     
    	If @@RowCount = 0
    		Break
     
    	Set @vchSQLText = 'Kill ' + Convert(varchar(10), @intSPID)
     
    	Exec( @vchSQLText )				
     
    End
     
    drop table #Connections
     
    -- recuperation nom des fichiers logiques
     
    create table #tmpFicLogiques
    (
    LogicalName varchar(100),
    PhysicalName varchar(1000),
    Type varchar(5),
    FileGroupName varchar(30),
    [Size] decimal,
    [MaxSize] decimal
    )
     
    insert into #tmpFicLogiques (LogicalName,PhysicalName,Type,FileGroupName,[Size],[MaxSize])
    exec('RESTORE FILELISTONLY FROM  DISK = N''' + @evchFichierBackup + ''' WITH  FILE = 1')
     
    select @vchData = LogicalName from #tmpFicLogiques where Type = 'D'
    select @vchLog = LogicalName from #tmpFicLogiques where Type = 'L'
     
    drop table #tmpFicLogiques
     
    if @vchData is null or @vchLog is null 
    begin
      Print 'Erreur noms logiques invalides'
      Return
    end
     
    -- recuperation des infos de fichier physiques
     
    create table #tmpFichiersPhysiques
    (
      PhysicalName varchar(1000),
      Status       int
    )
     
    insert into #tmpFichiersPhysiques (PhysicalName, Status)
     
    exec('select filename, usage = (case status & 0x40 when 0x40 then 0 else 1 end) from ' + @evchBase + '..sysfiles')
     
    if @eintDebug =  1 select * from #tmpFichiersPhysiques
     
    select @vchFichierData = LTrim(Rtrim(PhysicalName)) from #tmpFichiersPhysiques where Status = 1
    select @vchFichierLog = LTrim(Rtrim(PhysicalName)) from #tmpFichiersPhysiques where Status = 0
     
    if @vchFichierData is null or @vchFichierLog is null 
    begin
      Print 'Erreur noms physiques invalides'
      Return
    end
     
    drop table #tmpFichiersPhysiques
     
    -- lance la restauration de la base
     
    declare @vchSQL varchar(8000)
     
    SET @vchSQL = 'RESTORE DATABASE [' +  @evchBase + '] FROM  DISK = N''' + @evchFichierBackup + 
    ''' WITH  FILE = 1,  UNLOAD ,  STATS = 10,  RECOVERY ,  REPLACE ,' +
    ' MOVE N'''+@vchData+''' TO  N'''+@vchFichierData+''',  
    MOVE N'''+@vchLog+''' TO N'''+@vchFichierLog+''''
     
    --select @vchSQL
     
    if @eintDebug = 0 exec (@vchSQL)
    else select @vchSQL


    a+

  4. #4
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2009
    Messages : 2
    Par défaut
    Il sera necessaire de rajouter des bloc begin try afin de rendre cette procedure plus exploitable

    Citation Envoyé par Gandalf Le Blanc Voir le message
    Slt,

    J'ai ecrit il ya quelques temps une procedure qui fait cela, voila le code, tu peux t'en inspirer :

    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
     
    drop Procedure RestaurationAutomatique
    go
     
    Create Procedure RestaurationAutomatique 
      @evchBase varchar(100),
      @evchFichierBackup varchar(1000),
      @eintDebug integer = 0
    As
     
    set nocount on
     
    Declare @vchData as varchar(100)
    Declare @vchLog as varchar(100)
    Declare @vchFichierData as varchar(1000)
    Declare @vchFichierLog as varchar(1000)
     
     
    if @evchBase is null and @evchFichierBackup is null
      Return
     
    -- kill de toutes les connexions sur la base cible
    create table #Connections
    (
    SPID int
    )
     
    Insert into  #Connections
    Select p.spid
    from master.dbo.sysprocesses p (nolock)
    join master..sysdatabases d (nolock) on p.dbid = d.dbid
    Where d.[name] = @evchBase
     
    Declare @vchSQLText varchar(200), @intSPID int
     
    While 1 = 1
    Begin
     
    	Select top 1 @intSPID = SPID
    	From  #Connections
    	Where SPID > IsNull(@intSPID, 0) 
    	order by SPID asc
     
    	If @@RowCount = 0
    		Break
     
    	Set @vchSQLText = 'Kill ' + Convert(varchar(10), @intSPID)
     
    	Exec( @vchSQLText )				
     
    End
     
    drop table #Connections
     
    -- recuperation nom des fichiers logiques
     
    create table #tmpFicLogiques
    (
    LogicalName varchar(100),
    PhysicalName varchar(1000),
    Type varchar(5),
    FileGroupName varchar(30),
    [Size] decimal,
    [MaxSize] decimal
    )
     
    insert into #tmpFicLogiques (LogicalName,PhysicalName,Type,FileGroupName,[Size],[MaxSize])
    exec('RESTORE FILELISTONLY FROM  DISK = N''' + @evchFichierBackup + ''' WITH  FILE = 1')
     
    select @vchData = LogicalName from #tmpFicLogiques where Type = 'D'
    select @vchLog = LogicalName from #tmpFicLogiques where Type = 'L'
     
    drop table #tmpFicLogiques
     
    if @vchData is null or @vchLog is null 
    begin
      Print 'Erreur noms logiques invalides'
      Return
    end
     
    -- recuperation des infos de fichier physiques
     
    create table #tmpFichiersPhysiques
    (
      PhysicalName varchar(1000),
      Status       int
    )
     
    insert into #tmpFichiersPhysiques (PhysicalName, Status)
     
    exec('select filename, usage = (case status & 0x40 when 0x40 then 0 else 1 end) from ' + @evchBase + '..sysfiles')
     
    if @eintDebug =  1 select * from #tmpFichiersPhysiques
     
    select @vchFichierData = LTrim(Rtrim(PhysicalName)) from #tmpFichiersPhysiques where Status = 1
    select @vchFichierLog = LTrim(Rtrim(PhysicalName)) from #tmpFichiersPhysiques where Status = 0
     
    if @vchFichierData is null or @vchFichierLog is null 
    begin
      Print 'Erreur noms physiques invalides'
      Return
    end
     
    drop table #tmpFichiersPhysiques
     
    -- lance la restauration de la base
     
    declare @vchSQL varchar(8000)
     
    SET @vchSQL = 'RESTORE DATABASE [' +  @evchBase + '] FROM  DISK = N''' + @evchFichierBackup + 
    ''' WITH  FILE = 1,  UNLOAD ,  STATS = 10,  RECOVERY ,  REPLACE ,' +
    ' MOVE N'''+@vchData+''' TO  N'''+@vchFichierData+''',  
    MOVE N'''+@vchLog+''' TO N'''+@vchFichierLog+''''
     
    --select @vchSQL
     
    if @eintDebug = 0 exec (@vchSQL)
    else select @vchSQL


    a+

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 001
    Billets dans le blog
    6
    Par défaut
    La procédure de Gandalf Le Blanc au niveau des KILL est tout à fait catastrophique.... C'est hélas un script que l'on voit régulièrement sur le net.

    Le problème est qu'il n'empêche nullement qu'un utilisateur se reconnecte. Or quand un sait qu'un KILL fait un rollback et qu'un ROLLBACK peut prendre du temps, il est certain qu'en production cela sera épouvantable.

    De plus Gandalf utilise des appels à des tables système qui n'existe plus depuis la version 2005, soit 2 versions de retard, exemple : sysprocesses et sysdatabases !

    C'est d'autant plus navrant qu'il existe une commande directe et immédiate pour faire tout cela et depuis au moins la version 2000 de SQL Server :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER DATABASE <mabase> SET SINGLE_USER WITH ROLLBACK IMMEDIATE
    Elle permet à la connexion courante de reprendre la main sur la base si celle-ci s'est préalablement positionnée dedans.
    Ensuite on peut faire ce que l'on veut comme un ALTER DATABASE <mabase> SET OFFLINE suivi par exemple d'un RESTAURE avec l'option REPLACE !
    Enfin, la fin du script est navrante aussi car truffée d'erreurs :
    1) on suppose qu'il n'y a toujours qu'un seule fichier de sauvegarde dans le device (FILE = 1) ce qui peut être faux.
    2) on suppose qu'il n'y a qu'un seul fichier de données et qu'un seul fichier du JT ce qui est tout aussi probablement faux...

    Bref, un petit cours d'administration serait un plus !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 24
    Par défaut Merci
    Merci Gandalf, c'est exactement ce que je voulais !!!

    A marche niquel maintenant

    @ bientôt
    Nicolas

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de basckup Restore avec IBCONSOLE
    Par myseb dans le forum Outils
    Réponses: 10
    Dernier message: 04/11/2004, 14h48
  2. Too Many versions & Backup-Restore à rallonge
    Par Harry dans le forum Administration
    Réponses: 14
    Dernier message: 30/06/2004, 18h10
  3. Restoration d'une base... HELP !
    Par elendil dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 08/06/2004, 15h31
  4. restore filelistonly
    Par nic_moq dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 08/06/2004, 09h29
  5. [Debutant]Back up et restore
    Par christophebmx dans le forum Administration
    Réponses: 2
    Dernier message: 22/05/2004, 15h53

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