SQL Server 2012 Ripristina il backup sul nuovo nome DB


16

Mi sembra di ricordare che, nel 2008, è stato possibile ripristinare un backup in una nuova copia di un DB, modificando il nome nel campo "Database di destinazione" dalla procedura guidata di ripristino. Creerebbe un DB nuovo di zecca, che è una copia del DB originale ripristinato nel momento desiderato. Per la vita di me non ho capito come fare SQL 2012 per farlo.

Ora capisco (grazie ad Aaron Bertrand) che questo non è cambiato davvero, e che il 2012 in realtà mi sta rendendo più ovvio che questa strategia è stata una cattiva idea in primo luogo!

Quindi, quello che devo fare è questo: creare un nuovo DB, "MyDB_Copy", da un DB esistente, "MyDB", usando i suoi file di backup. Abbiamo backup completi notturni (.bak) e TLogs ogni 15 minuti (.trn). Non voglio che l'attuale "MyDB" venga influenzato / toccato, perché è "live".

Dopo che MyDB_Copy è stato creato dal file principale di backup completo, ho bisogno di ripristinare alcune dozzine di backup TLog per arrivare a un certo punto nel tempo.


Puoi tu o Aaron condividere perché questa è una cattiva idea? o link al problema in cui è spiegato?
Thronk,

Credo che si tratti di nomi logici che non vengono cambiati, e quindi si finirebbero con due DB nello stesso posto che hanno nomi e file fisici diversi ma nomi logici identici, che causa problemi ai piani di manutenzione che dipendono su nomi logici. Nella mia situazione, quei DB ripristinati / copiati non sono mai durati più di qualche ora, ma vedo perché non è una buona pratica.
NateJ,

Risposte:


18

Basato vagamente sull'Esempio E nella documentazione , aprire una nuova finestra di query ed eseguire:

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

I nomi logici non sono importanti; i nomi dei file fisici sono. Questo fa ipotesi sui nomi dei tuoi file logici e che ce ne sono solo due; corri EXEC MyDB..sp_helpfile;per essere sicuro.

Se è necessario ripristinare i registri, passare RECOVERYa NORECOVERY:

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

Quindi è possibile emettere una serie di:

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

E sull'ultimo:

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

O se hai solo bisogno di parte di un log up fino a un certo momento (suppongo che tu abbia controllato dove sono gli LSN e i tempi in modo da sapere esattamente quali file ti servono):

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

Il modo in cui hai detto funzionava nelle versioni precedenti non avrebbe mai funzionato, a meno che il backup non provenisse da un altro server. Di default proverà a mettere i nuovi file mdf e ldf nello stesso posto, e questo non è possibile.


Ok, questo mi ha aiutato un po '. Ora ho bisogno di ripristinare alcune dozzine di file TRN per riportare il DB nello stato in cui era venerdì sera (i backup completi avvengono solo ogni giorno; i backup TLog avvengono ogni 15 minuti). Usando il tuo esempio, ho ottenuto il DB creato dal file BAK principale, ma ottengo un nuovo errore quando provo un'istruzione simile per ripristinare il registro. Dice "Impossibile ripristinare il registro o il backup differenziale perché nessun file è pronto per il rollforward".
NateJ,

@NateJ allora dovresti fare una domanda completa. :-)
Aaron Bertrand

1
Fantastico, lo sto scrivendo adesso! Grazie mille per il vostro aiuto. Mi dispiace che ho ottenuto alcuni rappresentanti negativi su StackOverflow ma se funziona, ne varrà la pena.
NateJ,

1
@NateJ Dovresti riavere quel rappresentante perché la domanda è stata cancellata quando è stata migrata (o alla fine lo sarà). Non sono stato io ma sospetto sia stato a causa della tua accusa che ha funzionato in una versione ma non ora, quando questo è chiaramente solo un fraintendimento di ciò che stava accadendo ...
Aaron Bertrand

Oh ho capito. Qualcosa del genere funzionava: forse non ricordo esattamente cosa / come, ma concordo sul fatto che è stato frainteso. Il mio collega giura su e giù, ma ora che ci penso, non ha senso. Dobbiamo aver fatto qualcosa di diverso, usando la GUI. Sento che usare i comandi / script come hai suggerito sarà migliore per noi. :) I registri si stanno ripristinando ora, con successo finora!
NateJ,

0

Tutto quello che devi fare per ripristinare più volte lo stesso database è cambiare il nome dei file del disco per quel database. Ovviamente è necessario assegnare al database un nome diverso rispetto a qualsiasi altro database in SQL Server. In SSMS dopo aver selezionato il file .bak per il ripristino e digitato il nome per il database, fai clic su "File" nella sezione "Seleziona una pagina" a sinistra e modifica semplicemente il nome dei file del disco.

Saluti Doug

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.