Eu herdei um banco de dados de 10 GB com um log de 80 GB [apenas 3% em uso de acordo com DBCC SQLPERF (logspace)]. Parece seguro presumir que o crescimento extremo do log foi devido a problemas muito antes de eu ser contratado.
O primário tem um trabalho de backup de envio de log executado a cada 15 minutos. O primário tem tarefas de cópia e restauração executadas a cada 15 minutos.
Quando tento reduzir o log, recebo "Não é possível reduzir o arquivo de log 2 (DatabaseName_log) porque o arquivo de log lógico localizado no final do arquivo está em uso". Eu tentei isso várias vezes com 15 minutos de intervalo e até dias de intervalo, mas sempre obtive o mesmo resultado.
DBCC LOGINFO mostra 784 VLFs, com apenas o primeiro 245 e o último com um status de 2. p_WhoIsActive mostra que a transação aberta mais longa foi executada por menos de 2 horas (transações longas não são incomuns aqui devido a um terceiro Microsoft Acesse o aplicativo com problemas de driver ODBC).
Como posso reduzir esse log com êxito (sem criar uma interrupção para os usuários)?
Obrigado, Marcos
A solução mais fácil para esse problema é definir o banco de dados para recuperação simples, reduzir o log e configurá-lo novamente para recuperação total. Em T-SQL isso seria:
Mudar o banco de dados para recuperação simples pode fazer com que as transações parem de ser replicadas, mas se agendadas fora do horário de trabalho, o log deve ser reduzido e retornar à recuperação total sem efeitos colaterais.
Se isso for inaceitável, você pode usar o procedimento armazenado sp_repldone para marcar manualmente as transações como distribuídas e redefinir o status de replicação de transações inválidas:
Você poderia executar um script como este para tentar a operação de redução uma vez a cada minuto até que ela seja concluída ou seja executada 1.000 vezes. Como sempre, use por sua conta e risco - e teste primeiro em um ambiente que não seja de produção.
Ao testar meu plano de backup em um servidor de teste de VM desconectado da rede, eu estava executando um backup e usei apenas o comando encolher. Eu uso um modelo de recuperação SIMPLES, mesmo assim tive que forçar a configuração do banco de dados para o modo SIMPLE, só assim poderia encolher meus t-logs. A conclusão parece que se você tem um banco de dados no modelo de recuperação SIMPLE, não FULL você ainda precisa destes comandos: ALTER DATABASE [database] SET RECOVERY SIMPLE WITH NO_WAIT DBCC SHRINKFILE([logfilename], 1)