同じ問題があり、解決したと思いますが、十分にテストして確認することができませんでした。
問題は、ログファイルにあるVLFの数ではなく、サイズに関連していると思います。大きなログファイルがある場合、自動成長イベントによって有機的に成長した可能性があり、意図的な計画的な成長ではなかった可能性があります。その場合は、ログファイル内に何千ものVLFがある可能性があります。
ここに、私がここから使用した VLFの数を確認するクエリがあります。
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;
VLFの詳細については、このリンクを参照してください。
問題は、非常に多くのVLFがあると、SQLサーバーがその状態を評価してデータベースを回復できなくなるまでに長い時間がかかることです。ログファイルを可能な限り最小のサイズ(多くの場合、ログファイルで作成された最初のVLFのサイズ)に縮小すると、すぐに意図的に再度拡大して、適切な数のVLFを作成できます( 16)。
これが完了すると、データベースのリカバリがはるかに速くなることがわかります。
私は自分のVLF問題を解決した後、本番インスタンスのフェイルオーバーをテストする機会がなかったので、これが問題の根本的な原因であることを確認できたら非常に興味があります。実験的に、ステージング環境でのリストアから抜け出すのにかかる時間が劇的に短縮されたので、うまくいけばそれだけです。