Una risposta più breve:
Probabilmente hai una transazione in esecuzione da lungo tempo (manutenzione dell'indice? Eliminazione o aggiornamento di grandi lotti?) Oppure sei nella modalità di ripristino "predefinita" (più sotto su cosa si intende per impostazione predefinita) Full
e non hai eseguito un backup del registro (o non li stanno prendendo abbastanza frequentemente).
Se si tratta di un problema relativo al modello di recupero, la risposta semplice potrebbe essere Passa alla Simple
modalità di ripristino se non sono necessari il ripristino temporizzato e i backup regolari del registro. Molte persone, tuttavia, fanno la loro risposta senza comprendere i modelli di recupero. Continua a leggere per capire perché è importante e poi decidi cosa fai. Potresti anche iniziare a fare i backup dei log e rimanere in Full
recupero.
Potrebbero esserci altri motivi, ma questi sono i più comuni. Questa risposta inizia ad approfondire i due motivi più comuni e ti fornisce alcune informazioni di base sul perché e come dietro i motivi, oltre ad esplorare altri motivi.
Una risposta più lunga:
quali scenari possono far crescere il registro? Esistono molte ragioni, ma di solito queste sono le seguenti due configurazioni: c'è un malinteso sui modelli di recupero o ci sono transazioni a lungo termine. Continua a leggere per i dettagli.
Motivo principale 1/2: Non capire i modelli di recupero
( Essere in modalità di recupero completo e non eseguire backup del registro - Questa è la ragione più comune - lo sono la stragrande maggioranza di coloro che riscontrano questo problema. )
Sebbene questa risposta non sia un approfondimento nei modelli di recupero di SQL Server, l'argomento dei modelli di recupero è fondamentale per questo problema.
In SQL Server esistono tre modelli di recupero :
Full
,
Bulk-Logged
e
Simple
.
Ignoreremo Bulk-Logged
per ora diremo in un certo senso che si tratta di un modello ibrido e la maggior parte delle persone che si trovano in questo modello sono lì per un motivo e capiscono i modelli di recupero.
I due ci sta a cuore e la loro confusione sono la causa della maggior parte dei casi di persone che hanno questo problema sono Simple
e Full
.
Intervallo: recupero in generale
Prima di parlare di modelli di recupero: parliamo di recupero in generale. Se vuoi approfondire ulteriormente questo argomento, leggi il blog di Paul Randal e tutti i post che desideri. Per questa domanda, però:
Ripristino
da arresto anomalo / riavvio Uno scopo del file di registro delle transazioni è il ripristino da arresto anomalo / riavvio . Per il roll forward e il rollback del lavoro svolto (roll forward / redo) prima di un arresto anomalo o riavvio e il lavoro avviato ma non terminato dopo un arresto anomalo o riavvio (rollback / annulla). È compito del registro delle transazioni verificare che una transazione sia iniziata ma non è mai terminata (il rollback o l'arresto anomalo / riavvio si è verificato prima del commit della transazione). In quella situazione, è compito del registro dire "Ehi ... questo non è mai veramente finito, facciamolo tornare indietro" durante il recupero. È anche compito del registro vedere che hai finito qualcosa e che alla tua applicazione client è stato detto che era finito (anche se non si era ancora indurito nel tuo file di dati) e dire"Ehi .. è successo davvero, facciamolo avanti, facciamo in modo che le applicazioni pensino che fosse" dopo un riavvio. Ora c'è di più ma questo è lo scopo principale.
Ripristino temporizzato
L'altro scopo di un file di registro delle transazioni è quello di essere in grado di darci la possibilità di ripristinare in un momento nel tempo a causa di un "oops" in un database o di garantire un punto di ripristino in caso di un guasto hardware che coinvolge i dati e / o i file di registro di un database. Se questo registro delle transazioni contiene i record delle transazioni che sono state avviate e completate per il ripristino, SQL Server può e utilizza queste informazioni per portare un database dove si trovava prima che si verificasse un problema. Ma questa non è sempre un'opzione disponibile per noi. Perché ciò funzioni dobbiamo avere il nostro database nel giusto modello di recupero e dobbiamo fare i backup dei log .
Modelli di recupero
Sui modelli di recupero:
Modello di recupero semplice
Quindi, con l'introduzione di cui sopra, è più semplice parlare Simple Recovery
prima del modello. In questo modello, stai dicendo a SQL Server: "Sto bene usando il tuo file di registro delle transazioni per crash e riavvio del recupero ..." (Non hai davvero scelta lì. Cerca le proprietà ACID e questo dovrebbe avere senso rapidamente.) "... ma una volta che non ne hai più bisogno per quello scopo di recupero crash / riavvio, vai avanti e riutilizzi il file di registro."
SQL Server ascolta questa richiesta in Simple Recovery e conserva solo le informazioni necessarie per eseguire il crash / riavvio del ripristino. Una volta che SQL Server è sicuro che possa essere ripristinato poiché i dati sono induriti nel file di dati (più o meno), i dati che sono stati induriti non sono più necessari nel registro e sono contrassegnati per il troncamento, il che significa che vengono riutilizzati.
Modello di recupero completo
Con Full Recovery
, si dice a SQL Server che si desidera poter eseguire il ripristino in un determinato momento, purché il file di registro sia disponibile o in un determinato momento coperto da un backup del registro. In questo caso, quando SQL Server raggiunge il punto in cui sarebbe sicuro troncare il file di registro in Simple Recovery Model, non lo farà. Invece consente al file di registro di continuare a crescere e gli consentirà di continuare a crescere, fino a quando non si esegue un backup del registro (o si esaurisce lo spazio sull'unità del file di registro) in circostanze normali.
Il passaggio da Semplice a Completo ha un Gotcha.
Ci sono regole ed eccezioni qui. Di seguito parleremo di transazioni a lungo termine.
Ma un avvertimento da tenere a mente per la modalità di recupero completo è questo: se si passa alla Full Recovery
modalità, ma non si esegue mai un backup completo iniziale, SQL Server non rispetterà la richiesta di essere nel Full Recovery
modello. Il registro delle transazioni continuerà a funzionare come è stato Simple
fino a quando non si passa al modello di recupero completo e si prende il primo Full Backup
.
Il modello di recupero completo senza backup dei registri è errato.
Quindi, questa è la ragione più comune per la crescita incontrollata dei tronchi? Risposta: Essere in modalità di recupero completo senza alcun backup del registro.
Questo succede sempre alle persone.
Perché è un errore così comune?
Perché succede sempre? Perché ogni nuovo database ottiene l'impostazione del modello di recupero iniziale guardando il database del modello.
L'impostazione del modello di recupero iniziale del modello è sempre Full Recovery Model
, fino a quando e a meno che qualcuno non lo modifichi. Quindi si potrebbe dire che il "modello di recupero predefinito" è Full
. Molte persone non ne sono a conoscenza e hanno i loro database in esecuzione Full Recovery Model
senza backup dei registri, quindi un file di registro delle transazioni molto più grande del necessario. Questo è il motivo per cui è importante modificare le impostazioni predefinite quando non funzionano per l'organizzazione e le sue esigenze)
Il modello di recupero completo con un numero insufficiente di backup dei registri è errato.
Puoi anche metterti nei guai qui non eseguendo backup dei log abbastanza frequentemente.
L'esecuzione di un backup del registro al giorno può sembrare soddisfacente, poiché un ripristino richiede meno comandi di ripristino, ma tenendo presente la discussione sopra, il file di registro continuerà a crescere e crescere fino a quando non si eseguono i backup del registro.
Come faccio a sapere di quale frequenza di backup del registro ho bisogno?
È necessario considerare la frequenza di backup del registro tenendo presente due aspetti:
- Bisogni di recupero - Speriamo che questo sia il primo. Nel caso in cui l'unità che contiene il registro delle transazioni vada in errore o si verifichi una grave corruzione che influisce sul backup del registro, quanti dati possono essere persi? Se quel numero non supera i 10-15 minuti, è necessario eseguire il backup del registro ogni 10-15 minuti, fine della discussione.
- Crescita dei log : se la tua organizzazione non ha problemi a perdere più dati a causa della possibilità di ricrearli facilmente quel giorno, potresti avere un backup dei log molto meno frequente di 15 minuti. Forse la tua organizzazione va bene ogni 4 ore. Ma devi guardare quante transazioni generi in 4 ore. Consentire al registro di continuare a crescere in quelle quattro ore renderà troppo grande un file di registro? Ciò significa che i backup del log impiegheranno troppo tempo?
Motivo principale 2/2: transazioni a lungo termine
( "Il mio modello di recupero va bene! Il registro è ancora in crescita! )
Questo può anche essere una causa di crescita dei tronchi incontrollata e incontrollata. Indipendentemente dal modello di recupero, ma spesso viene visualizzato come "Ma sono nel modello di recupero semplice: perché il mio registro continua a crescere ?!"
Il motivo qui è semplice: se SQL utilizza questo registro delle transazioni per scopi di recupero, come ho descritto sopra, deve vedere l'inizio di una transazione.
Se si dispone di una transazione che richiede molto tempo o di apportare molte modifiche, il registro non può troncarsi sul checkpoint per nessuna delle modifiche che sono ancora in transazioni aperte o che sono state avviate dall'inizio della transazione.
Ciò significa che una grande eliminazione, l'eliminazione di milioni di righe in un'istruzione di eliminazione è una transazione e il registro non può eseguire alcun troncamento fino a quando non viene eseguita l'intera eliminazione. In Full Recovery Model
, questa eliminazione viene registrata e potrebbero essere molti record di registro. Stessa cosa con l'ottimizzazione dell'indice durante le finestre di manutenzione. Significa anche che una cattiva gestione delle transazioni e il mancato rispetto e la chiusura delle transazioni aperte possono davvero danneggiare te e il tuo file di registro.
Cosa posso fare per queste transazioni a lungo termine?
Puoi salvarti qui:
- Ridimensionare correttamente il file di registro per tenere conto dello scenario peggiore, come la manutenzione o operazioni note di grandi dimensioni. E quando cresci il tuo file di registro dovresti consultare questa guida (e i due collegamenti a cui ti manda) di Kimberly Tripp. Il giusto dimensionamento è estremamente critico qui.
- Osservando il tuo utilizzo delle transazioni. Non avviare una transazione nel server delle applicazioni e iniziare conversazioni lunghe con SQL Server e rischiare di lasciarne una aperta troppo a lungo.
- Guarda le transazioni implicite nelle tue dichiarazioni DML. Ad esempio:
UPDATE TableName Set Col1 = 'New Value'
è una transazione. Non ci ho messo BEGIN TRAN
e non c'è bisogno, è ancora una transazione che si impegna automaticamente al termine. Quindi, se si eseguono operazioni su un numero elevato di righe, considerare di raggruppare tali operazioni in blocchi più gestibili e dare al registro il tempo di recuperare. O considera la giusta dimensione per affrontarlo. O forse cercare di modificare i modelli di recupero durante una finestra di caricamento di massa.
Questi due motivi si applicano anche alla spedizione dei log?
Risposta breve: si. Risposta più lunga di seguito.
Domanda: "Sto utilizzando il log shipping, quindi i miei backup del log sono automatizzati ... Perché vedo ancora la crescita del log delle transazioni?"
Risposta: continua a leggere.
Che cos'è il log shipping?
Il log shipping è proprio quello che sembra: stai spedendo i tuoi backup del log delle transazioni a un altro server per scopi di DR. C'è qualche inizializzazione ma dopo che il processo è abbastanza semplice:
- Un lavoro per il backup del registro su un server,
- un lavoro per copiare quel registro di backup e
- un lavoro per ripristinarlo senza ripristino (o
NORECOVERY
o STANDBY
) sul server di destinazione.
Ci sono anche alcuni lavori da monitorare e avvisare se le cose non vanno come previsto.
In alcuni casi, potresti voler eseguire il ripristino della spedizione dei log solo una volta al giorno o ogni tre giorni o una volta alla settimana. Questo va bene. Ma se si apporta questa modifica su tutti i lavori (incluso il backup del registro e i processi di copia) significa che si sta aspettando tutto quel tempo per eseguire un backup del registro. Ciò significa che avrai un sacco di crescita dei log - perché sei in modalità di recupero completo senza backup dei log - e probabilmente significa anche un file di log di grandi dimensioni da copiare. È necessario modificare solo la pianificazione del processo di ripristino e lasciare che i backup e le copie del registro vengano eseguiti su una base più frequente, altrimenti si risentirà del primo problema descritto in questa risposta.
Risoluzione dei problemi generali tramite codici di stato
Ci sono ragioni diverse da queste due, ma queste sono le più comuni. Indipendentemente dalla causa: esiste un modo per analizzare la ragione di questa crescita / mancanza di tronchi inspiegabile e vedere quali sono.
Interrogando la sys.databases
vista del catalogo è possibile visualizzare informazioni che descrivono il motivo per cui il file di registro potrebbe essere in attesa di troncamento / riutilizzo.
Esiste una colonna chiamata log_reuse_wait
con un ID di ricerca del codice motivo e una log_reuse_wait_desc
colonna con una descrizione del motivo di attesa. Dall'articolo online dei libri di riferimento sono la maggior parte dei motivi (quelli che è probabile che tu veda e quelli per cui possiamo spiegare i motivi. Quelli mancanti sono fuori uso o per uso interno) con alcune note sull'attesa in corsivo :
0 = Niente
Come sembra .. Non dovresti aspettare
1 = Checkpoint In
attesa che si verifichi un checkpoint. Questo dovrebbe accadere e dovresti andare bene, ma ci sono alcuni casi da cercare qui per risposte o modifiche successive.
2 = Backup del registro
Stai aspettando che si verifichi un backup del registro. O li hai programmati e accadrà presto, oppure hai il primo problema descritto qui e ora sai come risolverlo
3 = Backup o ripristino attivo
Nel database è in esecuzione un'operazione di backup o ripristino
4 = Transazione attiva
Esiste una transazione attiva che deve essere completata (in entrambi i modi - ROLLBACK
o COMMIT
) prima di poter eseguire il backup del registro. Questa è la seconda ragione descritta in questa risposta.
5 = Mirroring del database
Un mirror si trova in ritardo o in fase di latenza in una situazione di mirroring ad alte prestazioni o il mirroring viene sospeso per qualche motivo
6 = Replica
Ci possono essere problemi con la replica che potrebbero causare questo - come un agente del lettore di registri non in esecuzione, un database che pensa che sia contrassegnato per la replica che non esiste più e vari altri motivi. Puoi anche vedere questo motivo ed è perfettamente normale perché stai guardando al momento giusto, proprio come le transazioni vengono consumate dal lettore di log
7 = Creazione dello snapshot del database
Stai creando uno snapshot del database, lo vedrai se guardi il momento giusto mentre viene creato uno snapshot
8 = Log Scan
Devo ancora riscontrare un problema con questo per sempre. Se guardi abbastanza a lungo e abbastanza frequentemente puoi vedere che ciò accada, ma non dovrebbe essere una causa dell'eccessiva crescita del registro delle transazioni, che ho visto.
9 = Una replica secondaria dei gruppi di disponibilità AlwaysOn applica i record del registro delle transazioni di questo database a un database secondario corrispondente.
Circa la descrizione più chiara ancora ..