web-dev-qa-db-fra.com

Sauvegarde de restauration de SQL Server 2012 vers un nouveau nom de base de données

Je semble me souvenir qu'en 2008, vous pouviez restaurer une sauvegarde sur une nouvelle copie d'une base de données, en changeant le nom dans le champ "Destination Database" de l'assistant de restauration. Cela créerait une toute nouvelle base de données, qui est une copie de la base de données d'origine restaurée au moment voulu. Pour ma vie, je n'ai pas compris comment faire faire à SQL 2012 cela.

Maintenant, je comprends (grâce à Aaron Bertrand) que cela n'a pas vraiment changé, et que 2012 me rend plus évident que cette stratégie était une mauvaise idée au départ!

Donc, ce que je dois faire est le suivant: Créez une nouvelle base de données, 'MyDB_Copy', à partir d'une base de données existante, 'MyDB', en utilisant ses fichiers de sauvegarde. Nous avons des sauvegardes complètes nocturnes (.bak) et des TLogs toutes les 15 minutes (.trn). Je ne veux pas que le "MyDB" existant soit affecté/touché du tout, car il est "en direct".

Après la création de MyDB_Copy à partir du fichier principal de sauvegarde complète, je dois ensuite restaurer quelques dizaines de sauvegardes TLog pour le faire arriver à un certain moment.

16
NateJ

Basé vaguement sur Exemple E dans la documentation , ouvrez une nouvelle fenêtre de requête et exécutez:

RESTORE DATABASE MyDB_Copy FROM DISK = 'C:\blahblah\MyDB.bak'
  WITH REPLACE, RECOVERY,
  MOVE 'MyDB' TO 'C:\blahblah\Data\MyDB_Copy.mdf',
---------------------------------------^^^^^
  MOVE 'MyDB_log' TO 'C:\blahblah\Data\MyDB_Copy.ldf';
-------------------------------------------^^^^^

Les noms logiques ne sont pas importants; les noms de fichiers physiques sont. Cela fait des hypothèses sur vos noms de fichiers logiques et qu'il n'y en a que deux; courir EXEC MyDB..sp_helpfile; être sûr.

Si vous devez restaurer des journaux, remplacez RECOVERY par NORECOVERY:

  WITH REPLACE, NORECOVERY,
----------------^^

Ensuite, vous pouvez émettre une série de:

RESTORE LOG MyDB_Copy FROM DISK = 'C:\blahblah\file1.trn' WITH NORECOVERY;

Et sur le tout dernier:

RESTORE LOG MyDB_Copy FROM DISK = 'C:\blahblah\fileN.trn' WITH RECOVERY;

Ou si vous n'avez besoin que d'une partie d'un journal jusqu'à un moment donné (je suppose que vous avez vérifié où se trouvent les LSN et les heures afin de savoir exactement de quels fichiers vous avez besoin):

RESTORE LOG MyDB_Copy FROM DISK = 'C:\blahblah\fileN.trn' WITH 
  STOPAT = '<some point in time Friday>', RECOVERY;

La façon dont vous avez dit qu'elle fonctionnait dans les versions précédentes n'aurait jamais fonctionné, à moins que la sauvegarde ne provienne d'un autre serveur. Par défaut, il essaiera de placer les nouveaux fichiers mdf et ldf exactement au même endroit, ce qui n'est pas possible.

18
Aaron Bertrand

Tout ce que vous devez faire pour restaurer plusieurs fois la même base de données est de changer le nom des fichiers disque de cette base de données. De toute évidence, vous devez également donner à la base de données un nom différent de toute autre base de données dans SQL Server. Dans SSMS après avoir sélectionné le fichier .bak à restaurer et tapé le nom de la base de données, vous cliquez ensuite sur "Fichiers" dans la section "Sélectionner une page" à gauche et modifiez simplement le nom des fichiers disque.

A bientôt Doug

0
Doug