web-dev-qa-db-fra.com

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

J'ai une sauvegarde de Database1 d'il y a une semaine. La sauvegarde est effectuée chaque semaine dans le planificateur et je reçois un fichier .bak. Maintenant, je veux manipuler certaines données et 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 ordinateur avec un nom différent et l'étape recommandée consiste à renommer la base de données d'origine, mais je suis hors de cette option car je suis dans le serveur de production et je ne peux pas vraiment le faire.

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

merci.

ps: la deuxième réponse du lien ci-dessus semblait prometteuse, mais elle se terminait par une erreur:

Restore Filelist se termine anormalement

209
LocustHorde

Vous pouvez créer une nouvelle base de données, puis utiliser l’Assistant de restauration pour activer l’option Remplacer ou;

Voir le contenu;

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

notez les noms logiques des fichiers .mdf et .ldf à partir 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 de données MyTempCopy avec le contenu de your.bak.

Exemple (restaure une sauvegarde d'une base de données appelée "ligne de crédit" sur "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).
285
Alex K.

SQL Server 2008 R2:

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

  1. Dans la barre d'outils, cliquez sur le bouton Moniteur d'activité.
  2. Cliquez sur les processus. Filtrer en fonction de la base de données à restaurer. Tuez tous les processus en cours en cliquant avec le bouton droit de la souris sur chaque processus et en sélectionnant "kill process".
  3. Cliquez avec le bouton droit sur la base de données que vous souhaitez restaurer, puis sélectionnez Tâches -> Restaurer -> À partir de la base de données.
  4. Sélectionnez le bouton radio "De l'appareil:".
  5. Sélectionnez ... et choisissez le fichier de sauvegarde de l'autre base de données que vous souhaitez restaurer.
  6. Sélectionnez le jeu de sauvegarde que vous souhaitez restaurer en cochant la case située à gauche du jeu de sauvegarde.
  7. Sélectionnez les options".
  8. Sélectionnez Remplacer la base de données existante (WITH REPLACE)
  9. Important: Modifiez le nom du fichier de données "Restaurer en tant que" par le nom de fichier de la base de données existante que vous souhaitez écraser ou donnez-lui simplement un nouveau nom.
  10. Faites la même chose avec le nom du fichier journal.
  11. Vérifiez à partir de l'écran du moniteur d'activité qu'aucun nouveau processus n'a été généré. Si c'était le cas, tuez-les.
  12. Cliquez sur OK.
64
Daniel Byrne

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

Note Les étapes 4 et 7 sont importantes à définir pour 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 ne contient que les bases de données sauvegardées selon l’historique de sauvegarde msdb.

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

    • Device

      • 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 dans la zone Support de sauvegarde, cliquez sur Ajouter. Une fois que vous avez ajouté les périphériques souhaités à la 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.

        Note Cette liste n'est disponible que si Périphérique est sélectionné. Seules les bases de données contenant des sauvegardes sur le périphérique sélectionné seront disponibles.

  4. Dans la section Destination, la zone Base de données est automatiquement renseignée avec le nom de la base de données à restaurer. Pour changer 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 comme À la dernière sauvegarde effectuée ou cliquez sur Chronologie pour accéder à la Sauvegarde chronologique boîte de dialogue pour sélectionner manuellement un point dans le temps pour arrêter l'action de récupération.
  6. Dans les jeux de sauvegarde à restaurer grille, 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 cette dernière 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 un dossier. Indiquez un nouvel emplacement pour dossier de fichiers de données et dossier de fichiers de journalisation. Vous pouvez également conserver les mêmes dossiers et renommer la base de données et les noms de fichier journal.
40
Rots

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

Vous pouvez utiliser restauration ApexSQL - un outil SQL Server qui attache de manière native et native. Les sauvegardes de base de données SQL compressées et les sauvegardes du journal des transactions en tant que bases de données actives , 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 de journal des transactions.

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

Disclaimer: Je travaille en tant qu'ingénieur support produit chez ApexSQL

34
Ivan Stankovic

Voici ce que j'ai concocté à partir de divers articles pour copier une base de données à l'aide de la sauvegarde et de la restauration, avec déplacement pour corriger l'emplacement physique et sql supplémentaire pour corriger 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);
7
Nathan Niesen

C'est en fait un peu plus simple que de restaurer sur le même serveur. En gros, il vous suffit de parcourir 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

D'autant plus qu'il s'agit d'une restauration hors production, vous pouvez l'essayer simplement sans trop vous soucier des détails. Il suffit de placer vos fichiers SQL où vous le souhaitez sur votre nouveau serveur et de lui attribuer le nom de votre choix.

3
IAmTimCorey

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
2
Konstantin Chernov
  • 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. (utiliser .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 (identique à cette image). Ça a marché.

enter image description here

1
Nguyen Duc Hai

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 nouvelles versions fonctionneront de la même manière.

Tout d’abord, vous n’avez pas besoin de déconnecter votre base de données originale. Mais pour des raisons de sécurité, j'aime bien. Dans mon exemple, je vais monter un clone de ma base de données "facturation" qui s'appellera "billingclone".

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

2) Par sécurité, j’ai pris l’original original comme suit:

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

**IMPORTANT! Laissez 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!

Maintenant, entrez 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 Bases de données dans l'Explorateur d'objets, choisissez "Restaurer la base de données".

4) entrez le nouveau nom dans le champ "To Database". C'EST À DIRE. billingclone

5) Dans Source pour restauration, cliquez sur "À partir du périphérique", puis sur le bouton ... naviguer.

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

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

8) ensuite sélectionnez la page OPTIONS dans le coin supérieur LH

9) Modifiez maintenant les noms de fichier de la base de données dans RESTORE AS. Faites cela pour la base de données et le journal. C'EST À DIRE. billingclone.mdf et billingclone_log.ldf

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

11) Cliquez sur Actualiser dans votre explorateur d’objets pour afficher votre nouvelle base de données.

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 passer 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é!

1
gim