335 votes

Comment puis-je cloner une base de données SQL Server sur le même serveur dans SQL Server 2008 Express?

J'ai un système MS SQL Server 2008 Express qui contient une base de données que je voudrais 'copier et renommer' (à des fins de test), mais je ne connais pas de moyen simple pour y parvenir.

Je remarque que dans la version R2 de SQL Server, il existe un assistant de copie de base de données, mais malheureusement je ne peux pas faire de mise à niveau.

La base de données en question fait environ un gigaoctet. J'ai essayé de restaurer une sauvegarde de la base de données que je veux copier dans une nouvelle base de données, mais sans succès.

2 votes

Restaurer une sauvegarde devrait fonctionner. Pouvez-vous fournir plus de détails sur la manière dont cela a échoué?

7 votes

J'ai réalisé que j'ai fait une erreur en restaurant à partir de la sauvegarde. J'ai d'abord créé une nouvelle DB vide et j'ai essayé de restaurer la sauvegarde à partir de là. Ce que j'aurais dû faire, c'est ouvrir la boîte de dialogue de restauration et taper le nom de la nouvelle base de données là-bas au lieu de la créer d'abord. En faisant cela, la base de données a été clonée parfaitement!

0 votes

Lorsque j'ai essayé de restaurer la base de données sous un nom différent, elle m'a simplement donné : "La restauration de la base de données 'Ma base de données (Nouvelle)' a échoué. ... Un accès exclusif n'a pas pu être obtenu car la base de données est en cours d'utilisation." - la base de données sous son nouveau nom n'existe pas, comment peut-elle être en cours d'utilisation ?

454voto

qub1n Points 817
  1. Installez Microsoft SQL Management Studio, que vous pouvez télécharger gratuitement sur le site Web de Microsoft :

    Version 2008

    Microsoft SQL Management Studio 2008 fait partie de SQL Server 2008 Express with Advanced Services

    Version 2012

    Cliquez sur le bouton de téléchargement et vérifiez ENU\x64\SQLManagementStudio_x64_ENU.exe

    Version 2014

    Cliquez sur le bouton de téléchargement et vérifiez MgmtStudio 64BIT\SQLManagementStudio_x64_ENU.exe

  2. Ouvrez Microsoft SQL Management Studio.

  3. Sauvegardez la base de données d'origine dans un fichier .BAK (db -> Tâche -> Sauvegarde).

  4. Créez une base de données vide avec un nouveau nom (clone). Notez les commentaires ci-dessous car ceci est facultatif.

  5. Cliquez pour cloner la base de données et ouvrez la boîte de dialogue de restauration (voir l'image) boîte de dialogue de restauration

  6. Sélectionnez Device et ajoutez le fichier de sauvegarde de l'étape 3. ajouter un fichier de sauvegarde

  7. Changez la destination vers la base de données de test changer la destination

  8. Changez l'emplacement des fichiers de base de données, il doit être différent de l'original. Vous pouvez taper directement dans la zone de texte, il suffit d'ajouter un postfixe. (REMARQUE : l'ordre est important. Sélectionnez la case, puis changez les noms de fichiers.) changer l'emplacement

  9. Vérifiez AVEC REMPLACER et AVEC GARDER_REPLICATION avec remplacer

113 votes

1. Ne créez pas une base de données vide et ne restaurez pas le fichier .bak dessus. 2. Utilisez l'option 'Restaurer la base de données' accessible en cliquant avec le bouton droit sur la branche "Bases de données" du Gestionnaire de SQL Server et fournissez le nom de la base de données tout en fournissant la source à restaurer. ref: stackoverflow.com/questions/10204480/…

0 votes

J'ai la même remarque que pour la réponse acceptée - tu manques (pour moi le principal) point, quel logiciel utilises-tu pour faire cela ?

1 votes

Microsoft SQL Management Studio - il est gratuit

124voto

DForck42 Points 4421

Cliquez avec le bouton droit sur la base de données à cloner, cliquez sur Tâches, cliquez sur Copier la base de données.... Suivez l'assistant et vous avez terminé.

0 votes

Je pense que c'est seulement disponible dans la version R2 de SQL Server malheureusement :-(

0 votes

Umm... non? cela devrait être disponible en 2005+, car je regarde en 2008, et je suis assez certain que c'était disponible en 2005. cela pourrait ne pas être disponible dans la version express cependant.

8 votes

Voici comment cela fonctionne dans Express : stackoverflow.com/questions/4269450/…

105voto

Joe Stefanelli Points 72874

Vous pourriez essayer de détacher la base de données, de copier les fichiers en leur donnant de nouveaux noms à l'invite de commande, puis d'attacher les deux BDD.

En SQL:

USE master;
GO 
EXEC sp_detach_db
    @dbname = N'OriginalDB';
GO

À l'invite de commande (j'ai simplifié les chemins des fichiers pour l'exemple) :

copy c:\OriginalDB.mdf c:\NewDB.mdf
copy c:\OriginalDB.ldf c:\NewDB.ldf

En SQL à nouveau:

USE master;
GO
CREATE DATABASE OriginalDB
    ON (FILENAME = 'C:\OriginalDB.mdf'),
       (FILENAME = 'C:\OriginalDB.ldf')
    FOR ATTACH;
GO
CREATE DATABASE NewDB
    ON (FILENAME = 'C:\NewDB.mdf'),
       (FILENAME = 'C:\NewDB.ldf')
    FOR ATTACH;
GO

1 votes

Parfait! c'est la solution unique qui a fonctionné pour moi! Merci beaucoup!

10 votes

Sélectionner * à partir de OriginalDB.sys.sysfiles pour trouver l'emplacement des fichiers de la DB.

0 votes

Oui, j'aime aussi cette solution, car elle ne nécessite aucun outil spécial. Mais je n'ai pas pu créer une NouvelleBD, il affiche Permission denied sur le fichier .mdf. Je n'en ai pas besoin pour le moment, j'avais juste besoin d'une sauvegarde de la BD originale pour pouvoir écraser la BD d'origine plus tard, je suis juste curieux de savoir pourquoi je reçois une telle erreur.

35voto

Sergio Points 2387

Il s'avère que j'avais tenté de restaurer à partir d'une sauvegarde de manière incorrecte.

Initialement, j'ai créé une nouvelle base de données puis j'ai tenté de restaurer la sauvegarde ici. Ce que j'aurais dû faire, et ce qui a finalement fonctionné, était de faire apparaître la boîte de dialogue de restauration et de taper le nom de la nouvelle base de données dans le champ de destination.

En bref, la restauration à partir d'une sauvegarde a fait l'affaire.

Merci pour tous vos commentaires et suggestions les gars

0 votes

Lorsque je fais cela, le dialogue me dit que les fichiers sont dans le même emplacement que la base de données que j'ai initialement sauvegardée. Je n'ai donc pas le courage de restaurer, craignant que les fichiers soient écrasés.

2 votes

Neils, les fichiers sont les mêmes, par défaut, dans la capture que vous avez prise. Vous pouvez changer leurs noms pour créer de nouveaux fichiers pour la base de données nouvellement nommée.

0 votes

PS : Cette méthode nécessite le service SQL Agent, assurez-vous qu'il est en cours d'exécution avant de commencer l'opération de copie de la base de données.

24voto

bluish Points 5503

C'est le script que j'utilise. Un peu compliqué mais ça marche. Testé sur SQL Server 2012.

DECLARE @backupPath nvarchar(400);
DECLARE @sourceDb nvarchar(50);
DECLARE @sourceDb_log nvarchar(50);
DECLARE @destDb nvarchar(50);
DECLARE @destMdf nvarchar(100);
DECLARE @destLdf nvarchar(100);
DECLARE @sqlServerDbFolder nvarchar(100);

SET @sourceDb = 'db1'
SET @sourceDb_log = @sourceDb + '_log'
SET @backupPath = 'E:\DB SQL\MSSQL11.MSSQLSERVER\MSSQL\Backup\' + @sourceDb + '.bak'    --ATTENTION: file must already exist and SQL Server must have access to it
SET @sqlServerDbFolder = 'E:\DB SQL\MSSQL11.MSSQLSERVER\MSSQL\DATA\'
SET @destDb = 'db2'
SET @destMdf = @sqlServerDbFolder + @destDb + '.mdf'
SET @destLdf = @sqlServerDbFolder + @destDb + '_log' + '.ldf'

BACKUP DATABASE @sourceDb TO DISK = @backupPath

RESTORE DATABASE @destDb FROM DISK = @backupPath
WITH REPLACE,
   MOVE @sourceDb     TO @destMdf,
   MOVE @sourceDb_log TO @destLdf

2 votes

Dans mon environnement, les noms de fichiers ne correspondaient pas au nom de la base de données (venant d'une autre restauration) donc j'avais besoin de SET @sourceDb_log = (SELECT files.name FROM sys.databases dbs INNER JOIN sys.master_files files ON dbs.database_id=files.database_id WHERE dbs.name=@sourceDb AND files.type=1) et d'une variable séparée pour @sourceDb_data avec une requête similaire (en remplaçant files.type=0). J'espère que cela vous aide!

0 votes

Obtenir une erreur : Msg 137, Level 15, State 2, Line 25 Must declare the scalar variable "@destDb". Il s'avère que j'avais mis une instruction GO entre la déclaration de la variable et son utilisation, on ne peut pas faire ça, voir : stackoverflow.com/a/55347161/6184866

1 votes

Script très utile en effet... ;) Une petite correction de syntaxe : Il suffit de mettre un '@' sur la variable à la ligne 11 : SET @backupPath = 'E:\tmp\' + @sourceDb + '.bak' --ATTENTION : le fichier doit déjà exister et SQL Server doit y avoir accès. De plus, vous pouvez définir le dossier de sauvegarde sur : ` E:\DB SQL\MSSQL11.MSSQLSERVER\MSSQL\Backup\ ` pour éviter de définir des droits d'accès de sécurité.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X