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.
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
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
Ouvrez Microsoft SQL Management Studio .
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é.
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
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
À l'aide de MS SQL Server 2012, vous devez effectuer 3 étapes de base:
Commencez par générer le fichier .sql
contenant uniquement la structure du DB source.
.sql
localementDeuxièmement, remplacez le DB source par celui de destination dans le fichier .sql
Enfin, peupler avec des données
Data Source=Mehdi\SQLEXPRESS;Initial Catalog=db_test;User ID=sa;Password=sqlrpwrd15
Vous avez terminé.
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.
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.
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
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.
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.
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,
Script basé sur la réponse de Joe (détachez, copiez les fichiers, joignez les deux).
Ce n'est pas nécessaire, mais peut-être que l'accès est refusé lors de l'exécution.
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
@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