SQL Server 2012 Restaurar copia de seguridad a nuevo nombre de base

16

Me parece recordar que, en 2008, podría restaurar una copia de seguridad a una nueva copia de una base de datos, cambiando el nombre en el campo "Base de datos de destino" desde el asistente de restauración. Crearía una nueva base de datos, que es una copia de la base de datos original restaurada en el momento que deseaba. Por mi vida no he descubierto cómo hacer que SQL 2012 haga esto.

Ahora, entiendo (gracias a Aaron Bertrand) que esto realmente no cambió, y que 2012 en realidad me está haciendo más obvio que esta estrategia fue una mala idea en primer lugar.

Entonces, lo que necesito hacer es esto: crear una nueva base de datos, 'MyDB_Copy', a partir de una base de datos existente, 'MyDB', utilizando sus archivos de respaldo. Tenemos copias de seguridad completas nocturnas (.bak) y TLogs cada 15 minutos (.trn). No quiero que el 'MyDB' existente se vea afectado / tocado en absoluto, porque es "en vivo".

Después de crear MyDB_Copy a partir del archivo principal de copia de seguridad completa, necesito restaurar algunas docenas de copias de seguridad de TLog para llegar a un cierto punto en el tiempo.

NateJ
fuente
¿Pueden usted o Aaron compartir por qué es una mala idea? o enlace al problema donde se explica?
Thronk
Creo que es algo acerca de que los nombres lógicos no se cambian, y por lo tanto, terminaría con dos bases de datos en el mismo lugar que tienen nombres y archivos físicos diferentes pero nombres lógicos idénticos, lo que causa problemas para los planes de mantenimiento que dependen en nombres lógicos. En mi situación, esos DB restaurados / copiados nunca duraron más de unas pocas horas, pero puedo ver por qué no es una gran práctica.
NateJ

Respuestas:

18

Basado libremente en el Ejemplo E en la documentación , abra una nueva ventana de consulta y ejecute:

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';
-------------------------------------------^^^^^

Los nombres lógicos no son importantes; Los nombres de los archivos físicos son. Esto hace suposiciones sobre los nombres de sus archivos lógicos y que solo hay dos; corre EXEC MyDB..sp_helpfile;para estar seguro.

Si necesita restaurar registros, cambie RECOVERYa NORECOVERY:

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

Entonces puede emitir una serie de:

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

Y en el último:

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

O si solo necesita parte de un registro hasta cierto punto (supongo que ha verificado dónde están los LSN y los tiempos para saber exactamente qué archivos necesita):

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

La forma en que dijo que funcionó en versiones anteriores nunca hubiera funcionado, a menos que la copia de seguridad provenga de un servidor diferente. Por defecto, intentará colocar los nuevos archivos mdf y ldf exactamente en el mismo lugar, y esto no es posible.

Aaron Bertrand
fuente
De acuerdo, eso ayudó un poco. Ahora necesito restaurar unas pocas docenas de archivos TRN para que la base de datos vuelva al estado en que estaba el viernes por la noche (las copias de seguridad completas solo se realizan a diario; las copias de seguridad de TLog se realizan cada 15 minutos). Usando su muestra, obtuve la base de datos creada a partir del archivo BAK principal, pero recibo un nuevo error al intentar una declaración similar para restaurar el registro. Dice "el registro o la copia de seguridad diferencial no se pueden restaurar porque no hay archivos listos para avanzar".
NateJ
@NateJ deberías hacer una pregunta completa entonces. :-)
Aaron Bertrand
1
¡Impresionante, lo estoy escribiendo ahora! Muchas gracias por su ayuda. Estoy triste porque obtuve algunas repeticiones negativas en StackOverflow, pero si esto funciona, valdrá la pena.
NateJ
1
@NateJ Debería recuperar ese representante porque la pregunta se eliminó cuando se migró (o se eliminará eventualmente). No fui yo, pero sospecho que fue debido a su acusación de que esto funcionó en una versión, pero no lo hizo ahora, cuando eso es claramente un malentendido de lo que estaba sucediendo ...
Aaron Bertrand
Oh te tengo Algo así solía funcionar: puede que no esté recordando exactamente qué / cómo, pero estoy de acuerdo en que fue mal entendido. Mi colega jura de arriba abajo, pero ahora que lo pienso, no tiene sentido. Debemos haber hecho algo diferente, usando la GUI. Siento que usar los comandos / scripts como usted sugirió será mejor para nosotros. :) Los registros se están restaurando ahora, hasta ahora con éxito.
NateJ
0

Todo lo que necesita hacer para restaurar la misma base de datos varias veces es cambiar el nombre de los archivos de disco para esa base de datos. Obviamente, también debe darle a la base de datos un nombre diferente a cualquier otra base de datos en SQL Server. En SSMS después de seleccionar el archivo .bak para restaurar y escribir el nombre de la base de datos, haga clic en 'Archivos' en la sección "Seleccionar una página" a la izquierda y simplemente cambie el nombre de los archivos del disco.

Saludos Doug

Doug
fuente