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 :

Créer une nouvelle base de donnée avec le .bak d'une autre.


Sujet :

Administration SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Janvier 2019
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2019
    Messages : 182
    Par défaut Créer une nouvelle base de donnée avec le .bak d'une autre.
    Bonjour à tous.tes

    Je reviens sur un sujet récurrent, en tout cas en apparence, car je n'ai pas trouvé la réponse à ma question. Même pas sur le web.
    Je suppose donc que ce n'est pas possible de le faire, mais, du coup, je trouve ça très bizarre.

    Pour créer une nouvelle base de donnée (DB_Dest) avec le .bak d'une autre (DB_Ori) (= dupliquer une base de données) sur le même serveur, je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    RESTORE DATABASE DB_Dest
    FROM DISK = 'C:\DB\DB_Ori.bak' 
    WITH replace
    ,MOVE 'DB_Ori'  TO   'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\DB_Dest.mdf'
    ,MOVE 'DB_Ori_log'  TO   'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\DB_Dest.ldf'
    , MOVE 'memory_optimized_file'  TO   'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\DB_Dest_memory_optimized_filegroup'
    ;
    Et quand je fais (après avoir fait un backup de la base) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    restore filelistonly from disk = 'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\DB_Dest.bak'
    je vois qu'il a gardé les noms logiques de DB_Ori.

    Du coup ma question: y a t-il quelque syntaxe qui cloche dans mon code ? J'ai essayé avec ou sans replace... Pareil.

  2. #2
    Invité
    Invité(e)
    Par défaut
    C'est ok ta façon de faire. Ce sont juste les noms logiques des datafiles par base de données.
    Je trouve ça aussi un peu weird que ça ne s'adapte pas directement mais il doit sûrement y avoir des dépendances dans les tables systèmes

    Tu peux éventuellement les modifier après la restauration de la nouvelle bd avec la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER DATABASE [MaBd] MODIFY FILE (NAME=N'AncienNom', NEWNAME=N'NouveauNom')
    Cela dit, ça n'a tout de même que peu d'intérêt.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Janvier 2019
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2019
    Messages : 182
    Par défaut
    Merci 7gyY9w1ZY6ySRgPeaefZ.

    Je prends note que cela n'a pas d'importance.
    Mais alors j'ai un problème qui vient d'ailleurs. Il faut que je remette le doigt dessus.
    Le message d'erreur était ... is not a part of...
    Il faut que je reproduise.

    Par contre après avoir fait ALTER DATABASE [MaBd] MODIFY FILE (NAME=N'AncienNom', NEWNAME=N'NouveauNom') , il n'y a pas de changement dans le restore filelistonly. J'ai toujours les mêmes noms de fichiers logiques.
    Mais ça a modifié quelque chose, car si j'essaie de le relancer une 2e fois, il me dit que le fichier n'existe pas...

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par cestpasmoinonplus Voir le message
    Mais alors j'ai un problème qui vient d'ailleurs. Il faut que je remette le doigt dessus.
    Le message d'erreur était ... is not a part of...
    Il faut que je reproduise.
    Besoin de plus d'information pour comprendre.

    Citation Envoyé par cestpasmoinonplus Voir le message
    Mais ça a modifié quelque chose, car si j'essaie de le relancer une 2e fois, il me dit que le fichier n'existe pas...
    Besoin de plus d'information pour comprendre.
    Tu relances quoi ? Le restore d'un nouveau backup ? Si tu as changé les noms logiques des datafiles, c'est qu'il faut que tu adaptes ton script de restore en conséquence.

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Janvier 2019
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2019
    Messages : 182
    Par défaut
    Alors, j'ai reconstitué précisément mon pb :
    1) Je restaure une base existante en la renommant sur le même serveur :
    nouvelle base = BASE_A
    base d'origine = Base_Ori
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    RESTORE DATABASE BASE_A
     FROM DISK = 'C:\DB\Base_Ori.bak' 
    WITH 
    replace, RECOVERY 
    , MOVE 'Base_Ori'  TO   'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\BASE_A.mdf'
    , MOVE 'Base_Ori_log'  TO   'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\BASE_A.ldf'
    , MOVE 'memory_optimized_file'  TO   'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\BASE_A_memory_optimized_filegroup'
    ;
    Aucun problème, il me crée ma nouvelle base.
    Je fais un backup de BASE_A = no problemo,
    mais quand je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    restore filelistonly from disk =  'C:\DB\BASE_A.bak'
    ;
    il me répond que les LogicalName des fichiers portent le nom de la base d'origine.

    Du coup, quand je fais :
    2) Restauration de BASE_A en la renommant sur le même serveur :
    nouvelle base = BASE_B
    base d'origine = Base_A

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    RESTORE DATABASE BASE_B
     FROM DISK = 'C:\DB\BASE_A.bak' 
    WITH 
    replace, RECOVERY 
    , MOVE 'BASE_A'  TO   'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\BASE_B.mdf'
    , MOVE 'BASE_A_log'  TO   'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\BASE_B.ldf'
    , MOVE 'memory_optimized_file'  TO   'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\BASE_B_memory_optimized_filegroup'
    Il plante avec :
    Msg 3234, Level 16, State 2, Line 12
    Logical file 'BASE_A' is not part of database 'BASE_B'. Use RESTORE FILELISTONLY to list the logical file names.
    Msg 3013, Level 16, State 1, Line 12
    RESTORE DATABASE is terminating abnormally.

    J'aimerai en fait dupliquer une base existante sur le même serveur en faisant en sorte que la nouvelle base soit totalement indépendante des autres (rien que ça ).
    Quelqu'un aurait une idée ?

  6. #6
    Membre Expert
    Homme Profil pro
    DBA SQL Server
    Inscrit en
    Octobre 2012
    Messages
    862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA SQL Server
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2012
    Messages : 862
    Par défaut
    Essaye un peu ce script, mais ça fait très longtemps que je ne l'ai plus utilisé, donc pas sûr que ce soit ce que tu recherches.

    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
    DECLARE @dbnametarget VARCHAR(255)
    DECLARE @dbnamesource VARCHAR(255)
    DECLARE @fileName VARCHAR(255)    -- backup file name
    DECLARE @mdfName VARCHAR(99)    
    DECLARE @ldfName VARCHAR(99)    
    DECLARE @ldfV VARCHAR(99)    
    DECLARE @SQL_SCRIPT varchar(max)
    DECLARE @newdbo varchar(99)
     
    SET @dbnamesource ='Toto1'
    SET @dbnametarget ='Toto99'
    SET @fileName = 'C:\Program Files\Microsoft SQL Server\MSSQL11.INSTP01\MSSQL\Backup\'+@dbnamesource+'.bak'
    SET @mdfName = 'C:\Program Files\Microsoft SQL Server\MSSQL11.INSTP01\MSSQL\DATA\'+@dbnametarget+'.mdf'
    SET @ldfName = 'C:\Program Files\Microsoft SQL Server\MSSQL11.INSTP01\MSSQL\DATA\'+@dbnametarget+'_log.ldf'
    SET @ldfV = @dbnamesource+'_log'
    set @newdbo = 'sa'
     
     
    IF NOT EXISTS (SELECT name FROM master..sysdatabases WHERE name = @dbnametarget)
      BEGIN
        RESTORE FILELISTONLY   FROM  DISK = @fileName 
     
        RESTORE DATABASE  @dbnametarget 
        FROM  DISK = @fileName 
        WITH  FILE = 1,  
        MOVE @dbnamesource TO @mdfName,  
        MOVE @ldfV TO @ldfName,  
        NOUNLOAD,  STATS = 10
     
        SELECT @SQL_SCRIPT = 'ALTER DATABASE '+@dbnametarget + ' MODIFY FILE (NAME='+@dbnamesource+', NEWNAME='+@dbnametarget+');'
        EXECUTE (@SQL_SCRIPT)
        SELECT @SQL_SCRIPT = 'ALTER DATABASE '+@dbnametarget + ' MODIFY FILE (NAME='+@ldfV+', NEWNAME='+@dbnametarget+'_log);'
        EXECUTE (@SQL_SCRIPT)
      END
    ELSE
        BEGIN
        Print 'DB Target '+@dbnametarget+' already EXISTS'
    END
     
    SET @SQL_SCRIPT = 'EXEC ['+@dbnametarget+'].dbo.sp_changedbowner @loginame = '+@newdbo+', @map = false'
    EXECUTE(@SQL_SCRIPT)

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par cestpasmoinonplus Voir le message
    il me répond que les LogicalName des fichiers portent le nom de la base d'origine.
    Peut-on avoir le vrai message d'erreur stp ?

Discussions similaires

  1. [2008R2] Créer une nouvelle base de données avec un backup
    Par sarrabnh dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/05/2015, 17h38
  2. comment créer une base de donnée avec SQL3 sous SYBASE ASE 12.5
    Par aminelp dans le forum Adaptive Server Enterprise
    Réponses: 4
    Dernier message: 09/08/2009, 18h24
  3. Réponses: 4
    Dernier message: 21/01/2009, 16h35
  4. Réponses: 2
    Dernier message: 01/02/2008, 16h00
  5. Créer une nouvelle base de données sur Oracle10g
    Par mariam2001 dans le forum Administration
    Réponses: 6
    Dernier message: 11/05/2007, 15h25

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