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
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).
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:
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
- 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.
- 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.
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.
- 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.
- 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.
- 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.
- 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.
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
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);
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:
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.
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
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é!