Uma resposta mais curta:
Você provavelmente possui uma transação de longa execução (manutenção do índice? Exclusão ou atualização em lote grande?) Ou está no modo de recuperação "padrão" (mais abaixo, sobre o que se entende por padrão) Full
e não fez um backup de log (ou não os tomem com frequência suficiente).
Se for um problema do modelo de recuperação, a resposta simples pode ser Alternar para o Simple
modo de recuperação se você não precisar de recuperação pontual e backups regulares de log. Muitas pessoas, no entanto, dão essa resposta sem entender os modelos de recuperação. Leia para entender por que isso importa e depois decida o que você faz. Você também pode começar a fazer backups de log e permanecer em Full
recuperação.
Pode haver outros motivos, mas estes são os mais comuns. Essa resposta começa a se aprofundar nos dois motivos mais comuns e fornece algumas informações básicas sobre o porquê e como os motivos subjacentes, além de explorar outros motivos.
Uma resposta mais longa:
quais cenários podem fazer com que o log continue crescendo? Há muitos motivos, mas geralmente esses são os dois padrões a seguir: Há um mal-entendido sobre modelos de recuperação ou há transações de execução longa. Leia para detalhes.
Principal motivo 1/2: Não compreendendo os modelos de recuperação
( Estar no modo de recuperação total e não fazer backups de log - esse é o motivo mais comum - a grande maioria dos que estão enfrentando esse problema ) .
Embora essa resposta não seja um mergulho profundo nos modelos de recuperação do SQL Server, o tópico dos modelos de recuperação é crítico para esse problema.
No SQL Server, existem três modelos de recuperação :
Full
,
Bulk-Logged
e
Simple
.
Por Bulk-Logged
enquanto, ignoraremos que dizeremos que é um modelo híbrido e a maioria das pessoas que estão nesse modelo está lá por uma razão e entende os modelos de recuperação.
Os dois nos preocupamos e sua confusão são a causa da maioria dos casos de pessoas com este problema são Simple
e Full
.
Intermissão: Recuperação em Geral
Antes de falarmos sobre modelos de recuperação: vamos falar sobre recuperação em geral. Se você quiser se aprofundar ainda mais neste tópico, basta ler o blog de Paul Randal e quantas postagens você quiser. Para esta pergunta, no entanto:
Recuperação de falha / reinicialização
Um objetivo do arquivo de log de transações é a recuperação de falha / reinicialização . Para avançar e retroceder o trabalho que foi feito (avançar / refazer) antes de uma falha ou reiniciar e o trabalho iniciado mas não foi concluído após uma falha ou reiniciar (retroceder / desfazer). É o trabalho do log de transações verificar se uma transação foi iniciada, mas nunca foi concluída (reversão ou falha / reinicialização antes da confirmação da transação). Nessa situação, é tarefa do log dizer "Ei ... isso nunca realmente terminou, vamos reverter" durante a recuperação. Também é tarefa do log verificar que você terminou algo e que seu aplicativo cliente foi informado de que estava concluído (mesmo que ainda não tenha endurecido em seu arquivo de dados) e diga"Ei ... isso realmente aconteceu, vamos avançar, vamos fazer como os aplicativos pensam que era" após uma reinicialização. Agora há mais, mas esse é o objetivo principal.
Recuperação pontual
O outro objetivo de um arquivo de log de transações é poder nos recuperar para um ponto no tempo devido a um "ops" em um banco de dados ou garantir um ponto de recuperação no caso de uma falha de hardware envolvendo os dados e / ou arquivos de log de um banco de dados. Se esse log de transações contiver os registros de transações iniciadas e concluídas para recuperação, o SQL Server poderá e poderá usar essas informações para obter um banco de dados onde estava antes de ocorrer um problema. Mas isso nem sempre é uma opção disponível para nós. Para que isso funcione, precisamos ter nosso banco de dados no modelo de recuperação correto e precisamos fazer backups de log .
Modelos de recuperação
Nos modelos de recuperação:
Modelo de recuperação simples
Portanto, com a introdução acima, é mais fácil falar sobre o Simple Recovery
modelo primeiro. Neste modelo, você está dizendo ao SQL Server: "Eu estou bem com você usando seu arquivo de log de transações para travar e reiniciar a recuperação ..." (Você realmente não tem escolha lá. Procure propriedades ACID e isso deve fazer sentido rapidamente). "... mas quando você não precisar mais dele para esse fim de recuperação de falha / reinicialização, vá em frente e reutilize o arquivo de log."
O SQL Server escuta essa solicitação na Recuperação Simples e mantém apenas as informações necessárias para travar / reiniciar a recuperação. Quando o SQL Server tiver certeza de que pode se recuperar porque os dados estão protegidos para o arquivo de dados (mais ou menos), os dados que foram protegidos não são mais necessários no log e são marcados para truncamento - o que significa que são reutilizados.
Modelo de recuperação completa
Com Full Recovery
, você está dizendo ao SQL Server que deseja recuperar para um momento específico, desde que seu arquivo de log esteja disponível ou para um momento específico coberto por um backup de log. Nesse caso, quando o SQL Server atingir o ponto em que seria seguro truncar o arquivo de log no Simple Recovery Model, ele não fará isso. Em vez disso, ele permite que o arquivo de log continue a crescer e continuará crescendo, até você fazer um backup de log (ou ficar sem espaço na unidade de arquivo de log) em circunstâncias normais.
Mudar de Simples para Cheio tem uma opção.
Existem regras e exceções aqui. Falaremos sobre transações de longa duração em profundidade abaixo.
Mas uma ressalva a ter em mente para o Modo de recuperação completa é a seguinte: se você simplesmente alternar para o Full Recovery
modo, mas nunca fizer um backup completo inicial, o SQL Server não atenderá à sua solicitação de estar no Full Recovery
modelo. Seu log de transações continuará a funcionar como está Simple
até você alternar para o Modelo de recuperação completa e executar o seu primeiro Full Backup
.
O modelo de recuperação completa sem backups de log é ruim.
Então, esse é o motivo mais comum para o crescimento descontrolado de logs? Resposta: Estar no modo de recuperação total sem ter backups de log.
Isso acontece todo o tempo com as pessoas.
Por que esse erro é tão comum?
Por que isso acontece o tempo todo? Como cada novo banco de dados obtém sua configuração inicial do modelo de recuperação, observando o banco de dados do modelo.
A configuração inicial do modelo de recuperação do modelo é sempre Full Recovery Model
- até e a menos que alguém mude isso. Então, você poderia dizer que o "Modelo de recuperação padrão" é Full
. Muitas pessoas não sabem disso e seus bancos de dados são executados Full Recovery Model
sem backups de log e, portanto, um arquivo de log de transações muito maior que o necessário. É por isso que é importante alterar os padrões quando eles não funcionam para sua organização e suas necessidades)
O modelo de recuperação completa com poucos backups de log é ruim.
Você também pode ter problemas aqui, não fazendo backups de log com frequência suficiente.
Fazer um backup de log por dia pode parecer bom, faz com que uma restauração exija menos comandos de restauração, mas lembre-se da discussão acima, esse arquivo de log continuará a crescer até que você faça backups de log.
Como descubro qual frequência de backup de log eu preciso?
Você precisa considerar sua frequência de backup de log com duas coisas em mente:
- Necessidades de recuperação - esperamos que seja a primeira. No caso de a unidade que hospeda seu log de transações ficar ruim ou você sofrer uma corrupção séria que afeta seu backup de log, quantos dados podem ser perdidos? Se esse número não exceder 10 a 15 minutos, será necessário fazer o backup do log a cada 10 a 15 minutos, final da discussão.
- Crescimento de log - Se sua organização está bem em perder mais dados, devido à capacidade de recriar facilmente naquele dia, você pode estar bem em ter um backup de log com muito menos frequência que 15 minutos. Talvez sua organização esteja bem a cada 4 horas. Mas você precisa analisar quantas transações você gera em 4 horas. Permitir que o log continue crescendo nessas quatro horas tornará um arquivo de log muito grande? Isso significa que seus backups de log demoram muito?
Principal motivo 2/2: transações de longa duração
( "Meu modelo de recuperação está bom! O log ainda está crescendo! )
Isso também pode ser uma causa de crescimento descontrolado e descontrolado de logs. Não importa o modelo de recuperação, mas muitas vezes aparece como "Mas eu estou no Modelo de Recuperação Simples - por que meu log ainda está crescendo ?!"
O motivo aqui é simples: se o SQL estiver usando esse log de transações para fins de recuperação, como descrevi acima, ele deverá voltar ao início de uma transação.
Se você tiver uma transação que leva muito tempo ou faz muitas alterações, o log não pode truncar no ponto de verificação para nenhuma das alterações que ainda estão em transações abertas ou que foram iniciadas desde o início da transação.
Isso significa que uma grande exclusão, excluindo milhões de linhas em uma instrução de exclusão, é uma transação e o log não pode truncar até que toda a exclusão seja concluída. Em Full Recovery Model
, essa exclusão é registrada e pode haver muitos registros de log. O mesmo ocorre com o trabalho de otimização de índice durante as janelas de manutenção. Isso também significa que o gerenciamento deficiente da transação e a falta de atenção e fechamento de transações abertas podem realmente prejudicar você e seu arquivo de log.
O que posso fazer sobre essas transações de longa duração?
Você pode se salvar aqui:
- Dimensione adequadamente seu arquivo de log para dar conta do pior cenário possível - como sua manutenção ou grandes operações conhecidas. E ao aumentar seu arquivo de log, você deve seguir estas orientações (e os dois links para os quais ela envia) de Kimberly Tripp. O dimensionamento correto é super crítico aqui.
- Observando seu uso de transações. Não inicie uma transação no servidor de aplicativos e comece a ter longas conversas com o SQL Server e corre o risco de deixar uma aberta por muito tempo.
- Observando as transações implícitas em suas instruções DML. Por exemplo:
UPDATE TableName Set Col1 = 'New Value'
é uma transação. Eu não coloquei um BEGIN TRAN
lá e não preciso, ainda é uma transação que é confirmada automaticamente quando concluída. Portanto, se estiver executando operações em um grande número de linhas, considere agrupar essas operações em blocos mais gerenciáveis e dar tempo ao log para recuperar. Ou considere o tamanho certo para lidar com isso. Ou talvez veja como alterar os modelos de recuperação durante uma janela de carregamento em massa.
Esses dois motivos também se aplicam ao envio de logs?
Resposta curta: sim. Resposta mais longa abaixo.
Pergunta: "Estou usando o envio de logs, para que meus backups sejam automatizados ... Por que ainda estou vendo o crescimento do log de transações?"
Resposta: continue a ler.
O que é o Log Shipping?
O envio de logs é exatamente o que parece - você está enviando seus backups de log de transações para outro servidor para fins de recuperação de desastres. Há alguma inicialização, mas depois disso o processo é bastante simples:
- Um trabalho para fazer backup do log em um servidor,
- um trabalho para copiar esse backup de log e
- um trabalho para restaurá-lo sem recuperação (
NORECOVERY
ou STANDBY
) no servidor de destino.
Existem também alguns trabalhos para monitorar e alertar se as coisas não saírem conforme o planejado.
Em alguns casos, convém restaurar a remessa de logs apenas uma vez por dia ou a cada três dias ou uma vez por semana. Está bem. Mas se você fizer essa alteração em todos os trabalhos (incluindo os trabalhos de backup e cópia de log), significa que estará aguardando o tempo todo para fazer um backup de log. Isso significa que você terá muito crescimento de log - porque está no modo de recuperação completa sem backups de log - e provavelmente também significa um grande arquivo de log para copiar. Você só deve modificar o agendamento da tarefa de restauração e permitir que os backups e cópias de log ocorram com mais frequência; caso contrário, sofrerá com o primeiro problema descrito nesta resposta.
Solução de problemas gerais via códigos de status
Há outras razões além dessas duas, mas essas são as mais comuns. Independentemente da causa: existe uma maneira de analisar o motivo desse crescimento inexplicável de log / falta de truncamento e ver o que eles são.
Ao consultar a sys.databases
exibição do catálogo, é possível ver informações que descrevem o motivo pelo qual o arquivo de log pode estar aguardando truncar / reutilizar.
Há uma coluna chamada log_reuse_wait
com um ID de pesquisa do código de razão e uma log_reuse_wait_desc
coluna com uma descrição do motivo da espera. No artigo on-line dos livros referenciados, encontram-se a maioria dos motivos (os que você provavelmente verá e os que podemos explicar). Os desaparecidos estão fora de uso ou para uso interno) com algumas notas sobre a espera itálico :
0 = Nada
Como parece ... Não deveria estar esperando
1 = Ponto de verificação
Aguardando a ocorrência de um ponto de verificação. Isso deve acontecer e você deve ficar bem - mas há alguns casos a serem procurados aqui para obter respostas ou edições posteriores.
2 = Backup de log
Você está aguardando a ocorrência de um backup de log. Você os tem agendado e isso acontecerá em breve, ou você tem o primeiro problema descrito aqui e agora sabe como corrigi-lo
3 = Backup ou restauração ativa
Uma operação de backup ou restauração está em execução no banco de dados
4 = Transação ativa
Há uma transação ativa que precisa ser concluída (de qualquer maneira - ROLLBACK
ou COMMIT
) antes que o backup possa ser efetuado. Este é o segundo motivo descrito nesta resposta.
5 = Espelhamento de banco de dados
Um espelho está ficando para trás ou sob alguma latência em uma situação de espelhamento de alto desempenho ou o espelhamento está em pausa por algum motivo
6 = Replicação
Pode haver problemas com a replicação que causariam isso - como um agente de leitor de log não sendo executado, um banco de dados pensando que está marcado para replicação que não existe mais e por vários outros motivos. Você também pode ver esse motivo e é perfeitamente normal, porque você está olhando na hora certa, assim como as transações estão sendo consumidas pelo leitor de log
7 = Criação de instantâneo de banco de dados
Você está criando um instantâneo de banco de dados e verá isso se observar o momento certo enquanto um instantâneo está sendo criado
8 = Verificação de log
Ainda não encontrei um problema com isso funcionando para sempre. Se você procurar por tempo suficiente e com frequência suficiente, poderá ver isso acontecer, mas isso não deve ser uma causa do crescimento excessivo do log de transações, como eu já vi.
9 = Uma réplica secundária do AlwaysOn Availability Groups está aplicando registros de log de transações desse banco de dados a um banco de dados secundário correspondente.
Sobre a descrição mais clara até o momento ..