Come si cancella il registro delle transazioni di SQL Server?


577

Non sono un esperto di SQL e mi viene in mente il fatto ogni volta che devo fare qualcosa oltre le basi. Ho un database di test che non è di grandi dimensioni, ma il registro delle transazioni lo è sicuramente. Come posso cancellare il registro delle transazioni?



3
Dovrebbe esserci un comando in Managment Studio: "Fai clic per ridurre il registro" e il gioco è fatto.
frenchie,

Risposte:


750

La riduzione di un file di registro dovrebbe essere riservata agli scenari in cui si è verificata una crescita imprevista che non si prevede si ripeta. Se il file di registro tornerà alla stessa dimensione, non si ottiene molto restringendolo temporaneamente. Ora, a seconda degli obiettivi di recupero del database, queste sono le azioni da intraprendere.

Innanzitutto, esegui un backup completo

Non apportare mai modifiche al database senza assicurarsi di poterlo ripristinare in caso di problemi.

Se ti interessa il recupero temporizzato

(E per ripristino temporizzato, intendo che ti interessa poter ripristinare qualsiasi cosa diversa da un backup completo o differenziale.)

Presumibilmente il tuo database è in FULLmodalità di recupero. In caso contrario, assicurati che sia:

ALTER DATABASE testdb SET RECOVERY FULL;

Anche se si eseguono backup completi regolari, il file di registro aumenterà e crescerà fino a quando non si esegue un backup del registro - questo è per la propria protezione, per non consumare inutilmente lo spazio su disco. Dovresti eseguire questi backup dei log abbastanza frequentemente, in base ai tuoi obiettivi di recupero. Ad esempio, se si dispone di una regola aziendale in base alla quale è possibile permettersi di non perdere più di 15 minuti di dati in caso di emergenza, è necessario disporre di un processo che esegua il backup del registro ogni 15 minuti. Ecco uno script che genererà nomi di file con data e ora in base all'ora corrente (ma puoi anche farlo con piani di manutenzione, ecc., Non scegliere alcuna delle opzioni di riduzione nei piani di manutenzione, sono orribili).

DECLARE @path NVARCHAR(255) = N'\\backup_share\log\testdb_' 
  + CONVERT(CHAR(8), GETDATE(), 112) + '_'
  + REPLACE(CONVERT(CHAR(8), GETDATE(), 108),':','')
  + '.trn';

BACKUP LOG foo TO DISK = @path WITH INIT, COMPRESSION;

Si noti che \\backup_share\dovrebbe essere su un computer diverso che rappresenta un dispositivo di archiviazione sottostante diverso. Il backup di questi sullo stesso computer (o su un computer diverso che utilizza gli stessi dischi sottostanti o una macchina virtuale diversa che si trova sullo stesso host fisico) non ti aiuta davvero, poiché se il computer esplode, hai perso il database e i suoi backup. A seconda dell'infrastruttura di rete potrebbe essere più sensato eseguire il backup in locale e trasferirli in una posizione diversa dietro le quinte; in entrambi i casi, si desidera eliminarli dal computer di database primario il più rapidamente possibile.

Ora, una volta eseguiti regolarmente i backup del registro, dovrebbe essere ragionevole ridurre il file di registro a qualcosa di più ragionevole di qualsiasi cosa sia stata fatta saltare in aria. Ciò non significa eseguire SHRINKFILEripetutamente fino a quando il file di registro non è 1 MB - anche se si esegue il backup del registro frequentemente, deve comunque contenere la somma di tutte le transazioni simultanee che possono verificarsi. Gli eventi di crescita automatica dei file di registro sono costosi, poiché SQL Server deve azzerare i file (diversamente dai file di dati quando l'inizializzazione dei file è abilitata) e le transazioni degli utenti devono attendere mentre ciò accade. Volete eseguire questa routine di crescita, riduzione, riduzione, il meno possibile e certamente non volete che i vostri utenti paghino.

Si noti che potrebbe essere necessario eseguire il backup del registro due volte prima che sia possibile una riduzione (grazie Robert).

Quindi, devi trovare una dimensione pratica per il tuo file di registro. Nessuno qui può dirti di cosa si tratta senza sapere molto di più sul tuo sistema, ma se hai spesso ridotto il file di registro ed è cresciuto di nuovo, una buona filigrana è probabilmente del 10-50% più alta di quella che è stata . Supponiamo che arrivi a 200 MB e desideri che qualsiasi evento di crescita automatica successiva sia di 50 MB, quindi puoi regolare le dimensioni del file di registro in questo modo:

USE [master];
GO
ALTER DATABASE Test1 
  MODIFY FILE
  (NAME = yourdb_log, SIZE = 200MB, FILEGROWTH = 50MB);
GO

Se il file di registro è attualmente> 200 MB, potrebbe essere necessario eseguire prima questo:

USE yourdb;
GO
DBCC SHRINKFILE(yourdb_log, 200);
GO

Se non ti interessa il recupero temporizzato

Se si tratta di un database di prova e non ti interessa il ripristino temporizzato, devi assicurarti che il database sia in SIMPLEmodalità di ripristino.

ALTER DATABASE testdb SET RECOVERY SIMPLE;

Mettendo il database in SIMPLEmodalità di ripristino si accerterà che SQL Server riutilizzi parti del file di registro (essenzialmente eliminando gradualmente le transazioni inattive) invece di crescere per tenere un registro di tutte le transazioni (come FULLfa il recupero fino a quando non si esegue il backup del registro). CHECKPOINTgli eventi aiuteranno a controllare il registro e ad assicurarsi che non sia necessario che cresca a meno che non si generi molta attività t-log tra CHECKPOINTi messaggi.

Successivamente, dovresti assicurarti assolutamente che questa crescita del registro sia stata davvero dovuta a un evento anomalo (diciamo, una pulizia annuale della primavera o alla ricostruzione dei tuoi più grandi indici) e non al normale utilizzo quotidiano. Se riduci il file di registro a dimensioni ridicolmente ridotte e SQL Server deve semplicemente ingrandirlo nuovamente per soddisfare la tua normale attività, che cosa hai guadagnato? Sei riuscito a sfruttare lo spazio su disco che hai liberato solo temporaneamente? Se hai bisogno di una soluzione immediata, puoi eseguire quanto segue:

USE yourdb;
GO
CHECKPOINT;
GO
CHECKPOINT; -- run twice to ensure file wrap-around
GO
DBCC SHRINKFILE(yourdb_log, 200); -- unit is set in MBs
GO

In caso contrario, impostare una dimensione e un tasso di crescita adeguati. Come nell'esempio nel caso del recupero temporizzato, è possibile utilizzare lo stesso codice e la stessa logica per determinare quale dimensione del file è appropriata e impostare parametri di crescita automatica ragionevoli.

Alcune cose che non vuoi fare

  • Eseguire il backup del registro con l' TRUNCATE_ONLYopzione e quindiSHRINKFILE . Per uno, questa TRUNCATE_ONLYopzione è stata deprecata e non è più disponibile nelle versioni correnti di SQL Server. In secondo luogo, se si è nel FULLmodello di recupero, ciò distruggerà la catena di log e richiederà un nuovo backup completo.

  • Scollegare il database, eliminare il file di registro e ricollegarlo . Non posso sottolineare quanto possa essere pericoloso. Il database potrebbe non essere ripristinato, potrebbe essere considerato sospetto, potrebbe essere necessario ripristinare un backup (se ne hai uno), ecc. Ecc.

  • Utilizzare l'opzione "riduci database" . DBCC SHRINKDATABASEe l'opzione del piano di manutenzione per fare lo stesso è una cattiva idea, soprattutto se è necessario solo risolvere un problema di registro. Scegliere come target il file che si desidera regolare e modificarlo in modo indipendente, utilizzando DBCC SHRINKFILEo ALTER DATABASE ... MODIFY FILE(esempi sopra).

  • Riduci il file di registro a 1 MB . Questo sembra allettante perché, ehi, SQL Server mi lascerà farlo in determinati scenari e guarderà tutto lo spazio che libera! A meno che il tuo database non sia di sola lettura (ed è, dovresti contrassegnarlo come tale usando ALTER DATABASE), questo porterà assolutamente a molti eventi di crescita non necessari, poiché il registro deve adattarsi alle transazioni correnti indipendentemente dal modello di recupero. Qual è il punto di liberare temporaneamente quello spazio, così SQL Server può riprenderlo lentamente e dolorosamente?

  • Crea un secondo file di registro . Ciò fornirà un sollievo temporaneo all'unità che ha riempito il disco, ma è come provare a riparare un polmone perforato con un cerotto. È necessario gestire direttamente il file di registro problematico invece di aggiungere semplicemente un altro potenziale problema. Oltre a reindirizzare alcune attività del registro delle transazioni su un'unità diversa, un secondo file di registro non fa davvero nulla per te (a differenza di un secondo file di dati), poiché solo uno dei file può mai essere utilizzato alla volta. Paul Randal spiega anche perché più file di registro possono morderti in seguito .

Sii proattivo

Invece di ridurre il file di registro in una piccola quantità e lasciarlo crescere automaticamente da solo a una piccola velocità, impostalo su una dimensione ragionevolmente grande (uno che soddisferà la somma del tuo più grande insieme di transazioni simultanee) e imposta un ragionevole aumento automatico impostazione come fallback, in modo che non debba crescere più volte per soddisfare le singole transazioni e che sarà relativamente raro che debba mai crescere durante le normali operazioni aziendali.

Le impostazioni peggiori possibili qui sono una crescita di 1 MB o una crescita del 10%. Abbastanza divertente, queste sono le impostazioni predefinite per SQL Server (di cui mi sono lamentato e ho chiesto modifiche senza risultati ) - 1 MB per i file di dati e il 10% per i file di registro. Il primo è troppo piccolo al giorno d'oggi e il secondo porta a eventi sempre più lunghi ogni volta (diciamo, il tuo file di registro è di 500 MB, la prima crescita è di 50 MB, la prossima crescita è di 55 MB, la crescita successiva è di 60,5 MB , ecc. ecc. - e su I / O lento, credimi, noterai davvero questa curva).

Ulteriori letture

Per favore, non fermarti qui; mentre molti dei consigli che vedi là fuori sulla riduzione dei file di registro sono intrinsecamente cattivi e persino potenzialmente disastrosi, ci sono alcune persone che si preoccupano più dell'integrità dei dati che della liberazione dello spazio su disco.

Un post sul blog che ho scritto nel 2009, quando ho visto spuntare alcuni post "ecco come ridurre il file di registro" .

Un post sul blog scritto da Brent Ozar quattro anni fa, indicando più risorse, in risposta a un articolo della rivista SQL Server che non avrebbe dovuto essere pubblicato .

Un post sul blog di Paul Randal che spiega perché la manutenzione di t-log è importante e perché non dovresti nemmeno ridurre i tuoi file di dati .

Mike Walsh ha un'ottima risposta anche su alcuni di questi aspetti, inclusi i motivi per cui potresti non essere in grado di ridurre immediatamente il tuo file di registro .


5
Il recupero temporizzato non è l'unico motivo per utilizzare il modello di recupero completo. Il motivo principale è prevenire la perdita di dati. Il potenziale di perdita di dati è la lunghezza tra i backup. Se si esegue solo un backup giornaliero, il potenziale di perdita dei dati è di 24 ore. Se si aggiungono backup dei log ogni mezz'ora, il potenziale di perdita di dati diventa 30 minuti. Inoltre, sono necessari backup dei log per eseguire qualsiasi tipo di ripristino frammentario (ad esempio per ripristinare dalla corruzione).
Robert L Davis,

9
A parte questo, questa è la risposta più completa e corretta fornita in questa pagina.
Robert L Davis,

11
Vorrei anche aggiungere che la cancellazione del registro viene eseguita eseguendo il backup del registro (in ripristino completo o con registrazione di massa) o un checkpoint (in ripristino semplice). Tuttavia, se ti trovi in ​​una situazione in cui è necessario ridurre il file di registro, ciò non è sufficiente. È necessario far tornare all'inizio del file di registro il VLF attualmente attivo. È possibile forzare questo in SQL 2008 e versioni successive eseguendo due backup dei log o checkpoint back-to-back. Il primo lo cancella e il secondo lo riavvia all'inizio del file.
Robert L Davis,

2
@Doug_Ivison perché in qualsiasi momento è possibile eliminare i record di registro. Quale sarebbe il punto di consentire il backup di un registro che è incompleto? Nel semplice ripristino, il registro viene utilizzato solo per consentire il rollback delle transazioni. Una volta che una transazione è stata impegnata o ripristinata, il secondo successivo potrebbe essere cancellata dal registro.
Aaron Bertrand,

3
@zinczinc Ok, grazie per il tuo feedback. Il problema che vedo nel mettere la risposta prima e la spiegazione dopo è che non leggeranno mai le parti importanti. La lezione con cui annego il lettore è in realtà molto più importante della risposta alla fine e IMHO lo sfondo che fornisco è piuttosto importante per fare queste scelte. Ma hey, se vuoi inviare una risposta di una riga perché pensi che sia meglio per l'OP, sentiti libero di usare quella parte della mia risposta per farne una migliore da cui tutti possiamo imparare.
Aaron Bertrand,

200
-- DON'T FORGET TO BACKUP THE DB :D (Check [here][1]) 


USE AdventureWorks2008R2;
GO
-- Truncate the log by changing the database recovery model to SIMPLE.
ALTER DATABASE AdventureWorks2008R2
SET RECOVERY SIMPLE;
GO
-- Shrink the truncated log file to 1 MB.
DBCC SHRINKFILE (AdventureWorks2008R2_Log, 1);
GO
-- Reset the database recovery model.
ALTER DATABASE AdventureWorks2008R2
SET RECOVERY FULL;
GO

Da: DBCC SHRINKFILE (Transact-SQL)

Potrebbe essere necessario eseguire prima il backup.


grazie Maimonide, è dai documenti, quindi direi che è il migliore: P soprattutto perché non è stato inventato da me :)
Rui Lima

1
dopo averlo fatto, le dimensioni del mio registro non sono cambiate un po '. ho fatto qualcosa di male?
chester89

1
Questo approccio imposta il tipo di recupero su "FULL", anche se il tipo di recupero era qualcos'altro prima
Vil

1
Ha funzionato come per magia! Si noti che il nome del file di registro è in realtà il suo nome logico (che può essere trovato in db-> proprietà-> file)
Bizhan

2
Includerei una clausola BACKUP DATABASE in questo script, quindi nessuno dimentica questa parte. Dico questo, perché alcuni anni fa ho ridotto un database in un disco in cui ha troppo poco spazio libero. Nel processo di riduzione, i file stavano diventando più grandi e veniva generato un errore di spazio esaurito. Risultato: ho perso il database. Fortunatamente era un database di log che aveva perso tolleranza.
Cesar,

185

NOTA BENE: si prega di leggere attentamente i commenti di seguito e presumo che abbiate già letto la risposta accettata. Come ho detto quasi 5 anni fa:

se qualcuno ha commenti da aggiungere per situazioni in cui questa NON è una soluzione adeguata o ottimale, si prega di commentare di seguito


  • Fare clic con il tasto destro sul nome del database.

  • Selezionare Attività → Riduci → Database

  • Quindi fare clic OK!

Di solito apro la directory di Windows Explorer contenente i file del database, quindi posso vedere immediatamente l'effetto.

In realtà sono stato abbastanza sorpreso che funzionasse! Normalmente ho usato DBCC prima, ma l'ho appena provato e non ha ridotto nulla, quindi ho provato la GUI (2005) e ha funzionato alla grande - liberando 17 GB in 10 secondi

In modalità di ripristino completo potrebbe non funzionare, quindi è necessario prima eseguire il backup del registro o passare a Ripristino semplice, quindi ridurre il file. [grazie @onupdatecascade per questo]

-

PS: apprezzo ciò che alcuni hanno commentato riguardo ai pericoli di questo, ma nel mio ambiente non ho avuto problemi a farlo da solo, soprattutto perché prima eseguo sempre un backup completo. Pertanto, prima di continuare, prendere in considerazione il proprio ambiente e in che modo ciò influisce sulla strategia di backup e sulla sicurezza del lavoro. Tutto quello che stavo facendo era indicare alle persone una funzionalità fornita da Microsoft!


50
In modalità di ripristino completo potrebbe non funzionare, quindi è necessario prima eseguire il backup del registro o passare a Ripristino semplice, quindi ridurre il file.
onupdatecascade,

7
@onupdatecascade - buona chiamata per il trucco di recupero completo. aveva un altro database con un registro enorme: passato a semplice, quindi ridurre il database e tornare al pieno. file di registro fino a 500kb!
Simon_Weaver,

26
Scusate. Ma questa risposta NON potrebbe semplicemente essere PIÙ sbagliata. Riducendo il database aumenterai il file di registro delle transazioni. QUALSIASI volta che si spostano i dati in un database di SQL Server, è necessario eseguire la registrazione, gonfiando il file di registro. Per ridurre la dimensione del registro, impostare il DB su Ripristino semplice OPPURE (se si ha cura / bisogno di dati registrati - e quasi sempre lo si fa in produzione) eseguire il backup del registro. Maggiori dettagli in questi video semplici e gratuiti: sqlservervideos.com/video/logging-essentials sqlservervideos.com/video/sql2528-log-files
Michael K. Campbell,

30
Caspita, complimenti per ottenere 1300+ rappresentanti per questa risposta, ma è davvero un consiglio terribile.
Aaron Bertrand,

8
Ecco un'esagerazione per dimostrare ciò che sta accadendo e perché la riduzione è assolutamente critica su base periodica: il record A viene modificato 1 milione di volte prima di eseguire un backup. Cosa c'è nel registro? 999.999 parti di dati che sono irrilevanti. Se i registri non vengono mai ridotti, non si saprà mai quale sia la vera spesa operativa del database. Inoltre, molto probabilmente stai registrando risorse preziose su una SAN. La riduzione è una buona manutenzione e ti tiene in contatto con il tuo ambiente. Fammi vedere qualcuno che pensa che non dovresti mai restringere e ti mostrerò qualcuno che ignora il loro ambiente.
Newclique,

54

Di seguito è riportato uno script per ridurre il registro delle transazioni, ma consiglio vivamente di eseguire il backup del registro delle transazioni prima di ridurlo.

Se riduci il file, perderai una tonnellata di dati che potrebbero salvarti la vita in caso di disastro. Il registro delle transazioni contiene molti dati utili che possono essere letti utilizzando un lettore di registro delle transazioni di terze parti (può essere letto manualmente ma con uno sforzo estremo).

Il registro delle transazioni è anche un must quando si tratta di ripristinare il tempo, quindi non limitarti a buttarlo via, ma assicurati di eseguirne il backup in anticipo.

Ecco alcuni post in cui le persone hanno utilizzato i dati memorizzati nel registro delle transazioni per eseguire il ripristino:

 

USE DATABASE_NAME;
GO

ALTER DATABASE DATABASE_NAME
SET RECOVERY SIMPLE;
GO
--First parameter is log file name and second is size in MB
DBCC SHRINKFILE (DATABASE_NAME_Log, 1);

ALTER DATABASE DATABASE_NAME
SET RECOVERY FULL;
GO

È possibile che venga visualizzato un errore simile al seguente quando si eseguono i comandi sopra

"Impossibile ridurre il file di registro (nome del file di registro) perché è in uso il file di registro logico situato alla fine del file"

Ciò significa che TLOG è in uso. In questo caso, provare a eseguirlo più volte di seguito o trovare un modo per ridurre le attività del database.


30

Ecco un modo semplice, molto inelegante e potenzialmente pericoloso .

  1. DB di backup
  2. Scollega DB
  3. Rinomina file di registro
  4. Allega DB
  5. Verrà ricreato il nuovo file di registro
  6. Elimina il file di registro rinominato.

Immagino che non si stiano eseguendo backup dei log. (Che tronca il registro). Il mio consiglio è di cambiare il modello di recupero da completo a semplice . Ciò impedirà il gonfiamento del registro.


15
Rispettosamente, eliminare / rinominare / ricreare / sostituire il registro è una pessima idea. Ridurre è meno rischioso, inoltre è abbastanza semplice da fare.
onupdatecascade,

12
+1 - Inelegante o no, questo metodo mi ha fatto uscire dall'acqua calda un paio di volte con i log del database che hanno riempito l'intero disco, in modo che nemmeno un comando di riduzione possa essere eseguito.
Shaul Behr,

3
Non esiste il rischio di transazioni non controllate esistenti nel registro?
Paolo

Questo potrebbe anche andare bene per DB più piccoli, ma se si dispone di un DB da 3 o 4 TB, potrebbe non essere la soluzione migliore.
Jaques,

Questo sembra ok se hai sviluppato un sistema per molto tempo e hai caricato / eliminato migliaia di record durante il periodo di sviluppo. Quindi, quando si desidera utilizzare questo database per la distribuzione in tempo reale, i dati di test / sviluppo che sono stati registrati sono ridondanti e quindi non importa se vengono persi, no?
JsonStatham,

28

Se non si utilizzano i registri delle transazioni per i ripristini (ovvero si eseguono solo backup completi), è possibile impostare la modalità di ripristino su "Semplice" e il registro delle transazioni si ridurrà molto rapidamente e non si riempirà mai più.

Se si utilizza SQL 7 o 2000, è possibile abilitare "tronca il checkpoint di accesso al registro" nella scheda delle opzioni del database. Questo ha lo stesso effetto.

Ciò non è consigliato negli ambienti di produzione, ovviamente, poiché non sarà possibile ripristinare in un determinato momento.


1
L'impostazione della modalità di ripristino su semplice non ridurrà magicamente il registro delle transazioni.
Aaron Bertrand,

@Aaron Non da solo, no. Supponevo che l'OP avrebbe usato il loro database di test, e quindi "il registro delle transazioni si ridurrà molto presto", ma hai ragione in quanto è più di un effetto collaterale: la modalità di recupero di semplice ti farà probabilmente finire con un rimpicciolito registro delle transazioni presto
Jonathan,

" Simple... e non riempire mai più" - non è vero. L'ho visto accadere (nelle ultime 48 ore) su un database in cui il modello di recupero era impostato su "SEMPLICE". La crescita dei file del file di registro era impostata su "limitato", e su di esso ci eravamo impegnati in modo immenso ... Capisco che fosse una situazione insolita. (Nella nostra situazione, in cui avevamo un sacco di spazio su disco, abbiamo aumentato la dimensione del file di registro e impostato la crescita del file di registro su "senza restrizioni" ... che tra l'altro - bug dell'interfaccia - viene visualizzato, dopo la modifica, come "limitato" "con una dimensione massima di 2.097.152 MB.)
Doug_Ivison il

2
@Doug_Ivison Sì, il registro delle transazioni conterrà transazioni aperte, ma verranno rimosse in modalità semplice dopo che è stato eseguito un checkpoint. Questa risposta è intesa solo come una rapida "la mia scatola di sviluppo / test ha un grande registro delle transazioni, e voglio che vada via, quindi non devo preoccuparmi troppo spesso", piuttosto che mai destinato a una produzione ambiente. Per ripetere l'iterazione: non farlo durante la produzione .
Jonathan,

1
È tutto vero e capisco che si trattava di un approccio rapido solo per lo sviluppo. Perché ho commentato: fino a quando non è successo a me, in realtà ho pensato che il semplice modello di recupero non potesse MAI riempire ... e penso che ci sia voluto più tempo per capire / risolvere, mentre sono arrivato a capire che transazioni insolitamente grandi possono farlo.
Doug_Ivison,

9

Questa tecnica consigliata da John non è consigliata in quanto non vi è alcuna garanzia che il database verrà collegato senza il file di registro. Cambia il database da completo a semplice, forza un checkpoint e attendi qualche minuto. SQL Server cancellerà il registro, che sarà quindi possibile ridurre utilizzando DBCC SHRINKFILE.


... ma l'ho fatto decine di volte senza problemi. forse potresti spiegare perché il db potrebbe non ricollegarsi.
Johnno Nolan,

Occasionalmente (non molto spesso) ho visto SQL Server non essere in grado di ricollegare il database al database quando il file di registro è stato eliminato. Questo ti lascia con un file MDF inutile. Esistono diverse possibilità che possono causare il problema. Mi vengono in mente le transazioni in attesa di rollback.
mrdenny,

4
Sono d'accordo con questa tattica, ma dovrebbe essere riservata ai casi in cui il registro è saltato in aria a causa di eventi imprevisti e / o straordinari. Se imposti un lavoro per farlo ogni settimana, lo stai facendo molto, molto male.
Aaron Bertrand,

2
Molto, molto vero Aaron.
mrdenny,

Sì, ci è appena successo. Volevamo eliminare 20 G di file di registro poiché avevamo appena eseguito il backup dei dati prima di spostare il database. MSSQL non ci permetterebbe in alcun modo di ricollegare il nuovo database senza l'enorme file di registro.
George M Ripristina Monica il

9

La maggior parte delle risposte qui finora presuppone che in realtà non sia necessario il file di registro delle transazioni, tuttavia se il database utilizza il FULLmodello di recupero e si desidera conservare i backup nel caso in cui sia necessario ripristinare il database, quindi non troncare o eliminare il file file di registro come suggeriscono molte di queste risposte.

L'eliminazione del file di registro (troncandolo, scartandolo, cancellandolo, ecc.) Interromperà la catena di backup e ti impedirà di ripristinare in qualsiasi momento dal tuo ultimo backup completo, differenziale o del registro delle transazioni, fino al successivo completo oppure viene eseguito il backup differenziale.

Dalla articolo MicrosoftBACKUP

Si consiglia di non utilizzare mai NO_LOG o TRUNCATE_ONLY per troncare manualmente il registro delle transazioni, poiché ciò interrompe la catena di registri. Fino al successivo backup completo o differenziale del database, il database non è protetto dall'errore del supporto. Utilizzare il troncamento manuale del registro solo in circostanze molto speciali e creare immediatamente backup dei dati.

Per evitare ciò, eseguire il backup del file di registro su disco prima di ridurlo. La sintassi sarebbe simile a questa:

BACKUP LOG MyDatabaseName 
TO DISK='C:\DatabaseBackups\MyDatabaseName_backup_2013_01_31_095212_8797154.trn'

DBCC SHRINKFILE (N'MyDatabaseName_Log', 200)

3
Sono d'accordo con la tua risposta, ad eccezione della , 1)parte. Il problema è che se lo si riduce a 1 MB, gli eventi di crescita che portano a una normale dimensione del registro saranno piuttosto costosi e ce ne saranno molti se il tasso di crescita viene lasciato al valore predefinito del 10%.
Aaron Bertrand,

9

Il registro delle transazioni di SQL Server deve essere gestito correttamente per impedire la sua crescita indesiderata. Ciò significa che l'esecuzione dei backup del registro delle transazioni è abbastanza frequente. In caso contrario, si rischia che il registro delle transazioni si riempia e inizi a crescere.

Oltre alle risposte a questa domanda, raccomando di leggere e comprendere i miti comuni del registro delle transazioni. Queste letture possono aiutare a comprendere il registro delle transazioni e a decidere quali tecniche utilizzare per "cancellarlo":

Dai 10 miti del registro delle transazioni più importanti di SQL Server :

Mito: il mio SQL Server è troppo occupato. Non desidero eseguire backup del registro delle transazioni di SQL Server

Una delle più grandi operazioni ad alte prestazioni in SQL Server è un evento di crescita automatica del file di registro delle transazioni online. Non eseguendo i backup del registro delle transazioni abbastanza spesso, il registro delle transazioni online sarà pieno e dovrà crescere. La dimensione di crescita predefinita è del 10%. Più occupato è il database, più veloce aumenterà il registro delle transazioni online se non vengono creati i backup del registro delle transazioni La creazione di un backup del registro delle transazioni di SQL Server non blocca il registro delle transazioni online, ma lo fa un evento di crescita automatica. Può bloccare tutte le attività nel registro delle transazioni online

Dai miti del log delle transazioni :

Mito: la riduzione regolare dei registri è una buona pratica di manutenzione

FALSO. La crescita dei tronchi è molto costosa perché il nuovo pezzo deve essere azzerato. Tutta l'attività di scrittura si interrompe su quel database fino al termine dell'azzeramento e se la scrittura del disco è lenta o la dimensione della crescita automatica è grande, tale pausa può essere enorme e gli utenti noteranno. Questo è uno dei motivi per cui vuoi evitare la crescita. Se riduci il registro, esso crescerà di nuovo e stai semplicemente sprecando il funzionamento del disco in un gioco inutile di riduzione e crescita


5

Verificare innanzitutto il modello di recupero del database. Per impostazione predefinita, SQL Server Express Edition crea un database per il modello di recupero semplice (se non sbaglio).

Registro di backup DatabaseName con Truncate_Only:

DBCC ShrinkFile(yourLogical_LogFileName, 50)

SP_helpfile ti darà il nome del file di log logico.

Fare riferimento a:

Ripristina da un registro delle transazioni completo in un database di SQL Server

Se il database è nel modello di recupero completo e se non si esegue il backup TL, modificarlo in SEMPLICE.


Questo è il modo in cui desidero cancellare i file di registro nelle mie caselle di sviluppo. Prod ambienti con tutte le strategie di backup associate ecc. Lascio ai DBA :-)
Joon

TRUNCATE_ONLYnon è più un'opzione nelle versioni correnti di SQL Server e non è consigliato nelle versioni che lo supportano (vedere la risposta di Rachel ).
Aaron Bertrand,

5

Usa il DBCC ShrinkFile ({logicalLogName}, TRUNCATEONLY)comando Se si tratta di un database di prova e si sta tentando di salvare / recuperare spazio, questo sarà di aiuto.

Ricorda però che i registri TX hanno una sorta di dimensione minima / stazionaria a cui cresceranno. A seconda del modello di recupero, potrebbe non essere possibile ridurre il registro - se in PIENO e non si eseguono backup del registro TX, il registro non può essere ridotto - crescerà per sempre. Se non è necessario il backup del registro TX, impostare il modello di recupero su Semplice .

E ricorda, mai e poi mai eliminare il file di registro (LDF)! Avrai praticamente la corruzione istantanea del database. Cucinato! Fatto! Dati persi! Se lasciato "non riparato", il file MDF principale potrebbe essere danneggiato in modo permanente.

Non cancellare mai il registro delle transazioni: perderai i dati! Parte dei dati si trova nel registro TX (indipendentemente dal modello di recupero) ... se si scollega e "rinomina" il file di registro TX che elimina in modo efficace parte del database.

Per coloro che hanno eliminato il registro TX, potresti voler eseguire alcuni comandi checkdb e correggere il danneggiamento prima di perdere più dati.

Dai un'occhiata ai post sul blog di Paul Randal proprio su questo argomento, cattivi consigli .

Inoltre, in generale, non utilizzare il file di restringimento sui file MDF poiché può frammentare gravemente i dati. Consulta la sua sezione Consigli errati per ulteriori informazioni ("Perché non dovresti ridurre i tuoi file di dati")

Dai un'occhiata al sito Web di Paul: copre proprio queste domande. Il mese scorso ha affrontato molti di questi problemi nella sua serie Myth A Day .


+1 Per essere la prima risposta a menzionare che questa potrebbe non essere una buona idea! L'OP specifica un database di test, ma vale la pena fare un caso per il caso più generale.
Martin Smith,

Avrei dovuto aggiungere - Se si elimina il registro TX - Riprendi aggiornamento!
Ripvlan

4

Per troncare il file di registro:

  • Eseguire il backup del database
  • Scollegare il database, utilizzando Enterprise Manager o eseguendo: Sp_DetachDB [DBName]
  • Elimina il file di registro delle transazioni. (o rinominare il file, per ogni evenienza)
  • Ricollegare nuovamente il database utilizzando: Sp_AttachDB [DBName]
  • Quando il database è collegato, viene creato un nuovo file di registro delle transazioni.

Per ridurre il file di registro:

  • Registro di backup [DBName] con No_Log
  • Riduci il database:

    Utilizzando Enterprise manager: - Fare clic con il tasto destro sul database, Tutte le attività, Riduci database, File, Seleziona file di registro, OK.

    Usando T-SQL: - Dbcc Shrinkfile ([Log_Logical_Name])

È possibile trovare il nome logico del file di registro eseguendo sp_helpdb o cercando nelle proprietà del database in Enterprise Manager.


Non cancellare mai il registro delle transazioni. Parte dei tuoi dati è nel registro. Eliminalo e il database diventerà corrotto. Non ho un rappresentante per il voto contrario.
ripvlan,

4

In base alla mia esperienza sulla maggior parte dei server SQL, non esiste alcun backup del registro delle transazioni. I backup completi o i backup differenziali sono una pratica comune, ma i backup del registro delle transazioni raramente lo sono. Quindi il file di registro delle transazioni cresce per sempre (fino a quando il disco è pieno). In questo caso il modello di recupero dovrebbe essere impostato su " semplice ". Non dimenticare di modificare anche i database di sistema "modello" e "tempdb".

Un backup del database "tempdb" non ha senso, quindi il modello di recupero di questo db dovrebbe essere sempre "semplice".


La semplice impostazione del database su semplice non ridurrà il file di registro, in qualunque stato sia attualmente. Può solo aiutare a impedire che cresca ulteriormente (ma potrebbe comunque).
Aaron Bertrand,

4
  1. Effettua un backup del file MDB.
  2. Ferma i servizi SQL
  3. Rinomina il file di registro
  4. Avvia il servizio

(Il sistema creerà un nuovo file di registro.)

Elimina o sposta il file di registro rinominato.


3

È successo con me in cui il file di registro del database era di 28 GB.

Cosa puoi fare per ridurlo? In realtà, i file di registro sono quei dati di file che il server SQL conserva quando ha luogo una transazione. Affinché una transazione elabori il server SQL alloca le pagine per lo stesso. Ma dopo il completamento della transazione, questi non vengono rilasciati improvvisamente nella speranza che possa esserci una transazione simile alla stessa. Questo regge lo spazio.

Passaggio 1: eseguire innanzitutto questo comando nel checkpoint esplorato della query del database

Passaggio 2: fare clic con il pulsante destro del mouse sul database Attività> Backup Selezionare il tipo di backup come Registro transazioni Aggiungere un indirizzo di destinazione e un nome file per conservare i dati di backup (.bak)

Ripetere nuovamente questo passaggio e in questo momento assegnare un altro nome file

inserisci qui la descrizione dell'immagine

Passaggio 3: ora vai al database Fare clic con il pulsante destro del mouse sul database

Attività> Riduci> File Scegliere il tipo di file come azione Riduci registro come rilascia spazio inutilizzato

inserisci qui la descrizione dell'immagine

Step 4:

Controlla il tuo file di registro normalmente in SQL 2014, questo è disponibile all'indirizzo

C: \ Programmi \ Microsoft SQL Server \ MSSQL12.MSSQL2014EXPRESS \ MSSQL \ DATA

Nel mio caso, è stato ridotto da 28 GB a 1 MB


2

Prova questo:

USE DatabaseName

GO

DBCC SHRINKFILE( TransactionLogName, 1)

BACKUP LOG DatabaseName WITH TRUNCATE_ONLY

DBCC SHRINKFILE( TransactionLogName, 1)

GO 

TRUNCATE_ONLYnon è più un'opzione nelle versioni correnti di SQL Server e non è consigliato nelle versioni che lo supportano (vedere la risposta di Rachel ).
Aaron Bertrand,

Funziona per me usando MSSQL Server 2005 Standard Edition
bksi

2

Database → fare clic con il pulsante destro del mouse su Proprietà → file → aggiungere un altro file di registro con un nome diverso e impostare il percorso uguale al vecchio file di registro con un nome file diverso.

Il database raccoglie automaticamente il file di registro appena creato.


1
  1. DB di backup
  2. Scollega DB
  3. Rinomina file di registro
  4. Allega DB (durante il collegamento rimuovi .ldf (file di registro) rinominato. Seleziona e rimuovi premendo il pulsante Rimuovi)
  5. Verrà ricreato il nuovo file di registro
  6. Elimina il file di registro rinominato.

Funzionerà ma si consiglia di eseguire prima il backup del database.


1

Alcune delle altre risposte non hanno funzionato per me: non è stato possibile creare il checkpoint mentre il db era online, perché il registro delle transazioni era pieno (quanto ironico). Tuttavia, dopo aver impostato il database in modalità di emergenza, sono stato in grado di ridurre il file di registro:

alter database <database_name> set emergency;
use <database_name>;
checkpoint;
checkpoint;
alter database <database_name> set online;
dbcc shrinkfile(<database_name>_log, 200);

0

Esempio:

DBCC SQLPERF(LOGSPACE)

BACKUP LOG Comapny WITH TRUNCATE_ONLY

DBCC SHRINKFILE (Company_log, 500)

DBCC SQLPERF(LOGSPACE)

TRUNCATE_ONLYnon è più un'opzione nelle versioni correnti di SQL Server e non è consigliato nelle versioni che lo supportano (vedere la risposta di Rachel ).
Aaron Bertrand,

La domanda non è in argomento per StackTranslate.it, come definito nel Centro assistenza . Per favore, non rispondere a tali domande; invece, dovresti segnalarli per attirare l'attenzione e verranno chiusi o migrati in modo appropriato.
Toby Speight,

0

Risposta leggermente aggiornata, per MSSQL 2017 e utilizzo dello studio di gestione del server SQL. Sono andato principalmente da queste istruzioni https://www.sqlshack.com/sql-server-transaction-log-backup-truncate-and-shrink-operations/

Ho avuto un recente backup db, quindi ho eseguito il backup del registro delle transazioni. Quindi l'ho eseguito nuovamente il backup per buona misura. Alla fine ho ridotto il file di registro e sono passato da 20G a 7 MB, molto più in linea con la dimensione dei miei dati. Non credo che i registri delle transazioni siano mai stati sottoposti a backup da quando è stato installato 2 anni fa .. quindi inserendo tale attività nel calendario delle pulizie.


-1

Registro transazioni DB Riduci alla dimensione minima :

  1. Backup: registro delle transazioni
  2. Riduci i file: registro delle transazioni
  3. Backup: registro delle transazioni
  4. Riduci i file: registro delle transazioni

Ho effettuato test su diversi numeri di DB: questa sequenza funziona .

Di solito si riduce a 2 MB .

O da uno script:

DECLARE @DB_Name nvarchar(255);
DECLARE @DB_LogFileName nvarchar(255);
SET @DB_Name = '<Database Name>';               --Input Variable
SET @DB_LogFileName = '<LogFileEntryName>';         --Input Variable
EXEC 
(
'USE ['+@DB_Name+']; '+
'BACKUP LOG ['+@DB_Name+'] WITH TRUNCATE_ONLY ' +
'DBCC SHRINKFILE( '''+@DB_LogFileName+''', 2) ' +
'BACKUP LOG ['+@DB_Name+'] WITH TRUNCATE_ONLY ' +
'DBCC SHRINKFILE( '''+@DB_LogFileName+''', 2)'
)
GO

1
TRUNCATE_ONLYnon è più un'opzione nelle versioni correnti di SQL Server e non è consigliato nelle versioni che lo supportano (vedere la risposta di Rachel ).
Aaron Bertrand,
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.