Perché il registro delle transazioni continua a crescere in modalità di ripristino semplice con backup notturni


24

Prima di contrassegnare immediatamente come duplicato , ho letto Perché il registro delle transazioni continua a crescere o esaurire lo spazio di Mike Walsh ? , ma non credo che abbia dato una risposta alla mia situazione. Ho esaminato una dozzina di domande simili, ma quelle pertinenti per lo più hanno semplicemente detto "duplicato" e indicato la domanda di Mike.

Dettagli: ho un sacco di database ~ 500 MB su SQL Server 2008 R2, tutti in modalità di ripristino SEMPLICE (non la mia scelta), backup completi notturni, con file di dati di ~ 200 MB e file di registro di ~ 300 MB. Il registro non raggiunge i 300 MB immediatamente, ma piuttosto lentamente nel corso di un paio di mesi. Non ci sono transazioni aperte su nessuno di essi, almeno secondo sp_who2 e il monitor delle attività. Se faccio clic con il pulsante destro del mouse sul database e seleziono le proprietà, mi dice che ci sono ~ 50 MB gratuiti. Soprattutto dopo un backup, l'intero registro non dovrebbe essere libero? In modalità SEMPLICE il registro non dovrebbe essere libero fintanto che non c'è una transazione aperta?

log_reuse_wait_descda sys.databasesdice "NIENTE", che in base alla domanda e alla risposta di cui sopra dice che non dovrebbe aspettare nulla per riutilizzare lo spazio.

Se eseguo "DBCC SHRINKFILE", il file di registro si riduce a 1 MB, quindi è disposto a recuperare lo spazio. Posso impostare qualcosa che restringe i registri settimanalmente e impedisce alle cose di sfuggire al controllo, ma sono confuso sul perché SQL Server mi costringerebbe a farlo.

Riesco a capire se ci fosse una transazione folle che aveva bisogno di 300 MB per registrarlo, ma non stiamo facendo nulla di estremo, solo OLTP di base. Dalla domanda / risposta di Mike:

Modello di recupero semplice - Quindi, con l'introduzione di cui sopra, è più semplice parlare prima del modello di recupero semplice. In questo modello, stai dicendo a SQL Server: sto bene usando il tuo file di registro delle transazioni per il crash e il riavvio del ripristino (Non hai davvero scelta lì. Cerca le proprietà ACID e questo dovrebbe avere senso rapidamente), ma una volta che no serve più a tale scopo di recupero crash / riavvio, andare avanti e riutilizzare 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.

Continua a dire che lo spazio del registro dovrebbe essere riutilizzato, ma con questa crescita lenta nel corso dei mesi, non sembra che lo sia.

Cosa mi sto perdendo? Qualcosa impedisce a SQL Server di riconoscere i dati come "rafforzati" e di liberare il registro?

(modifica) The After Action Report - AKA un po 'di conoscenza è pericolosa

Dopo aver scoperto che questa è una "domanda popolare", mi è sembrato di dover una spiegazione di ciò che è accaduto 7 mesi fa e di ciò che ho imparato a sperare di salvare un po 'di dolore ad altre persone.

Innanzitutto, lo spazio disponibile visualizzato in SSMS quando si visualizzano le proprietà su un database è lo spazio disponibile nel file di dati. Puoi visualizzarlo eseguendo quanto segue su un database e scoprirai che lo spazio disponibile segnalato da SSMS è la differenza tra FileSizeMB e UsedSpaceMB:

SELECT
    DB.name,
    MF.physical_name,
    MF.type_desc AS FileType,
    MF.size * 8 / 1024 AS FileSizeMB,
    fileproperty(MF.name, 'SpaceUsed') * 8/ 1024 AS UsedSpaceMB,
    mf.name LogicalName
FROM
    sys.master_files MF
    JOIN sys.databases DB ON DB.database_id = MF.database_id
WHERE   DB.name = 'yourdatabasename'

Ciò ha confermato che in circostanze normali stavamo usando pochissimo spazio di registro (20 MB o meno), ma questo porta al secondo elemento ...

In secondo luogo, la mia percezione della crescita dei tronchi era quella di lentamente nel tempo. Tuttavia, in realtà i registri crescevano rapidamente nelle notti in cui il responsabile dell'applicazione delle patch per questa applicazione di terze parti stava applicando le patch. La patch è stata eseguita come una singola transazione, quindi a seconda della patch i dati da 200 MB richiedevano 300 MB di log. La chiave per rintracciarla era la query di Aaron Bertrand su https://sqlblog.org/2007/01/11/reviewing-autogrow-events-from-the-default-trace

DECLARE @path NVARCHAR(260);

SELECT 
    @path = REVERSE(SUBSTRING(REVERSE([path]), 
    CHARINDEX('\', REVERSE([path])), 260)) + N'log.trc'
FROM    sys.traces
WHERE   is_default = 1;

SELECT 
   DatabaseName,
   [FileName],
    SPID,
    Duration,
    StartTime,
    EndTime,
    FileType = CASE EventClass 
       WHEN 92 THEN 'Data'
       WHEN 93 THEN 'Log'
    END
FROM sys.fn_trace_gettable(@path, DEFAULT)
WHERE
    EventClass IN (92,93)
ORDER BY
    StartTime DESC;

Ciò ha dimostrato che il registro cresceva in determinate serate, quando il cliente non utilizzava il database. Ciò ha portato alla conversazione con il ragazzo che applicava le patch e la risposta al mistero.

Grazie ancora per le persone che mi hanno fornito aiuto per ottenere la risposta.


In realtà, ho osservato personalmente un fenomeno simile in uno dei database dei siti dei miei clienti con un modello di recupero SEMPLICE. I registri non crescono (ancora, comunque), ma lo spazio utilizzato nei file di registro fa crescere di un pochino ogni notte. E succede quando viene eseguito il backup del database. Non ho ancora capito cosa lo sta causando, né se sia un problema o meno.
RBarryYoung,

Risposte:


20

È impossibile per noi indovinare cosa lo sta causando, ma SQL Server non solo aumenta un file di registro a 300 MB per il diavolo di esso, cresce a 300 MB perché a un certo punto dall'ultima operazione di riduzione, è necessario che molto spazio di log (sia a causa di una grande transazione singola o molte più piccole concorrenti). Dovresti tracciare gli eventi di crescita del file di registro (ne ho parlato qui e qui ) per cercare di restringere quando o perché ciò accade (anche se l'impostazione di crescita del file di registro è di 300 MB o qualcosa del genere, allora crescerà di 300 MB non appena è necessario più di 1 MB di spazio per ospitare le transazioni attive).

Ad ogni modo, perché pensi di dover ridurre il file di registro una volta raggiunti i 300 MB? Hai davvero letto tutte le risposte, a fondo, sulla domanda di Mike ? Il file di registro NON si ridurrà da solo, perché ridurre il file di registro a 1 MB - solo così può crescere di nuovo durante le transazioni più grandi - è una totale perdita di tempo. Cosa intendi fare con tutto quello spazio libero nel frattempo?


Non penso che stiamo facendo qualcosa che richiederebbe 300 MB di log, ma anche se, una volta fatto, non venisse visualizzato come spazio libero sul database? Quando si esaminano le proprietà del database in SQL Server Management Studio, la dimensione è la dimensione dei dati e del registro e mi aspetterei che lo spazio libero sia lo spazio libero sui dati e sul registro. Lo spazio libero nel registro non viene visualizzato? Che non fosse mostrato come gratuito sembrava che fosse ancora in uso, ma non c'era attività sul database.
DerekCate

1
No, una volta fatto, non diventa automaticamente spazio libero. Le transazioni impegnate non vengono azzerate, il loro spazio è semplicemente contrassegnato come disponibile per il riutilizzo.
Aaron Bertrand

1
@DerekCate "Non credo che stiamo facendo qualcosa che richiederebbe 300 MB di registro" ... Saresti sorpreso, non ci vuole molto a vincolare il riutilizzo del registro delle transazioni. Non pensarci in termini di quantità di carico di lavoro, poiché non è sempre la causa.
Thomas Stringer,

Ok, quindi solo per confermare che lo capisco correttamente, il registro da 300 MB, anche se attualmente non necessario, non verrà mostrato come spazio libero, ma verrà riutilizzato. E ad un certo punto, erano necessari 300 MB per gestire alcune transazioni. Ok, nuove cose da esaminare. Grazie!
DerekCate

1
Un'altra cosa da considerare: un checkpoint automatico per un semplice database di recupero viene messo in coda solo quando il registro è già pieno al 70%. Pertanto, potrebbe non essere necessaria tutta l'attività di registro per determinare la crescita, a seconda dei tempi.
Paul White dice GoFundMonica

6

Tutti i tuoi test correnti ( DBCC SHRINKFILE, log_reuse_wait_desc) stanno semplicemente dimostrando che in questo momento stai riutilizzando i file di registro virtuali del registro delle transazioni in modo appropriato. Ma quando si verificano eventi di crescita automatica sul file di registro delle transazioni, si verifica una reazione al mancato riutilizzo del registro.

Spesso, questa non è una condizione in corso (esattamente come ti sembra in questo momento con la mancanza di sintomi che stai vedendo attualmente). Ci sono alcune cose che potrebbero causare questo comportamento, anche nel semplice modello di recupero.

La soluzione migliore sarebbe quella di impostare un processo di raccolta dati per estrarre regolarmente il log_reuse_wait_descdatabase e registrarlo regolarmente da qualche parte. Quindi dovresti essere in grado di decodificare ciò che sta causando la mancanza di riutilizzo del registro.

Continua a dire che lo spazio del registro dovrebbe essere riutilizzato, ma con questa crescita lenta nel corso dei mesi, non sembra che lo sia.

Come ho indicato in precedenza, non è in genere una condizione di continuo che provoca la mancanza di log delle transazioni riutilizzo (salvare un paio di casi d'angolo, come le transazioni mal costruite), in modo che avrebbe dovuto individuare i tempi in cui questo viene accadendo. La raccolta di dati diagnostici leggeri dovrebbe essere un buon inizio.


Se sta vedendo 50 MB gratuiti e un log di 300 MB fn_DBLOG () gli darebbe un'idea di ciò che stava aumentando la dimensione del suo log?
Kenneth Fisher,

0

La riduzione automatica è abilitata sui DB? E / o hai piani di manutenzione programmata che eseguono ricostruzioni di indici?

Una riduzione automatica seguita dalla manutenzione dell'indice produrrà un volume di registro significativo.

La manutenzione dell'indice da sola produrrà anche un volume di log significativo, se ci sono problemi di progettazione del DB come gli indici cluster sui GUID.


La riduzione automatica non è abilitata sui DB, stiamo cercando di evitare la frammentazione dell'indice brentozar.com/archive/2009/08/… . Eseguiamo controlli settimanali sull'integrità, ma non credo che vi sia alcun indice ricostruito come parte di questo, dovrò esaminarlo. A parte questo, nessun GUID, ogni tabella ha una colonna di identità che è la chiave primaria.
DerekCate

-3
 create table #dblog (Databasename varchar(100),
                     logsize float,
                     logspace%] float,
                     [Status] int)

 insert into #dblog
 EXEC ('DBCC sqlperf(logspace)') 

 select * from #dblog

 alter table #dblog 
 add [lgspace used GB] float;

 update #dblog 
 set [lgspace used GB ] = (logsize*[logspace%]/1024)

 update #dblog 
 set [logsize] =([logsize]/1024)

 alter table #dblog 
 drop column [Status];

 select * from #dblog

 drop table #dblog
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.