2011-12-07 21 views
37

C'è un modo, dato un file .bak di SQL Server 2008, per ripristinare un database dal file .bak senza il log delle transazioni?Ripristina DB SQL Server senza registro transazioni

Il motivo per cui sto chiedendo è che le dimensioni del file di registro delle transazioni di questo database sono enormi, superando lo spazio sul disco che ho prontamente disponibile. Non ho alcun interesse nel registro delle transazioni e nessun interesse per le transazioni non completate, quindi normalmente ridimensionerei il registro a zero una volta ripristinato il database. Ma questo non aiuta quando non ho abbastanza spazio sul disco per creare il registro in primo luogo. Quello di cui ho bisogno è un modo per dire a SQL Server di ripristinare solo i dati dal file .bak, non dal log delle transazioni. C'è un modo per farlo?

Si noti che non ho alcun controllo sulla generazione del file .bak - proviene da una fonte esterna. Quindi ridurre il registro delle transazioni prima di generare il file .bak non è un'opzione.

+1

+1, buona domanda! –

+0

Come nota a margine, anche il tempo di ripristino è un problema, soprattutto se si stanno facendo test di sviluppo e manuali su database e si scambiano periodicamente – Savage

risposta

2

Questa è davvero una domanda per i siti ServerFault o DBA, ma la risposta breve è no, è possibile ripristinare solo il file .bak completo (lasciando da parte scenari "esotici" come filegroup o ripristini frammentari). Non si dice cosa significhi "enorme", ma lo spazio su disco è economico; se l'aggiunta di più non è un'opzione, è necessario trovare un modo alternativo per ottenere i dati dalla fonte esterna.

+0

OK abbastanza equo. – PhantomDrummer

6

No, è necessario il registro delle transazioni.

Opzione 1:

Un'opzione potrebbe essere quella di ripristinare a una macchina che si ha abbastanza spazio sul. Quindi, sulla copia ripristinata, modificare la registrazione su bulk loggato o semplice, ridurre i registri, eseguire un'altra operazione di backup su questa nuova copia e quindi utilizzarla per il ripristino sul computer di destinazione con il log delle transazioni ora molto più piccolo.

Opzione 2:

In alternativa, forse il contatto alla fonte esterna potrebbe ridursi il log delle transazioni prima di inviarlo a voi (questo potrebbe non funzionare se il registro è di grandi dimensioni a causa di un sacco di grandi transazioni) .

Docs sul comando per ridurre il file di registro sono available here.

+0

Grazie. Non posso fare nulla per il file .bak, quindi immagino che sarà il caso di trovare una macchina che abbia abbastanza spazio sul disco. – PhantomDrummer

+5

Fuori interesse, qualcuno sa * perché * MS non ha fornito un'opzione per ripristinare solo i dati, non il registro delle transazioni? Suppongo che l'unica ragione per cui il TL nel db ripristinato sia così grande è che il file .bak deve contenere un flag che dice 'si prega di riservare così tanto spazio per il TL quando si ripristina', e non sembra esserci alcun motivo logico per cui il processo di ripristino non dovrebbe essere in grado, in linea di principio, di ignorare una tale bandiera. Quindi sono incuriosito perché questa opzione non è presente. Per il mio particolare file .bak, lo spazio richiesto per il TL è di 50 GB, sebbene questo sia invariabilmente quasi interamente spazio vuoto. – PhantomDrummer

2

Questo potrebbe non funzionare poiché non si ha il controllo sulla generazione del file .bak, ma se si riuscisse a convincere la propria origine a separare il database e quindi a inviare una copia del file .mdf direttamente, è possibile allegare il .mdf e il tuo server creerebbero automaticamente un nuovo file di registro delle transazioni vuoto.

Vedere sp_detach_db e sp_attach_db (o CREATE DATABASE database_name FOR ATTACH in base alla versione del server sql).

8

Il registro delle transazioni è parte integrante del backup. Non è possibile indicare a SQL Server di ignorare il registro delle transazioni, in quanto non esiste alcun modo per dire di ripristinare e ridurre il file di registro delle transazioni contemporaneamente. Tuttavia, è possibile dare un'occhiata a DBA post per hackerare il processo, anche se non è raccomandato per tutto

In alternativa, è possibile provare alcuni strumenti di terze parti per il ripristino, in particolare il processo di ripristino virtuale che consente di risparmiare molto spazio e tempo. Scopri ApexSQL Restore, Ripristino virtuale RedGate, Database virtuale Idera.

Disclaimer: io lavoro per ApexSQL come ingegnere di supporto

0

So che questo è un vecchio filo ora, ma mi sono imbattuto mentre stavo avendo problemi transazionale registro di corruzione, ecco come ho ottenuto intorno ad esso, senza qualsiasi perdita di dati (! ho avuto il tempo morto però)

Ecco quello che ho fatto: -

Arrestare il servizio di istanza del server SQL fare una copia del database interessato mdf di file e file lDF (se hai un file .ndf, copia anche quello!) - Solo per sii sicuro, puoi sempre rimetterli indietro se non funziona per te.

riavviare il servizio.

Accedere a sql management studio e modificare la modalità database in modo semplice, quindi eseguire un backup completo.

Cambiare di nuovo il tipo di database e di nuovo eseguire un backup completo, quindi eseguire un backup del log delle transazioni.

Scollegare il database.

Fare clic con il pulsante destro del mouse sui database e fare clic su Ripristina, selezionare il nome del database dall'elenco a discesa, selezionare il backup del database completo successivo creato (non quello prelevato dalla modalità semplice) e selezionare anche il backup del registro delle transazioni.

Fare clic su Ripristina e dovrebbe ripristinare tutto senza alcun danneggiamento nei file di registro.

Questo ha funzionato senza errori e i miei backup hanno funzionato correttamente in seguito e non c'erano più errori di registro transazionale.

Problemi correlati