Il database si avvia sempre in modalità di ripristino


11

Ogni volta che riavvio il mio server, il database è sempre in modalità di ripristino e ci vogliono circa 20 minuti perché si comporti normalmente. Questo succede sempre e solo quando riavvio il server, quindi ho alcune domande ...

  1. Mi è stato detto che questo potrebbe essere causato da un file di registro di grandi dimensioni? Potrebbe essere corretto? In caso contrario, quali potrebbero essere le altre cause?
  2. Devo ridurre lo spazio del file di registro per impedire i ripristini. Cosa c'è di meglio: restringersi o troncare?
  3. Come posso ridurre o troncare un file di registro / database per ridurre le dimensioni? Qual è la sintassi?

Attualmente sto usando Microsoft SQL Server 2008.


Tendi ad avere transazioni di grandi dimensioni in volo quando chiudi? Qual è l'intervallo di ripristino impostato su?
Martin Smith,

nessuna azione viene eseguita 20 minuti prima del riavvio del server, a parte le istruzioni select, l'intervallo è impostato su 0.

Con quale frequenza inizi? Con quale frequenza esegui il backup del database? Mi chiedo perché stai riavviando il server regolarmente? Per essere completo, è possibile controllare manualmente un database (che cancella il registro) se necessario.
Lynn Langit,

"Per essere completo, puoi controllare manualmente un database (che cancella il registro) se necessario." Come può essere fatto? e quando dici cancella un registro, vuoi dire, non usare o semplicemente cancellare il registro?

Informazioni insufficienti. Modello di recupero? Stai utilizzando funzionalità come il mirroring o la replica? Dimensioni del database e dei file coinvolti? Il database di gestire eventuali operazioni di grandi dimensioni?
Jon Seigel,

Risposte:


6

Ho lo stesso problema e credo di averlo risolto ma non sono stato in grado di testarlo completamente per confermare.

Credo che i problemi siano legati al numero di VLF presenti nel file di registro e non alle sue dimensioni. Se si dispone di un file di registro di grandi dimensioni, è probabile che sia cresciuto organicamente attraverso eventi di crescita automatica e che non si sia trattato di una crescita intenzionale pianificata. In tal caso, potresti avere migliaia di VLF all'interno dei file di registro.

Ecco una query per vedere quanti VLF hai che ho usato da qui :

    Create Table #stage(
    FileID      int
  , FileSize    bigint
  , StartOffset bigint
  , FSeqNo      bigint
  , [Status]    bigint
  , Parity      bigint
  , CreateLSN   numeric(38));

Create Table #results(
    Database_Name   sysname
  , VLF_count       int 
);

Exec sp_msforeachdb N'Use ?; 
            Insert Into #stage 
            Exec sp_executeSQL N''DBCC LogInfo(?)''; 

            Insert Into #results 
            Select DB_Name(), Count(*) 
            From #stage; 

            Truncate Table #stage;'

Select * 
From #results
Order By VLF_count Desc;

Drop Table #stage;
Drop Table #results;

Per un'ulteriore spiegazione di cosa sono i VLF vedere questo link .

Credo che il problema sia che con così tanti VLF il server SQL impiega molto tempo a valutare il loro stato e quindi a ripristinare il database. Se riduci il tuo file di registro alla dimensione più piccola possibile, spesso la dimensione del primo VLF che è stato creato nel file di registro, puoi immediatamente ridimensionarlo intenzionalmente e quindi far sì che crei il giusto numero di VLF (qualcosa di meno di 16).

Una volta completato, credo che sarai in grado di vedere che il tuo database esce dal recupero molto più velocemente.

Non ho avuto la possibilità di testare il failover delle nostre istanze di produzione dopo aver risolto i nostri problemi VLF, quindi sarei molto curioso di poter confermare che questa è la causa principale del problema. Sperimentalmente ho visto il tempo necessario per uscire dal ripristino nel nostro ambiente di stadiazione drasticamente ridotto a causa di ciò, si spera che sia così.



2

Da questo articolo MSDN :

Le transazioni senza commit a lungo termine aumentano i tempi di recupero per tutti i tipi di checkpoint.

In genere non è consigliabile eseguire alcun tipo di restringimento DBCC su database di produzione. Anche il comportamento del troncamento del registro è cambiato dalle versioni precedenti al 2008 (grazie a @Edward) - per questo blog :

Il registro di backup con trucate_only non è più supportato in SQL 2008. Se il database è nel modello di recupero completo o registrato in blocco, pianificare il backup di T-Log a intervalli regolari e manterrà la forma del T-log.

Ancora una volta, citerò, con quale frequenza esegui il backup del database? In genere, i backup regolari "gestiscono" la dimensione del registro in modo ottimale.


0

Ridurre le dimensioni del registro delle transazioni online può risolvere il problema, ad esempio accelerare la connessione online del database, ma prima di procedere è necessario considerare il ripristino di emergenza. Si noti che se si utilizza il modello di recupero semplice, non sarà possibile ripristinare in un determinato momento. D'altra parte, se si utilizza il modello di recupero COMPLETO, il modo migliore per mantenere le dimensioni del registro delle transazioni online è creare un backup del registro delle transazioni su base regolare (pianificarlo).

Troncare il registro delle transazioni non libera spazio sul disco rigido fisico, ma consente solo a SQL Server di riutilizzare quello spazio per le transazioni che si sono verificate dall'ultimo CHEKPOINT (dall'ultimo backup del registro delle transazioni).

Se riduci il database, riduci le dimensioni dei file. Per ridurre il database MyDB del 15 percento:

DBCC SHRINKDATABASE (MyDB, 15); PARTIRE

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.