Eu já tive esse problema antes.
- Você tem um grande banco de dados e uma pequena unidade de log. Você deseja reorganizar (por vários motivos).
- Quando você tenta fazer isso em uma tabela fragmentada grande, o log é preenchido até que a unidade de log esteja cheia e o comando é interrompido.
- Se estiver no modo simples, outras transações poderão falhar até que o log seja limpo no próximo ponto de verificação e, se estiver no modo completo, outras transações poderão falhar até o próximo backup de log. Outage!
- Se você estiver no modo completo, você aumenta sua frequência de backup de log, mas isso não ajuda a evitar o problema, porque a reorganização é feita em uma transação implícita, o log não é limpo até que a transação seja concluída, interrompida ou interrompida.
- E você REALMENTE deseja que essa reorganização seja executada até a conclusão.
Isso é um pouco contra-intuitivo, porque você sabe que, se você interromper a reorganização, ela pode continuar de onde parou, é apenas que um cancelamento confirma a transação em vez de reverter.
Aqui está o que você faz. É um pouco longo, mas direto.
- Faça um pré-crescimento do seu arquivo de log para um tamanho relativamente grande, mas não o máximo. Basicamente, você deseja deixar espaço suficiente para realizar um trabalho útil, além de alguns pequenos crescimentos, se ocorrerem, para que as operações normais não parem.
- Crie um trabalho para executar a reorganização do seu índice ('Reorganizar').
Crie um alerta WMI do agente ('Reorganize Relief Valve') em uma condição de desempenho.
- Objeto: SQLServer: bancos de dados
- Contador: log de porcentagem usado
- Instância: (seu grande nome de banco de dados)
- Alerta se o contador ultrapassar: 80
- Resposta: Executar trabalho ('Reorganizar verificação')
Criar um trabalho ('Reorganizar verificação')
- No trabalho, verifique msdb.dbo.sysjobactivity para ver se o trabalho 'Reorganizar' está em execução. E se for ...
- Pare o trabalho e faça uma sondagem até que ele pare. Isso pode levar alguns segundos.
- (Se você estiver no modo completo) Acione sua tarefa de backup de log e confirme quando ela terminar.
- Verifique novamente os sys.dm_os_performance_counters que seu contador de espaço livre de log reduziu abaixo do seu limite.
- Inicie o trabalho 'Reorganizar'.
Teste tudo isso em algum lugar, até mesmo uma sandbox de desenvolvimento, para garantir que ele funcione corretamente antes de colocá-lo no servidor de produção.
O que você verá é que o trabalho 'Reorganizar' é iniciado e começa a preencher o log. Quando o log atinge uma porcentagem cheia, ele dispara o alerta WMI (em cerca de 30s), que executa seu outro trabalho, o que indica que o trabalho 'Reorganizar' está em execução e provavelmente com falha. Em seguida, para 'Reorganizar', faz um backup, confirma que o espaço livre do log voltou a um valor razoável e inicia o trabalho 'Reorganizar' novamente, que continuará de onde parou.
Portanto, o motivo pelo qual você pré-dimensiona seu log para um valor razoável nesse cenário é reduzir o número de crescimento / acionador / trabalho / parada / reinicialização, para que ele possa ser mais eficiente e também mantenha espaço suficiente para o crescimentos ocasionais que não são capturados a tempo.
Este é um tipo de cenário estranho. Eu tenho certeza que eu teria enganado isso há alguns anos atrás e, obviamente, há questões subjacentes fundamentais em mãos aqui. Mas se você lida com centenas de servidores, surgirão alguns casos extremos que não podem ser tratados de forma alguma, por qualquer motivo comercial, exceto pelo MacGyvering, uma solução temporária que faz o trabalho.
Desde que seja seguro, lógico, testado e bem documentado, não deve haver problema.