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ì.