Tenho o mesmo problema e acredito que o resolvi, mas não pude testá-lo completamente para confirmar.
Acredito que os problemas estejam relacionados ao número de VLFs que você possui no arquivo de log e não ao seu tamanho. Se você tiver um grande arquivo de log, é provável que ele tenha crescido organicamente através de eventos de crescimento automático e que não foi um crescimento planejado intencional. Se for esse o caso, você pode ter milhares de VLFs dentro dos arquivos de log.
Aqui está uma consulta para ver quantos VLFs você tem que usei aqui :
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;
Para uma explicação mais detalhada do que são as VLFs, consulte este link .
Acredito que o problema é que, com tantas VLFs, o SQL Server leva muito tempo para avaliar seu estado e depois recuperar o banco de dados da recuperação. Se você reduzir o arquivo de log para o menor tamanho possível, geralmente o tamanho do primeiro VLF que foi criado no arquivo de log, você poderá imediatamente aumentá-lo intencionalmente novamente e, assim, criar o número certo de VLFs (algo menor que 16)
Quando isso estiver concluído, acredito que você poderá ver que seu banco de dados sai da recuperação muito mais rapidamente.
Não tive a chance de testar o failover de nossas instâncias de produção depois que resolvi nossos próprios problemas de VLF, portanto, ficaria muito curioso para confirmar se essa é a causa raiz do problema. Experimentalmente, vi o tempo que leva para sair da restauração em nosso ambiente de preparação reduzido drasticamente devido a isso, espero que seja isso.