Reduzindo um banco de dados

É possível reduzir cada arquivo dentro de um banco de dados para remover páginas sem utilização. Embora o Mecanismo de Banco de Dados reutilize efetivamente os espaços, há momentos em que um arquivo não necessita mais ser tão grande quanto era; pode ser necessário reduzir o arquivo. É possível reduzir dados e arquivos de log de transações. Os arquivos de banco de dados podem ser reduzidos manualmente, como um grupo ou individualmente, ou podem ser configurados para redução automática em intervalos especificados.

Os arquivos são sempre reduzidos a partir do final. Por exemplo, se o arquivo tiver 5 GB e você especificar 4 GB como target_size (tamanho-alvo) na instrução DBCC SHRINKFILE, o Mecanismo de Banco de Dados liberará o máximo de espaço possível a partir do último 1 GB do arquivo. Se houver páginas que estão em uso na parte do arquivo a ser liberada, primeiro o Mecanismo de Banco de Dados realoca essas páginas para a parte do arquivo que será mantida. Só é possível reduzir um banco de dados até que não haja espaço livre remanescente. Por exemplo, se um arquivo de 5 GB tiver 4 GB de dados e você especificar 3 GB como target_size (tamanho-alvo) na instrução DBCC SHRINKFILE, somente 1 GB será liberado.

Redução automática do banco de dados

Quando a opção AUTO_SHRINK do banco de dados estiver definida como ON, o Mecanismo de Banco de Dados reduzirá automaticamente os bancos de dados que tiverem espaço livre. Essa opção é definida usando a instrução ALTER DATABASE. Por padrão, ela é definida como OFF. O Mecanismo de Banco de Dados examina periodicamente o uso do espaço em cada banco de dados. Se o banco de dados estiver com a opção AUTO_SHRINK definida como ON, o Mecanismo de Banco de Dados reduzirá o tamanho dos arquivos do banco de dados. Esta atividade ocorre em segundo plano e não afeta nenhuma atividade de usuário dentro do banco de dados.

Para configurar a redução automática de um banco de dados

ALTER DATABASE (Transact-SQL)

Redução manual do banco de dados

É possível reduzir manualmente arquivos ou um banco de dados utilizando as instruções DBCC SHRINKDATABASE ou DBCC SHRINKFILE. Se as instruções DBCC SHRINKDATABASE ou DBCC SHRINKFILE não puderem obter todo o espaço especificado em um arquivo de log, a instrução emitirá uma mensagem informativa indicando a ação que você deve executar para qualificar mais espaço para liberação. Para obter mais informações sobre redução de arquivos de log, consulte Reduzindo o log de transações.

É possível interromper as operações DBCC SHRINKDATABASE e DBCC SHRINKFILE a qualquer momento do processo, com a retenção de todo o trabalho concluído.

Ao usar a instrução DBCC SHRINKDATABASE, não é possível reduzir um banco de dados inteiro para um tamanho menor que seu original. Entretanto, se um banco de dados foi criado com um tamanho de 10 MB e atingiu 100 MB, a redução máxima desse banco de dados será para 10 MB, mesmo se todos os dados do banco de dados forem excluídos.

Entretanto, é possível reduzir arquivos individuais de banco de dados para um tamanho menor que seu original usando a instrução DBCC SHRINKFILE. É necessário reduzir cada arquivo individualmente, em vez de tentar reduzir o banco de dados inteiro.

ObservaçãoObservação

Não é possível reduzir o banco de dados ou o log de transações que estejam em processo de backup. Por outro lado, não é possível criar backup de um banco de dados ou log de transações que estejam em processo de redução.

Para reduzir um banco de dados

Para reduzir um arquivo de dados ou de log

Reduzindo o log de transações

Há limites fixos a partir dos quais é possível reduzir um arquivo de log de transações. O tamanho dos arquivos de log virtuais dentro do log determina as possíveis reduções de tamanho. Portanto, o arquivo de log nunca pode ser reduzido a um tamanho menor que o arquivo de log virtual. E o arquivo de log é reduzido em incrementos iguais ao tamanho do arquivo de log virtual. Por exemplo, um arquivo de log de transações de 1 GB pode consistir de cinco arquivos de log virtuais, cada um com 200 MB. A redução do arquivo de log de transações exclui arquivos de log virtuais não utilizados, mas deixa pelo menos dois arquivos de log virtuais. Como cada arquivo de log virtual desse exemplo possui 200 MB, é possível reduzir o log de transações somente a um mínimo de 400 MB em incrementos de 200 MB. Para conseguir reduzir um arquivo de log de transações para um tamanho menor, crie um log de transações menor e deixe-o crescer automaticamente, em vez de criar um arquivo de log de transações grande de uma vez.

A operação DBCC SHRINKDATABASE ou DBCC SHRINKFILE tenta imediatamente reduzir um arquivo de log de transações para o tamanho especificado (sujeito a arredondamentos). É necessário fazer backup do arquivo de log antes de reduzir o arquivo para reduzir o tamanho do log lógico e marcar como inativos os logs virtuais que não tiverem nenhuma parte do log lógico. Para obter mais informações, consulte Reduzindo o log de transações.

Práticas recomendadas

Considere as seguintes informações ao planejar a redução de um arquivo ou banco de dados:

  • Uma operação de redução é mais efetiva depois de uma operação que cria muito espaço não utilizado, como operações que truncam ou cancelam uma tabela.

  • A maioria dos bancos de dados exige algum espaço livre disponível para operações regulares rotineiras. Se você reduzir um banco de dados repetidamente e perceber que o tamanho do banco de dados aumentou novamente, isso indica que o espaço que foi reduzido é necessário para operações rotineiras. Nesse caso, reduzir repetidamente um banco de dados é uma operação perdida.

  • Uma operação de redução não preserva o estado de fragmentação de índices do banco de dados e, geralmente, aumenta o nível de fragmentação. Por exemplo, você não deve reduzir um banco de dados ou arquivo de dados após a recriação de índices. Essa é outra razão para não reduzir o banco de dados repetidamente.

  • A menos que você tenha um requisito específico, não defina a opção de banco de dados AUTO_SHRINK como ON.

Operações de redução e níveis de isolamento de controle de versões de linha

É possível que operações de redução sejam bloqueadas por uma transação sendo executada em um nível de isolamento de controle de versão da linha. Por exemplo, se uma grande operação de exclusão estiver em execução em um nível de isolamento de controle de versão de linha quando uma operação DBCC SHRINK DATABASE ocorrer, a operação de redução aguardará a conclusão da operação de exclusão antes de reduzir os arquivos. Quando isso ocorre, as operações DBCC SHRINKFILE e DBCC SHRINKDATABASE emitem uma mensagem informativa (5202 para SHRINKDATABASE e 5203 para SHRINKFILE) para o log de erros do SQL Server a cada cinco minutos na primeira hora e depois a cada hora. Para obter mais informações, consulte DBCC SHRINKDATABASE (Transact-SQL).