web-dev-qa-db-fra.com

Comment 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 contenant 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 la version R2 de SQL Server comporte un assistant de copie de base de données, mais malheureusement, je ne peux pas effectuer de mise à niveau.

La base de données en question est autour d'un concert. J'ai tenté 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.

242
Sergio

Il s’avère que j’ai tenté de restaurer à partir d’une sauvegarde incorrecte.

Au départ, j'ai créé une nouvelle base de données, puis tenté de restaurer la sauvegarde ici. Ce que j’aurais dû faire, et ce qui a bien fonctionné, a été d’ouvrir 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 les commentaires et suggestions les gars

29
Sergio
  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 avec services avancés

    Version 2012

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

    Version 2014

    Cliquez bouton de téléchargement et cochez MgmtStudio 64BIT\SQLManagementStudio_x64_ENU.exe

  2. Ouvrez Microsoft SQL Management Studio .

  3. Sauvegarder la base de données originale dans un fichier .BAK (db -> tâche -> sauvegarde).
  4. Créer une base de données vide avec un nouveau nom (clone). Notez les commentaires ci-dessous car cela est facultatif.
  5. Cliquez pour cloner la base de données et ouvrir la boîte de dialogue de restauration (voir image) restore dialog
  6. Sélectionnez Périphérique et ajoutez le fichier de sauvegarde à l’étape 3. add backup file
  7. Changer la destination pour tester la base de données change destination
  8. Changer 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, ajoutez simplement postfix. (REMARQUE: l'ordre est important. Cochez la case, puis modifiez les noms de fichiers.) change location
  9. Vérifier avec REPLACE et WITH KEEP_REPLICATION with replace
331
Tomas Kubes

Cliquez avec le bouton droit de la souris sur la base de données à cloner, cliquez sur Tasks, puis sur Copy Database.... Suivez l'assistant et vous avez terminé.

107
DForck42

Vous pouvez essayer de détacher la base de données, copier les fichiers sous un nouveau nom à l’invite de commande, puis joindre les deux bases de données.

En SQL:

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

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

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

En SQL encore:

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
88
Joe Stefanelli

C'est le script que j'utilise. Un peu délicat 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:\tmp\' + 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
16
bluish

À l'aide de MS SQL Server 2012, vous devez effectuer 3 étapes de base:

  1. Commencez par générer le fichier .sql contenant uniquement la structure du DB source.

    • clic droit sur la base de données source puis tâches puis Générer des scripts
    • suivez l'assistant et enregistrez le fichier .sql localement
  2. Deuxièmement, remplacez le DB source par celui de destination dans le fichier .sql

    • Faites un clic droit sur le fichier de destination, sélectionnez Nouvelle requête et Ctrl-H ou ( Modifier - Rechercher et remplacer - Remplacer rapidement )
  3. Enfin, peupler avec des données

    • Cliquez avec le bouton droit sur la base de données de destination, puis sélectionnez Tâches et Importer des données
    • La liste déroulante Source de données est définie sur ". Fournisseur de données Net Framework pour serveur SQL " + définissez le champ de texte de la chaîne de connexion sous DATA ex: Data Source=Mehdi\SQLEXPRESS;Initial Catalog=db_test;User ID=sa;Password=sqlrpwrd15
    • faire la même chose avec la destination
    • cochez la table que vous voulez transférer ou cochez la case "source: ..." pour toutes les vérifier

Vous avez terminé.

9
Mehdi Benkirane

Aucune des solutions mentionnées ici n'a fonctionné pour moi. J'utilise SQL Server Management Studio 2014.

À la place, je devais décocher la case "Effectuer une sauvegarde du journal de détail avant la restauration" dans l'écran "Options": dans ma version, cette option est cochée par défaut et empêche la restauration de la restauration. Après l'avoir décochée, l'opération de restauration s'est déroulée sans problème.

enter image description here

8

Dans SQL Server 2008 R2, sauvegardez la base de données en tant que fichier dans un dossier. Ensuite, choisissez l'option de restauration qui apparaît dans le dossier "Base de données". Dans l'assistant, entrez le nouveau nom souhaité dans la base de données cible. Et choisissez de restaurer un fichier et d’utiliser le fichier que vous venez de créer. Je l'ai fait et c'était très rapide (mon DB était petit, mais quand même) Pablo.

6
pabloelustondo

La solution, basée sur ce commentaire: https://stackoverflow.com/a/22409447/2399045 . Il suffit de définir les paramètres: nom de la base de données, dossier temporaire, dossier des fichiers db. Et après exécution, vous aurez la copie de DB avec Name au format "sourceDBName_yyyy-mm-jj".

-- Settings --
-- New DB name will have name = sourceDB_yyyy-mm-dd
declare @sourceDbName nvarchar(50) = 'MyDbName';
declare @tmpFolder nvarchar(50) = 'C:\Temp\'
declare @sqlServerDbFolder nvarchar(100) = 'C:\Databases\'

--  Execution --
declare @sourceDbFile nvarchar(50);
declare @sourceDbFileLog nvarchar(50);
declare @destinationDbName nvarchar(50) = @sourceDbName + '_' + (select convert(varchar(10),getdate(), 121))
declare @backupPath nvarchar(400) = @tmpFolder + @destinationDbName + '.bak'
declare @destMdf nvarchar(100) = @sqlServerDbFolder + @destinationDbName + '.mdf'
declare @destLdf nvarchar(100) = @sqlServerDbFolder + @destinationDbName + '_log' + '.ldf'

SET @sourceDbFile = (SELECT top 1 files.name 
                    FROM sys.databases dbs 
                    INNER JOIN sys.master_files files 
                        ON dbs.database_id = files.database_id 
                    WHERE dbs.name = @sourceDbName
                        AND files.[type] = 0)

SET @sourceDbFileLog = (SELECT top 1 files.name 
                    FROM sys.databases dbs 
                    INNER JOIN sys.master_files files 
                        ON dbs.database_id = files.database_id 
                    WHERE dbs.name = @sourceDbName
                        AND files.[type] = 1)

BACKUP DATABASE @sourceDbName TO DISK = @backupPath

RESTORE DATABASE @destinationDbName FROM DISK = @backupPath
WITH REPLACE,
   MOVE @sourceDbFile     TO @destMdf,
   MOVE @sourceDbFileLog  TO @destLdf
4
Pavel Samoylenko

Si la base de données n'est pas très volumineuse, consultez les commandes "Base de données de scripts" de SQL Server Management Studio Express, qui se trouvent dans un menu contextuel de l'élément de base de données lui-même dans l'Explorateur.

Vous pouvez choisir ce que tous les scripts doivent être; vous voulez les objets et les données, bien sûr. Vous sauvegarderez ensuite l'intégralité du script dans un seul fichier. Ensuite, vous pouvez utiliser ce fichier pour recréer la base de données; assurez-vous simplement que la commande USE en haut est définie sur la base de données appropriée.

4
Andrew Barber

Vous pouvez simplement créer une nouvelle base de données, puis accéder aux tâches, importer des données et importer toutes les données de la base de données que vous souhaitez dupliquer dans la base de données que vous venez de créer.

3
TheFab92

Une autre façon de résoudre le problème en utilisant assistant d'importation/exportation, créez d'abord une base de données vide, puis choisissez la source qui correspond à votre serveur avec la base de données source, puis choisissez le même serveur avec le base de données de destination (en utilisant la base de données vide que vous avez créée au début), puis cliquez sur terminer

Il créera toutes les tables et transférera toutes les données dans la nouvelle base de données,

2
Mohanad Kaleia

Script basé sur la réponse de Joe (détachez, copiez les fichiers, joignez les deux).

  1. Exécutez Managment Studio en tant que compte administrateur.

Ce n'est pas nécessaire, mais peut-être que l'accès est refusé lors de l'exécution.

  1. Configurez le serveur SQL pour exécuter xp_cmdshel
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
  1. Exécutez le script, mais tapez vos noms de base de données dans les variables @dbName et @copyDBName avant.
USE master;
GO 

DECLARE @dbName NVARCHAR(255) = 'Products'
DECLARE @copyDBName NVARCHAR(255) = 'Products_branch'

-- get DB files
CREATE TABLE ##DBFileNames([FileName] NVARCHAR(255))
EXEC('
    INSERT INTO ##DBFileNames([FileName])
    SELECT [filename] FROM ' + @dbName + '.sys.sysfiles')

-- drop connections
EXEC('ALTER DATABASE ' + @dbName + ' SET OFFLINE WITH ROLLBACK IMMEDIATE')

EXEC('ALTER DATABASE ' + @dbName + ' SET SINGLE_USER')

-- detach
EXEC('EXEC sp_detach_db @dbname = ''' + @dbName + '''')

-- copy files
DECLARE @filename NVARCHAR(255), @path NVARCHAR(255), @ext NVARCHAR(255), @copyFileName NVARCHAR(255), @command NVARCHAR(MAX) = ''
DECLARE 
    @oldAttachCommand NVARCHAR(MAX) = 
        'CREATE DATABASE ' + @dbName + ' ON ', 
    @newAttachCommand NVARCHAR(MAX) = 
        'CREATE DATABASE ' + @copyDBName + ' ON '

DECLARE curs CURSOR FOR 
SELECT [filename] FROM ##DBFileNames
OPEN curs  
FETCH NEXT FROM curs INTO @filename
WHILE @@FETCH_STATUS = 0  
BEGIN
    SET @path = REVERSE(RIGHT(REVERSE(@filename),(LEN(@filename)-CHARINDEX('\', REVERSE(@filename),1))+1))
    SET @ext = RIGHT(@filename,4)
    SET @copyFileName = @path + @copyDBName + @ext

    SET @command = 'EXEC master..xp_cmdshell ''COPY "' + @filename + '" "' + @copyFileName + '"'''
    PRINT @command
    EXEC(@command);

    SET @oldAttachCommand = @oldAttachCommand + '(FILENAME = "' + @filename + '"),'
    SET @newAttachCommand = @newAttachCommand + '(FILENAME = "' + @copyFileName + '"),'

    FETCH NEXT FROM curs INTO @filename
END
CLOSE curs 
DEALLOCATE curs

-- attach
SET @oldAttachCommand = LEFT(@oldAttachCommand, LEN(@oldAttachCommand) - 1) + ' FOR ATTACH'
SET @newAttachCommand = LEFT(@newAttachCommand, LEN(@newAttachCommand) - 1) + ' FOR ATTACH'

-- attach old db
PRINT @oldAttachCommand
EXEC(@oldAttachCommand)

-- attach copy db
PRINT @newAttachCommand
EXEC(@newAttachCommand)

DROP TABLE ##DBFileNames
2
Evgeny Ivanov