A execução de comandos DBCC Shrink é um problema bastante controverso na comunidade do SQL Server. Neste artigo, revisaremos detalhes sobre esse comando e forneceremos uma breve visão geral de seu uso, além de alertar sobre os riscos de executar esse comando. Como DBAs, vários bancos de dados foram transferidos para outras equipes ou fornecedores, e nem sempre conseguimos gerenciar os bancos de dados que criamos. Como DBAs, sempre que estamos envolvidos em migrações ou novos projetos, precisamos garantir que planejamos cuidadosamente uma transição suave do banco de dados para produção e uso regular. É neste estágio que precisamos levar em consideração o tamanho do banco de dados. Você pode imaginar, você configura um aplicativo de banco de dados sem considerar a previsão de crescimento para o primeiro ano ou mais. Que tal você criar um banco de dados SQL Server com tamanho tão pequeno que precise crescer a cada dois dias elevando alertas de capacidade de disco no meio da noite? Pode parecer bobagem, mas na realidade, a verdade é que isso acontece, e isso às vezes pode não estar sob seu controle.
Alguns pontos a serem considerados para o DBA proativo
Antes de assumir o suporte dos bancos de dados de produção, certifique-se de verificar com seu antecessor quais são as previsões em termos de crescimento do banco de dados. O tamanho inicial dos bancos de dados que você gerenciará está dimensionado adequadamente? Não se preocupe muito se o tamanho atual do banco de dados for muito maior do que os dados que ele possui atualmente. Lembre-se, você não quer aquelas chamadas de capacidade de disco às 3:00 da manhã, quando você poderia ter evitado totalmente tendo um banco de dados dimensionado corretamente. É uma tendência geral para os administradores de banco de dados em todo o setor sacrificar suas vidas tarde da noite em questões mundanas que não deveriam ter ocorrido em primeiro lugar. Além disso, juntamente com o tamanho do banco de dados, lembre-se da capacidade do disco do servidor. Você não quer que o tamanho do disco seja muito pequeno do que um banco de dados pode acomodar. Essas são todas as coisas simples que são úteis no momento do planejamento. No entanto, como você sabe, nem sempre é um profissional de banco de dados que está instalando ou configurando bancos de dados em primeiro lugar. O ponto importante a ser observado é acertar o básico com seu banco de dados em termos de dimensionamento e talvez você não precise executar esse comando nunca. No entanto, como sempre, como um DBA, há momentos em que as coisas podem não estar sob seu controle e, durante esse período, você pode usar comandos de arquivo DBCC Shrink para uso eficiente.
Quando posso usar o DBCC ShrinkFile?
Você acabou de receber um alerta de espaço em disco bem no meio do sono e tem SLAs rigorosos para cumprir. O nível de prioridade é um P2 e o SLA pode violar muito em breve. E você percebe que a expansão do disco não acontecerá tão cedo, bem, nesse caso, mantenha seus comandos DBCC ShrinkFile à mão para que você possa usá-los para recuperar o espaço. Como o nome sugere, ele reduz o arquivo de dados ou arquivo de log do banco de dados. Mas antes de começar a executar os comandos DBCC ShrinkFile, tente verificar por que o arquivo de banco de dados está crescendo em primeiro lugar.
- O arquivo cresceu devido a alguma transação de longa duração?
- Existe algum tipo de bloqueio no servidor?
- Há algum lançamento importante de aplicativo acontecendo sobre o qual você não foi informado? (Isso acontece na maioria das vezes)
- Existe algum tipo de problema de replicação ou espelhamento de banco de dados causando o crescimento do banco de dados?
É importante obter respostas para essas perguntas o mais rápido possível. Geralmente, há uma resposta para todas essas perguntas e é uma ótima ferramenta gratuita chamada sp_whoisactive. Não há palavras para descrever o enorme uso dessa ferramenta e eu a usei em várias ocasiões para corrigir vários problemas relacionados à produção. Você pode baixar o código mais recente neste link:http://whoisactive.com/ . É fácil e simples de usar e retorna a saída rapidamente. Se você é um DBA experiente, já terá isso à sua disposição.
DBCC ShrinkFile com exemplos
A sintaxe para o DBCC ShrinkFile é simples e direta, consulte este exemplo abaixo.
use YOURDATABASE go DBCC Shrinkfile(FileName,1024)
O exemplo acima reduz FileName pertencente a YOURDATABASE para 1024 MB. Você pode executar a mesma operação usando o SQL Server Management Studio (SSMS). Clique com o botão direito do mouse no banco de dados, vá para Tarefas , selecione Reduzir e, em seguida, Arquivos .
Depois de clicar em Arquivos , você obterá esta janela.
Aqui, você tem a opção de selecionar o tipo de arquivo:Data, Log ou Filestream Data e realizar a “ação de redução” conforme necessário. É mais fácil usar o próprio comando DBCC para fins de redução.
Usando DBCC ShrinkFile com opções adicionais
Você pode executar o comando DBCC ShrinkFile com opções adicionais – emptyfile, notruncate ou truncateonly.
Arquivo vazio
Você pode usar o comando emptyfile como abaixo.
use YOURDATABASE go dbcc shrinkfile(FileName,emptyfile)
Isso ajudará a mover os dados para outros arquivos dentro do mesmo grupo de arquivos. Uma vez feito, você poderá excluir um arquivo de banco de dados se não for mais necessário. No entanto, há poucas coisas a serem observadas com esta opção emptyfile, pois você não poderá fazer muito para esvaziar o conteúdo do arquivo de dados primário com o ID do arquivo 1. Para obter o número do ID do arquivo, execute este script.
select file_id, name,physical_name from sys.database_files
Aqui, neste exemplo, o nome do arquivo é “mo” e file_id é 1. Ao tentar esvaziar o arquivo mo que possui file_id 1, você encontrará esta mensagem de erro.
Isso ocorre porque há informações do sistema no arquivo original, que não podem ser esvaziadas. Mas, se você tentar o mesmo comando no outro arquivo de dados “mo2data”, o comando de arquivo vazio será bem-sucedido.
Não executar
Como o nome sugere, não há espaço liberado para o sistema operacional. Isso é mais como uma operação interna dentro do arquivo onde as páginas são redistribuídas dentro do próprio arquivo sem alterar o tamanho geral do arquivo de banco de dados. Por causa disso, há uma enorme possibilidade de que a fragmentação seja introduzida. Veja o exemplo abaixo.
-- Example only Use YourDatabase go DBCC SHRINKFILE (filename,notruncate); GO
Truncar somente
Como o nome sugere, o espaço livre será liberado para o sistema operacional a partir do final do arquivo. Esta é de longe a operação mais segura que você pode executar usando DBCC ShrinkFile. Veja o exemplo abaixo.
-- Example only Use YourDatabase go DBCC SHRINKFILE (filename,truncateonly); GO
O que fazer quando DBCC ShrinkFile no log de transações não está funcionando conforme o esperado? Consulte este método seguro para corrigir o problema
Há momentos em que esse comando pode não funcionar conforme o esperado. Supondo que você tenha uma situação em que está tentando reduzir o arquivo de log de um banco de dados e parece não funcionar. Abaixo estão algumas das etapas que você pode seguir para entender por que o encolhimento não está funcionando conforme o esperado. Você notará que o arquivo reduzido será exibido como bem-sucedido, no entanto, não há redução no tamanho do arquivo de log. Nesse caso, execute este comando para verificar algumas coisas sobre o uso do arquivo de log.
select name,log_reuse_wait_desc,* from sys.databases
Na captura de tela, você pode ver que a coluna log_reuse_wait_desc está aguardando o backup do log.
Aqui, você pode ver que o backup de log para o banco de dados precisa ser executado antes que você possa realmente reduzir o arquivo de log. Se estiver em um banco de dados de produção, tente fazer o backup de log em outra unidade onde haja espaço disponível. Para realizar o backup de log, use o comando de amostra abaixo.
backup log DBName to disk='C:\Program Files\Microsoft SQL Server\MSSQL15.A1\MSSQL\Backup\DBName.trn' with init,stats,compression
Depois de executar o comando backup, execute o comando abaixo novamente para ver o status da coluna log_reuse_wait_desc.
select name,log_reuse_wait_desc,* from sys.databases
Na captura de tela, você pode ver que o status da coluna log_reuse_wait_desc mudou para “Nada”.
Aqui, você pode ver que o status da coluna “log_reuse_wait_desc” mudou para “Nada”. No seu caso, ainda pode aparecer como “LOG_BACKUP”. Continue a realizar os backups de log para o banco de dados até que o status mude para “Nada”. O motivo pelo qual você ainda pode ver o status “LOG_BACKUP” mesmo depois de realizar backups de log de transações é porque nenhum VLF pode ter sido limpo depois que você executou o backup de log de transações. VLF significa arquivos de log virtuais e faz parte da arquitetura interna do log de transações. Os arquivos de log de transações são compostos por esses VLFs. Você pode obter informações sobre os VLFs executando este comando.
select * from sys.dm_db_log_info(5)
Aqui 5 representa o database_id. A captura de tela da saída é mostrada. O número de linhas retornadas representa o número real de arquivos de log virtuais (VLFs) no banco de dados. Você pode verificar a coluna “vlf_status” para verificar o status do arquivo de log virtual. O valor 2 significa que está ativo. Com este comando, você pode verificar os sinalizadores internos no arquivo de log de transações para entender por que o log de transações não está sendo liberado mesmo após a execução de backups de log.
Anteriormente, o comando usado era DBCC LOGINFO que fornecia informações semelhantes.
O que fazer quando DBCC ShrinkFile no log de transações não está funcionando conforme o esperado? Algo que você pode executar em um ambiente não-produção. No entanto, não recomendado em ambiente de produção
Você teria encontrado em vários sites pessoas recomendando alterar o modelo de recuperação para um simples e, em seguida, executar um arquivo de redução para liberar espaço de volta para o sistema operacional. Lembre-se de que alterar o modelo de recuperação para um simples afetará a recuperação do seu banco de dados, pois você não poderá recuperar para um ponto específico no tempo. Isso novamente depende do SLA da sua empresa. Você pode alterar o modelo de recuperação usando T-SQL (abaixo) ou usando a GUI.
alter database DB_NAME set recovery simple
Usando a GUI, altere o modelo de recuperação conforme mostrado. Clique com o botão direito do mouse no banco de dados, vá em “Propriedades”, clique em “Opções”. Em "Opções", selecione o "Modelo de recuperação".
Você notará que apenas alterar o modelo de recuperação para Simples não liberará o espaço de volta para o sistema operacional. Você precisaria executar explicitamente o comando DBCC ShrinkFile para reduzir o arquivo e recuperar o espaço. Veja o script de exemplo abaixo. Este comando reduzirá seu FileName para 1024 MB.
use YOURDATABASE go DBCC Shrinkfile(FileName,1024)
Opção de redução automática do banco de dados
Você notará que existe uma opção conhecida como “Auto Shrink” nas propriedades do banco de dados. Basta clicar com o botão direito do mouse no banco de dados para visualizar a propriedade do banco de dados. Na seção de opções, você verá esta opção conforme mostrado. Na configuração do banco de dados do modelo, você pode ver que a opção “Auto Shrink” está desabilitada por padrão. Assim, sempre que um novo banco de dados é criado, essa opção também fica desabilitada. Pode haver alguns casos em que os profissionais de banco de dados podem, sem saber, deixar essa opção ativada sem estarem cientes das consequências negativas de deixá-la ativada.
Execute este comando para verificar o status desta opção para os bancos de dados no servidor.
select name,is_auto_shrink_on,* from sys.databases
Você verá esta saída.
Se, por acaso, você vir que ele está ativado, você pode desativá-lo usando a GUI ou pode executar o comando abaixo no banco de dados.
ALTER DATABASE YOUR_DATABASE set AUTO_SHRINK OFF
Outras sugestões de manutenção
Consulte estas poucas dicas adicionais para evitar o problema de crescimento do banco de dados, devido ao qual você precisa executar comandos DBCC ShrinkFile.
- Certifique-se de que o modelo de recuperação de seus bancos de dados esteja alinhado com os SLAs de negócios. Se o seu negócio não requer uma recuperação pontual para bancos de dados de teste, basta deixá-los em um modelo de recuperação Simples. Eu vi várias ocasiões em que o modelo de recuperação dos bancos de dados estava completo quando as coisas estavam bem com a recuperação usando o backup completo mais recente
- Garantir o monitoramento adequado, especialmente com o crescimento do banco de dados. Você deve ser alertado quando a utilização do arquivo de log atingir 85%. Isso lhe dará algum tempo para resolver o problema de espaço
- Certifique-se de que backups de log regulares sejam feitos se o banco de dados estiver no modelo de recuperação completa e você deve ser alertado se algum dos backups de log falhar
- Certifique-se de que haja espaço suficiente nas unidades do banco de dados para evitar problemas de falta de espaço
- Para bancos de dados que podem ser arquivados, desenvolva algumas estratégias de arquivamento para que você possa mover dados mais antigos para outro banco de dados para criar relatórios e tornar esse banco de dados somente leitura. Isso lhe dará mais controle em termos de dimensionamento de banco de dados
- Certifique-se de realizar verificações de integridade regularmente em seu banco de dados usando o DBCC CheckDB. Para obter mais informações, consulte este artigo:https://codingsight.com/dbcc-checkdb-overview/
Conclusão
- A partir deste artigo, você entendeu bem como usar o comando DBCC ShrinkFile
- Você aprendeu sobre os riscos de executar os comandos DBCC ShrinkFile
- Você aprendeu as diferentes opções que podemos fornecer usando os comandos DBCC ShrinkFile
- Você viu as opções que podemos tentar se o log de transações não estiver diminuindo usando os comandos DBCC ShrinkFile
- Você aprendeu sobre a configuração padrão de redução automática na propriedade do banco de dados
- Você também aprendeu outras sugestões de manutenção de banco de dados para manter seus bancos de dados saudáveis
- Finalmente, certifique-se de estar pronto para os dias de folga que podem não estar sob seu controle