Mam ten sam problem i wydaje mi się, że go rozwiązałem, ale nie byłem w stanie w pełni go przetestować, aby potwierdzić.
Uważam, że problemy są związane z liczbą plików VLF, które masz w pliku dziennika, a nie z ich rozmiarem. Jeśli masz duży plik dziennika, prawdopodobne jest, że urósł on organicznie poprzez zdarzenia związane z automatycznym wzrostem i że nie był to zamierzony wzrost. W takim przypadku możesz mieć tysiące plików VLF w plikach dziennika.
Oto zapytanie, aby zobaczyć, ile masz VLF, których użyłem tutaj :
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;
Aby uzyskać dodatkowe wyjaśnienie, jakie są VLF, zobacz ten link .
Uważam, że problem polega na tym, że przy tak dużej liczbie VLF serwer SQL zajmuje dużo czasu, aby ocenić ich stan, a następnie wyciągnąć bazę danych z odzyskiwania. Jeśli zmniejszysz plik dziennika do najmniejszego możliwego rozmiaru, często rozmiar pierwszego pliku VLF, który został utworzony w pliku dziennika, możesz natychmiast celowo go powiększyć, aby w ten sposób utworzyć odpowiednią liczbę plików VLF (mniej niż 16).
Po zakończeniu tej operacji uważam, że będzie można znacznie szybciej odzyskać bazę danych.
Po rozwiązaniu własnych problemów z VLF nie miałem okazji przetestować przełączania awaryjnego naszych instancji produkcyjnych, więc byłbym bardzo ciekawy, czy możesz potwierdzić, że jest to podstawowa przyczyna problemu. Eksperymentalnie widziałem, jak dużo czasu potrzeba, aby wyjść z przywracania w naszym środowisku inscenizacji dramatycznie zmniejszone z tego powodu, więc mam nadzieję, że o to chodzi.