sql-server - une - échec de attacher la base de données pour serveur




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

  1. Installez Microsoft SQL Management Studio, vous pouvez le 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 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. Sauvegarder la base de données d'origine dans un fichier (db -> Task -> Backup).
  4. Créez une base de données vide avec un nouveau nom (clone).
  5. Cliquer pour cloner la base de données et ouvrir la boîte de dialogue de restauration (voir image)
  6. Sélectionnez Device et ajoutez le fichier bakcup à l'étape 1.
  7. Changer la destination pour tester la base de données
  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, il suffit d'ajouter un suffixe. (NOTE: L'ordre est important, cochez la case, puis changez les noms de fichiers.)
  9. Vérifiez WITH REMPLACE et WITH KEEP_REPLICATION

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 suis pas au courant d'un moyen simple d'y parvenir.

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

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


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

Au lieu de cela, j'ai dû décocher la case "Enregistrer la sauvegarde du journal avant la restauration" dans l'écran "Options": dans ma version, elle est cochée par défaut et empêche l'opération de restauration d'être terminée. 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 que vous voulez dans la base de données cible. Et choisissez restaurer le fichier frrom et utilisez le fichier que vous venez de créer. Je l'ai fait et c'était très rapide (ma DB était petite, mais quand même) Pablo.


En utilisant MS SQL Server 2012, vous devez effectuer 3 étapes de base:

  1. Tout d'abord, générez .sql fichier .sql contenant uniquement la structure de la base de données source

    • faites un clic droit sur la base de données source puis sur Tâches puis sur Générer des scripts
    • suivez l'assistant et enregistrez le fichier .sql localement
  2. Ensuite, 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 ( Editer - Rechercher et remplacer - Remplacer rapidement )
  3. Enfin, remplir avec des données

    • Cliquez avec le bouton droit sur la base de données de destination, puis sélectionnez Tâches et importer les données
    • La source de données déroulante est définie sur " Fournisseur de données de framework .net pour serveur SQL " + définir 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
    • fais de même avec la destination
    • cochez la case que vous voulez transférer ou cochez à côté de "source: ..." pour les vérifier tous

Vous avez terminé.


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

-- 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

Script basé sur Joe réponse ( détacher, copier des fichiers, joindre 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 a refusé l'erreur lors de l'exécution.

  1. Configurer 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 @dbName @copyDBName 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 Products 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

Une autre façon de faire l'astuce en utilisant l'assistant d'importation / exportation , choisissez la source est votre serveur avec la base de données source, puis choisissez le même serveur avec la base de données de destination (vous devez d'abord créer une base de données vide)

Il va créer toutes les tables et transférer toutes les données dans la nouvelle base de données,


Vous pouvez essayer de détacher la base de données, copier les fichiers à de nouveaux noms à une invite de commande, puis attacher les deux DB.

En SQL:

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

À l'invite de commande (j'ai simplifié les chemins de fichier pour le bien de cet 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




sql-server-2008-express