Somos uma equipe de matemáticos (ou seja, sem experiência em DBA).
Temos um grande banco de dados no SQL Server 2012. Ele tem mais de 2 TB de dados (centenas de tabelas, cada uma com milhões de linhas e centenas de colunas de largura). Todos os meses, recebemos um pacote de adições e revisões dos dados, exigindo que realizemos extensas atualizações em nosso banco de dados, excluindo, substituindo ou atualizando a maioria ou todas as tabelas.
Nosso trabalho é principalmente focado na elaboração da lógica SQL para calcular os resultados que precisamos. Não estamos executando um call center em tempo real. Aplicamos alguns índices conforme necessário e estamos muito satisfeitos com o desempenho.
O problema é o arquivo de log. Naturalmente, o arquivo de log cresce e cresce com tanta manipulação de dados. Nosso arquivo de log atualmente tem cerca de 1 TB. Temos uma boa quantidade de espaço em disco, mas não é infinito.
Pelo que lemos na Internet, entendemos que o arquivo de log é necessário para a integridade da transação, reversões e recuperação. Mas para nossos propósitos específicos, não nos importamos com nada disso. Provavelmente nunca realizaremos uma reversão, nem tentaremos uma recuperação. Pior ainda, simplesmente baixaríamos os arquivos de dados novamente e criaríamos um novo banco de dados do zero.
Nós realmente queremos que o arquivo de log desapareça e nunca mais volte.
Definimos o modo de recuperação do banco de dados como Simples, pensando ingenuamente que isso significava "sem modo de recuperação", mas fomos rapidamente curados dessas ilusões.
Também entendemos que há muitas coisas erradas a não fazer (desapegar, encolher, etc.). Só não sabemos a coisa certa a fazer.
Talvez alguém sugira que definamos um limite para o crescimento do arquivo de log. No entanto, isso deixa duas questões: (1) Como nos livramos do 1 TB que já existe? (2) Tentamos isso anteriormente e, à medida que nos aproximamos do limite especificado, começamos a receber o erro 9002 (arquivo de log cheio) aqui, ali e em todos os lugares. Então agora temos medo de aplicar um limite de tamanho.
Como podemos dizer ao banco de dados "Sem arquivo de log, por favor" sem nenhum ressentimento?
Se você nunca prevê fazer uma restauração point-in-time, então você só precisa fazer 2 coisas:
No modo de recuperação SIMPLE, o arquivo de log é utilizado apenas para transações em processo . Quando a transação for concluída, o espaço no log tran será marcado para reutilização e a próxima transação apenas reutilizará o espaço*.
(* Isso não é estritamente verdade, existem "pontos de verificação" executados ocasionalmente que realmente liberam o espaço para reutilização, mas na maioria das vezes funciona sem intervenção; apenas DBAs meticulosos provavelmente se importarão com os detalhes internos aqui.)
Portanto, mantenha suas transações pequenas:
DELETE
de 100m de linhas (isso vai explodir o log), faça umTRUNCATE
em vez disso, ou apenasDROP
a tabela e recrie-a.WHERE
cláusulas mais seletivas para limitar suas atualizações a ~ 100k linhas por vez. Aprenda a usar cursores no SQLOs detalhes exatos dependerão do seu banco de dados real e da atividade real, é claro, mas um banco de dados com 1 TB de dados não deve ter um arquivo de log tran maior que, digamos, 100 Gb, dependendo do tamanho de seus lotes.
Com relação à redução do arquivo existente, você pode usar o script a seguir para ver o espaço livre/usado em seus dados e arquivos de log:
Se o espaço usado no log for alto, você provavelmente ainda terá transações abertas. Procure a ferramenta de terceiros
sp_WhoIsActive
para explorar sua atividade atual/transação aberta.Quando estiver pronto para encolher, escolha um tamanho de destino razoável e execute um SHRINKFILE:
(Esse tamanho está em MB).
Se o arquivo de log ainda crescer, volte para
sp_WhoIsActive
ver quais transações estão sendo executadas por tanto tempo e descubra como fazê-las em lotes.Só quero emendar mais uma coisa.
Pode ser importante lembrar ao autor original o fato de que "Não (transação) arquivo de log, por favor" é simplesmente impossível de alcançar - ao contrário de outros mecanismos de log de alguns serviços de rede simples que podem ser completamente desabilitados (servidores da web, por exemplo), logs de transações nunca podem ser descartados, mesmo no modelo de recuperação Simples. Impor um limite de tamanho no arquivo de log de transações não é recomendado, pois isso o levará ao erro 9002 quando você executar acidentalmente alguns lotes enormes. Em vez disso, seria melhor ficar de olho no tamanho do lote que você executa no banco de dados SQL Server, contendo assim o arquivo de log de transações em um tamanho aceitável.
Aqui está para se livrar do log de 1 TB para Non-DBA ou New-DBA. Supondo que você tenha o SSMS instalado.
Clique com o botão direito do mouse no banco de dados tem um arquivo de log enorme.
Por favor, escolha Arquivos -> Tipo de arquivo: Log, você verá 'Espaço livre disponível:'. Em ação Reduzir, Reorganizar páginas antes de liberar espaço não utilizado, Reduzir arquivo para ? MB(mínimo é 0 MB). Depois de especificar o valor, clique em OK.