У меня та же проблема, и я думаю, что я решил ее, но я не смог полностью проверить ее, чтобы подтвердить.
Я полагаю, что проблема связана с количеством 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, поэтому мне было бы очень любопытно, если бы вы могли подтвердить, что это является основной причиной проблемы. Экспериментально я видел, что время, необходимое для восстановления нашей промежуточной среды, значительно сократилось из-за этого, надеюсь, так оно и есть.