Comment restaurer sur une autre base de données sur un serveur SQL?

224

J'ai une sauvegarde de Database1 il y a une semaine. La sauvegarde est effectuée chaque semaine dans le planificateur et j'obtiens un .bakfichier. Maintenant, je veux jouer avec certaines données, je dois donc les restaurer dans une autre base de données - Database2 .

J'ai vu cette question: restaurer la base de données SQL Server dans le même PC avec un nom différent et l'étape recommandée consiste à renommer la base de données d'origine, mais je ne suis pas dans cette option car je suis sur le serveur de production et je ne peux pas vraiment le faire.

Existe-t-il un autre moyen de le restaurer Database2, ou du moins, comment parcourir les données de ce fichier .bak?

Merci.

ps: la deuxième réponse du lien ci-dessus semblait prometteuse mais elle se termine avec erreur:

La restauration de la liste de fichiers se termine anormalement

LocustHorde
la source

Réponses:

304

Vous pouvez créer une nouvelle base de données puis utiliser l '"Assistant de restauration" en activant l'option Ecraser ou;

Afficher le contenu;

RESTORE FILELISTONLY FROM DISK='c:\your.bak'

notez les noms logiques des .mdf et .ldf des résultats, puis;

RESTORE DATABASE MyTempCopy FROM DISK='c:\your.bak'
WITH 
   MOVE 'LogicalNameForTheMDF' TO 'c:\MyTempCopy.mdf',
   MOVE 'LogicalNameForTheLDF' TO 'c:\MyTempCopy_log.ldf'

Pour créer la base MyTempCopyde données avec le contenu de your.bak.

Exemple (restaure une sauvegarde d'une base de données appelée 'creditline' vers 'MyTempCopy';

RESTORE FILELISTONLY FROM DISK='e:\mssql\backup\creditline.bak'

>LogicalName
>--------------
>CreditLine
>CreditLine_log

RESTORE DATABASE MyTempCopy FROM DISK='e:\mssql\backup\creditline.bak'
WITH 
   MOVE 'CreditLine' TO 'e:\mssql\MyTempCopy.mdf',
   MOVE 'CreditLine_log' TO 'e:\mssql\MyTempCopy_log.ldf'

>RESTORE DATABASE successfully processed 186 pages in 0.010 seconds (144.970 MB/sec).
Alex K.
la source
5
Salut, il me semble manquer quelque chose, il continue de lancer l'erreur backkup set holds a backup of a database other than existing "tmp" database, ce qui, je le comprends. La tophrase devrait-elle être le chemin physique réel de MyTempCopy?
LocustHorde
Odd, toc'est l'emplacement db & log pour la nouvelle base de données, exemple de mise à jour ci
Alex K.
52
Pour toute autre personne essayant ceci, ne créez pas MyTempCopy, il est créé pendant la restauration.
Blazes
3
travaillé uniquement avec les options REPLACE, RECOVERY, dans mon cas (SQL2012) cr. dba.stackexchange.com/questions/51489/…
dc2009
7
Devrait utiliser REMPLACER, RÉCUPÉRER pour résoudre ce problème. Ce serait donc: RESTORE DATABASE MyTempCopy FROM DISK='e:\mssql\backup\creditline.bak' WITH REPLACE, RECOVERY, MOVE 'CreditLine' TO 'e:\mssql\MyTempCopy.mdf', MOVE 'CreditLine_log' TO 'e:\mssql\MyTempCopy_log.ldf'
Raihan
67

SQL Server 2008 R2:

Pour une base de données existante que vous souhaitez "restaurer: à partir d'une sauvegarde d'une autre base de données, procédez comme suit:

  1. Dans la barre d'outils, cliquez sur le bouton Moniteur d'activité.
  2. Cliquez sur les processus. Filtrez par la base de données que vous souhaitez restaurer. Tuez tous les processus en cours en cliquant avec le bouton droit sur chaque processus et en sélectionnant "tuer le processus".
  3. Cliquez avec le bouton droit sur la base de données que vous souhaitez restaurer et sélectionnez Tâches -> Restaurer -> À partir de la base de données.
  4. Sélectionnez le bouton radio "From Device:".
  5. Sélectionnez ... et choisissez le fichier de sauvegarde de l'autre base de données à partir de laquelle vous souhaitez restaurer.
  6. Sélectionnez le jeu de sauvegarde à partir duquel vous souhaitez restaurer en cochant la case à gauche du jeu de sauvegarde.
  7. Sélectionnez les options".
  8. Sélectionnez Remplacer la base de données existante (AVEC REMPLACEMENT)
  9. Important: Remplacez le nom du fichier de données de lignes «Restaurer sous» par le nom de fichier de la base de données existante que vous souhaitez remplacer ou donnez-lui simplement un nouveau nom.
  10. Faites de même avec le nom de fichier du fichier journal.
  11. Vérifiez à partir de l'écran du moniteur d'activité qu'aucun nouveau processus n'a été généré. S'ils l'étaient, tuez-les.
  12. Cliquez sur OK.
Daniel Byrne
la source
12
MS SQL Server 2010?
Mark
3
Il y a quelques captures d'écran ici stackoverflow.com/questions/3829271/…
Tomas Kubes
Bien que je sois programmeur, je préfère utiliser cet assistant. Plus facile et plus propre.
v1n1akabozo
1
L'étape clé était # 8 pour moi. Merci Daniel.
jbooker
SQL 2014 .. Étape 6a: remplacez la base de données de destination par la base de données que vous souhaitez restaurer. Étape 9 et 10: cela devrait être pris en charge pour vous en modifiant la base de données de destination. Mais revérifiez cela en allant dans Fichiers et en vérifiant les noms de fichiers comme décrit dans les étapes 9 et 10 d'origine.
JzInqXc9Dg
49

Pour SQL Server 2012, à l'aide de Sql Server Management Studio, j'ai trouvé ces étapes de la page Microsoft utiles pour restaurer dans un autre fichier et nom de base de données: (réf: http://technet.microsoft.com/en-us/library/ms175510 .aspx )

Notez que les étapes 4 et 7 sont importantes à définir afin de ne pas écraser la base de données existante.


Pour restaurer une base de données vers un nouvel emplacement et éventuellement renommer la base de données

  1. Connectez-vous à l'instance appropriée du moteur de base de données SQL Server, puis dans l'Explorateur d'objets, cliquez sur le nom du serveur pour développer l'arborescence du serveur.
  2. Cliquez avec le bouton droit sur Bases de données , puis cliquez sur Restaurer la base de données . La boîte de dialogue Restaurer la base de données s'ouvre.
  3. Sur la page Général , utilisez la section Source pour spécifier la source et l'emplacement des jeux de sauvegarde à restaurer. Sélectionnez l'une des options suivantes:

    • Base de données

      • Sélectionnez la base de données à restaurer dans la liste déroulante. La liste contient uniquement les bases de données qui ont été sauvegardées conformément à l' historique de sauvegarde msdb .

        Remarque Si la sauvegarde est effectuée à partir d'un autre serveur, le serveur de destination ne disposera pas des informations d'historique de sauvegarde pour la base de données spécifiée. Dans ce cas, sélectionnez Périphérique pour spécifier manuellement le fichier ou le périphérique à restaurer.

    • Dispositif

      • Cliquez sur le bouton Parcourir (...) pour ouvrir la boîte de dialogue Sélectionner les périphériques de sauvegarde . Dans la zone Type de support de sauvegarde , sélectionnez l'un des types de périphériques répertoriés. Pour sélectionner un ou plusieurs périphériques pour la zone Support de sauvegarde , cliquez sur Ajouter . Après avoir ajouté les périphériques souhaités à la zone de liste Support de sauvegarde , cliquez sur OK pour revenir à la page Général . Dans la zone de liste Source: Device: Database , sélectionnez le nom de la base de données à restaurer.

        Remarque Cette liste n'est disponible que lorsque Périphérique est sélectionné. Seules les bases de données qui ont des sauvegardes sur le périphérique sélectionné seront disponibles.

  4. Dans la section Destination , la zone Base de données est automatiquement remplie avec le nom de la base de données à restaurer. Pour modifier le nom de la base de données, entrez le nouveau nom dans la zone Base de données .
  5. Dans la zone Restaurer vers , laissez la valeur par défaut À la dernière sauvegarde effectuée ou cliquez sur Chronologie pour accéder à la boîte de dialogue Chronologie de sauvegarde pour sélectionner manuellement un point dans le temps pour arrêter l'action de récupération.
  6. Dans la grille Jeux de sauvegarde à restaurer, sélectionnez les sauvegardes à restaurer. Cette grille affiche les sauvegardes disponibles pour l'emplacement spécifié. Par défaut, un plan de récupération est suggéré. Pour remplacer le plan de récupération suggéré, vous pouvez modifier les sélections dans la grille. Les sauvegardes qui dépendent de la restauration d'une sauvegarde antérieure sont automatiquement désélectionnées lorsque la sauvegarde antérieure est désélectionnée.
  7. Pour spécifier le nouvel emplacement des fichiers de base de données, sélectionnez la page Fichiers , puis cliquez sur Déplacer tous les fichiers dans le dossier . Fournissez un nouvel emplacement pour le dossier de fichiers de données et le dossier de fichiers journaux . Vous pouvez également conserver les mêmes dossiers et renommer simplement la base de données et les noms des fichiers journaux.
Pourrit
la source
3
Celui-ci fonctionne comme un charme; remerciements spéciaux pour les étapes 4 et 7
Anatoly Yakimchuk
De plus, je devais aller dans l'onglet «Options» et cocher «Remplacer la base de données existante (AVEC REMPLACER)» ... Ensuite, cela a fonctionné.
John Kurtz
1
@JohnKurtz, vous ne devriez pas avoir besoin de le faire si vous restaurez dans une nouvelle base de données.
Rots
J'avais déjà créé une base de données vide dans laquelle restaurer. Ça doit être la différence.
John Kurtz
1
Confirmé que cela fonctionne comme décrit si vous entrez le nom d'une base de données inexistante à l'étape 4. Confirmé que si vous choisissez une autre base de données qui existe déjà, vous devez cocher la case 'Remplacer la base de données existante (AVEC REMPLACER)' sur ' Onglet Options. Merci pour votre patience!
John Kurtz
34

En fait, il n'est pas nécessaire de restaurer la base de données en termes natifs de SQL Server, car vous "voulez jouer avec certaines données" et "parcourir les données de ce fichier .bak"

Vous pouvez utiliser ApexSQL Restore - un outil SQL Server qui attache des sauvegardes de bases de données SQL natives et nativement compressées et des sauvegardes de journaux de transactions en tant que bases de données en direct , accessibles via SQL Server Management Studio, Visual Studio ou tout autre outil tiers. Il permet de joindre une ou plusieurs sauvegardes complètes, différentielles et des journaux de transactions

De plus, je pense que vous pouvez faire le travail pendant que l'outil est en mode d'essai entièrement fonctionnel (14 jours)

Avertissement: je travaille en tant qu'ingénieur de support produit chez ApexSQL

Ivan Stankovic
la source
9

Voici ce que j'ai rassemblé à partir de divers articles pour copier une base de données à l'aide de la sauvegarde et de la restauration avec déplacer pour fixer l'emplacement physique et sql supplémentaire pour fixer le nom logique.

/**
 * Creates (or resets) a Database to a copy of the template database using backup and restore.
 *
 * Usage: Update the @NewDatabase value to the database name to create or reset.
 */

DECLARE @NewDatabase SYSNAME = 'new_db';

-- Set up
USE tempdb;

DECLARE @TemplateBackups SYSNAME = 'TemplateBackups';
DECLARE @TemplateDatabase SYSNAME = 'template_db';
DECLARE @TemplateDatabaseLog SYSNAME = @TemplateDatabase + '_log';

-- Create a backup of the template database
BACKUP DATABASE @TemplateDatabase TO DISK = @TemplateBackups WITH CHECKSUM, COPY_ONLY, FORMAT, INIT, STATS = 100;

-- Get the backup file list as a table variable
DECLARE @BackupFiles TABLE(LogicalName nvarchar(128),PhysicalName nvarchar(260),Type char(1),FileGroupName nvarchar(128),Size numeric(20,0),MaxSize numeric(20,0),FileId tinyint,CreateLSN numeric(25,0),DropLSN numeric(25, 0),UniqueID uniqueidentifier,ReadOnlyLSN numeric(25,0),ReadWriteLSN numeric(25,0),BackupSizeInBytes bigint,SourceBlockSize int,FileGroupId int,LogGroupGUID uniqueidentifier,DifferentialBaseLSN numeric(25,0),DifferentialBaseGUID uniqueidentifier,IsReadOnly bit,IsPresent bit,TDEThumbprint varbinary(32));
INSERT @BackupFiles EXEC('RESTORE FILELISTONLY FROM DISK = ''' + @TemplateBackups + '''');

-- Create  the backup file list as a table variable
DECLARE @NewDatabaseData VARCHAR(MAX);
DECLARE @NewDatabaseLog VARCHAR(MAX);

SELECT @NewDatabaseData = PhysicalName FROM @BackupFiles WHERE Type = 'D';
SELECT @NewDatabaseLog = PhysicalName FROM @BackupFiles WHERE Type = 'L';

SET @NewDatabaseData = REPLACE(@NewDatabaseData, @TemplateDatabase, @NewDatabase);
SET @NewDatabaseLog = REPLACE(@NewDatabaseLog, @TemplateDatabase, @NewDatabase);

RESTORE DATABASE @NewDatabase FROM DISK = @TemplateBackups WITH CHECKSUM, RECOVERY, REPLACE, STATS = 100,
   MOVE @TemplateDatabase TO @NewDatabaseData,
   MOVE @TemplateDatabaseLog TO @NewDatabaseLog;

-- Change Logical File Name
DECLARE @SQL_SCRIPT VARCHAR(MAX)='
    ALTER DATABASE [{NewDatabase}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
    ALTER DATABASE [{NewDatabase}] MODIFY FILE (NAME=N''{TemplateDatabase}'', NEWNAME=N''{NewDatabase}'');
    ALTER DATABASE [{NewDatabase}] MODIFY FILE (NAME=N''{TemplateDatabase}_log'', NEWNAME=N''{NewDatabase}_log'');
    ALTER DATABASE [{NewDatabase}] SET MULTI_USER WITH ROLLBACK IMMEDIATE;
    SELECT name AS logical_name, physical_name FROM SYS.MASTER_FILES WHERE database_id = DB_ID(N''{NewDatabase}'');
';
SET @SQL_SCRIPT = REPLACE(@SQL_SCRIPT, '{TemplateDatabase}', @TemplateDatabase);
SET @SQL_SCRIPT = REPLACE(@SQL_SCRIPT, '{NewDatabase}', @NewDatabase);
EXECUTE (@SQL_SCRIPT);
Nathan Niesen
la source
Bonjour NateN, je veux restaurer mon fichier .bak (qui existe dans ma machine locale d: chemin du lecteur) vers une autre base de données. J'ai essayé ce code pour les tests unitaires mais il donne une erreur. "Un accès exclusif n'a pas pu être obtenu car la base de données est en cours d'utilisation. "impossible de restaurer db .. pouvez-vous s'il vous plaît m'aider à faire ..?
Victor Athoti.
La base de données que vous restaurez ne peut pas être utilisée par un autre processus. Je ne sais pas comment exécuter un script pour tuer tous les processus accédant à une base de données.
Nathan Niesen
Bonjour NateN, ça fonctionne bien maintenant, j'utilise votre exemple de code, puis j'ai fait de petites modifications dans ce code, puis ça fonctionne bien .... Encore une fois merci d'avoir fourni un exemple de code ...
Victor Athoti.
1
Pour sql2014 et au-delà, la DECLARE @BackupFiles...ligne a besoin d'une colonne supplémentaire:SnapshotURL nvarchar(360)
fiat
3

C'est en fait un peu plus simple que de restaurer sur le même serveur. Fondamentalement, vous parcourez simplement les options "Restaurer la base de données". Voici un tutoriel pour vous:

http://www.techrepublic.com/blog/window-on-windows/how-do-i-restore-a-sql-server-database-to-a-new-server/454

Surtout qu'il s'agit d'une restauration hors production, vous pouvez vous sentir à l'aise de l'essayer sans trop vous soucier des détails. Placez simplement vos fichiers SQL où vous le souhaitez sur votre nouveau serveur et donnez-lui le nom que vous voulez et vous êtes prêt à partir.

IAmTimCorey
la source
HI, je dois restaurer sur le même serveur, une base de données différente ... (La base de données de restauration a un nom différent)
LocustHorde
Désolé, j'ai mal lu la question. Les mêmes principes de base s'appliquent, il vous suffit de vous assurer que les nouveaux noms et noms de fichiers (mdf, ldf, etc.) sont différents.
IAmTimCorey
3

Si aucune base de données n'existe, j'utilise le code suivant:

ALTER PROCEDURE [dbo].[RestoreBackupToNewDB]    
         @pathToBackup  varchar(500),--where to take backup from
         @pathToRestoreFolder  varchar(500), -- where to put the restored db files 
         @newDBName varchar(100)
    AS
    BEGIN

            SET NOCOUNT ON
            DECLARE @fileListTable TABLE (
            [LogicalName]           NVARCHAR(128),
            [PhysicalName]          NVARCHAR(260),
            [Type]                  CHAR(1),
            [FileGroupName]         NVARCHAR(128),
            [Size]                  NUMERIC(20,0),
            [MaxSize]               NUMERIC(20,0),
            [FileID]                BIGINT,
            [CreateLSN]             NUMERIC(25,0),
            [DropLSN]               NUMERIC(25,0),
            [UniqueID]              UNIQUEIDENTIFIER,
            [ReadOnlyLSN]           NUMERIC(25,0),
            [ReadWriteLSN]          NUMERIC(25,0),
            [BackupSizeInBytes]     BIGINT,
            [SourceBlockSize]       INT,
            [FileGroupID]           INT,
            [LogGroupGUID]          UNIQUEIDENTIFIER,
            [DifferentialBaseLSN]   NUMERIC(25,0),
            [DifferentialBaseGUID]  UNIQUEIDENTIFIER,
            [IsReadOnly]            BIT,
            [IsPresent]             BIT,
            [TDEThumbprint]         VARBINARY(32) -- remove this column if using SQL 2005
            )
            INSERT INTO @fileListTable EXEC('RESTORE FILELISTONLY FROM DISK ='''+ @pathToBackup+'''')
            DECLARE @restoreDatabaseFilePath NVARCHAR(500)
            DECLARE @restoreLogFilePath NVARCHAR(500)
            DECLARE @databaseLogicName NVARCHAR(500)
            DECLARE @logLogicName NVARCHAR(500)
            DECLARE @pathSalt uniqueidentifier = NEWID()

            SET @databaseLogicName = (SELECT LogicalName FROM @fileListTable WHERE [Type]='D') 
            SET @logLogicName = (SELECT LogicalName FROM @fileListTable WHERE [Type]='L')           
            SET @restoreDatabaseFilePath= @pathToRestoreFolder + @databaseLogicName + convert(nvarchar(50), @pathSalt) + '.mdf'
            SET @restoreLogFilePath= @pathToRestoreFolder + @logLogicName + convert(nvarchar(50), @pathSalt) + '.ldf'

            RESTORE DATABASE @newDBName FROM DISK=@pathToBackup     
            WITH 
               MOVE @databaseLogicName TO @restoreDatabaseFilePath,
               MOVE @logLogicName TO @restoreLogFilePath

            SET NOCOUNT OFF
    END
Konstantin Chernov
la source
3
  • J'ai la même erreur que cette rubrique lorsque je restaure une nouvelle base de données à l'aide d'une ancienne base de données. (l'utilisation de .bak donne la même erreur)

  • J'ai changé le nom de l'ancienne base de données par le nom de la nouvelle base de données (même cette image). Ça a marché.

entrez la description de l'image ici

Nguyen Duc Hai
la source
2
La prochaine fois, veuillez effacer le nom de la banque
Danh
1

Voici comment restaurer une sauvegarde en tant que base de données supplémentaire avec un nom de base de données unique.

Pour SQL 2005, cela fonctionne très rapidement. Je suis sûr que les versions plus récentes fonctionneront de la même manière.

Tout d'abord, vous n'avez pas besoin de déconnecter votre base de données d'origine. Mais pour des raisons de sécurité, j'aime bien. Dans mon exemple, je vais monter un clone de ma base de données "billing" et il sera nommé "billingclone".

1) Faites une bonne sauvegarde de la base de données de facturation

2) Pour des raisons de sécurité, j'ai mis l'original hors ligne comme suit:

3) Ouvrez une nouvelle fenêtre de requête

**IMPORTANT! Gardez cette fenêtre de requête ouverte jusqu'à ce que vous ayez terminé! Vous devez restaurer la base de données à partir de cette fenêtre!

Saisissez maintenant le code suivant:

-- 1) free up all USER databases
USE master;
GO
-- 2) kick all other users out:
ALTER DATABASE billing SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
-- 3) prevent sessions from re-establishing connection:
ALTER DATABASE billing SET OFFLINE;

3) Ensuite, dans Management Studio, cliquez sur rt Bases de données dans l'Explorateur d'objets, choisissez "Restaurer la base de données"

4) entrez un nouveau nom dans le champ "Vers la base de données". IE billingclone

5) Dans Source for Restore, cliquez sur "From Device" et cliquez sur le bouton ... naviguer

6) Cliquez sur Ajouter et accédez à votre sauvegarde

7) Cochez la case à côté de Restaurer (sélectionnez les jeux de sauvegarde à restaurer)

8) Sélectionnez ensuite la page OPTIONS dans le coin supérieur gauche

9) Modifiez maintenant les noms des fichiers de base de données dans RESTORE AS. Faites cela pour la base de données et le journal. IE billingclone.mdf et billingclone_log.ldf

10) appuyez maintenant sur OK et attendez la fin de la tâche.

11) Cliquez sur Actualiser dans votre explorateur d'objets et vous verrez votre nouveau db

12) Vous pouvez maintenant remettre votre base de facturation en ligne. Utilisez la même fenêtre de requête que celle utilisée pour mettre la facturation hors ligne. Utilisez cette commande:

-- 1) free up all USER databases
USE master; GO
-- 2) restore access to all users:
ALTER DATABASE billing SET MULTI_USER WITH ROLLBACK IMMEDIATE;GO
-- 3) put the db back online:
ALTER DATABASE billing SET ONLINE;

terminé!

gim
la source
1
  1. faire une copie de votre base de données avec l'option "copier la base de données" avec un nom différent
  2. sauvegarder une nouvelle base de données copiée
  3. restaurez-le!
sedras
la source