DBCC SHRINKDATABASE (Transact-SQL)DBCC SHRINKDATABASE (Transact-SQL)

APLICA-SE A: simSQL Server simBanco de Dados SQL do Azure nãoSQL Data Warehouse do Azure nãoParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Reduz o tamanho dos arquivos de dados e de log do banco de dados especificado.Shrinks the size of the data and log files in the specified database.

Ícone de link do tópico Convenções de sintaxe de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxeSyntax

DBCC SHRINKDATABASE   
( database_name | database_id | 0   
     [ , target_percent ]   
     [ , { NOTRUNCATE | TRUNCATEONLY } ]   
)  
[ WITH NO_INFOMSGS ]  

ArgumentosArguments

database_name | database_id | 0database_name | database_id | 0
É o nome ou a ID do banco de dados a ser reduzido.Is the database name or ID to be shrunk. Se 0 for especificado, o banco de dados atual será usado.0 specifies that the current database is used.

target_percenttarget_percent
É a porcentagem de espaço livre que você deseja deixar no arquivo de banco de dados após a redução do banco de dados.Is the percentage of free space that you want left in the database file after the database has been shrunk.

NOTRUNCATENOTRUNCATE
Move as páginas atribuídas do final do arquivo para páginas não atribuídas no início do arquivo.Moves assigned pages from the file's end to unassigned pages in the front of the file. Essa ação compacta os dados dentro do arquivo.This action compacts the data within the file. target_percent é opcional.target_percent is optional. O SQL Data Warehouse do Azure não é compatível com essa opção.Azure SQL Data Warehouse doesn't support this option.

O espaço livre no final do arquivo não é retornado ao sistema operacional, e o tamanho físico do arquivo não é alterado.The free space at the end of the file isn't returned to the operating system, and the physical size of the file doesn't change. Como tal, o banco de dados não parecerá reduzido quando você especificar NOTRUNCATE.As such, the database appears not to shrink when you specify NOTRUNCATE.

NOTRUNCATE aplica-se apenas a arquivos de dados.NOTRUNCATE is applicable only to data files. NOTRUNCATE não afeta o arquivo de log.NOTRUNCATE doesn't affect the log file.

TRUNCATEONLYTRUNCATEONLY
Libera todo o espaço livre no final do arquivo para o sistema operacional.Releases all free space at the end of the file to the operating system. Não move todas as páginas dentro do arquivo.Doesn't move any pages inside the file. O arquivo de dados é reduzido somente para a última extensão atribuída.The data file shrinks only to the last assigned extent. Ignora target_percent se ele é especificado com TRUNCATEONLY.Ignores target_percent if specified with TRUNCATEONLY. O SQL Data Warehouse do Azure não é compatível com essa opção.Azure SQL Data Warehouse doesn't support this option.

TRUNCATEONLY afeta o arquivo de log.TRUNCATEONLY affects the log file. Para truncar somente o arquivo de dados, use DBCC SHRINKFILE.To truncate only the data file, use DBCC SHRINKFILE.

WITH NO_INFOMSGSWITH NO_INFOMSGS
Suprime todas as mensagens informativas com níveis de severidade de 0 a 10.Suppresses all informational messages that have severity levels from 0 through 10.

Conjuntos de resultadosResult Sets

A tabela a seguir descreve as colunas do conjunto de resultados.The following table describes the columns in the result set.

Nome da colunaColumn name DescriçãoDescription
DbIdDbId Número de identificação do banco de dados do arquivo que o Mecanismo de Banco de DadosDatabase Engine tentou reduzir.Database identification number of the file the Mecanismo de Banco de DadosDatabase Engine tried to shrink.
FileIdFileId Número de identificação do arquivo que o Mecanismo de Banco de DadosDatabase Engine tentou reduzir.File identification number of the file the Mecanismo de Banco de DadosDatabase Engine tried to shrink.
CurrentSizeCurrentSize Número de páginas de 8 KB que o arquivo ocupa atualmente.Number of 8-KB pages the file currently occupies.
MinimumSizeMinimumSize Número de páginas de 8 KB que o arquivo poderia ocupar, no mínimo.Number of 8-KB pages the file could occupy, at minimum. Esse valor corresponde ao tamanho mínimo ou tamanho de criação original de um arquivo.This value corresponds to the minimum size or originally created size of a file.
UsedPagesUsedPages Número de páginas de 8 KB usado atualmente pelo arquivo.Number of 8-KB pages currently used by the file.
EstimatedPagesEstimatedPages Número de páginas de 8 KB a que o Mecanismo de Banco de DadosDatabase Engine calcula que o arquivo poderia ser reduzido.Number of 8-KB pages that the Mecanismo de Banco de DadosDatabase Engine estimates the file could be shrunk down to.

Observação

O Mecanismo de Banco de DadosDatabase Engine não exibe linhas para esses arquivos não reduzidos.The Mecanismo de Banco de DadosDatabase Engine does not display rows for those files not shrunk.

RemarksRemarks

Observação

No momento, o SQL Data Warehouse do Azure não é compatível com DBCC SHRINKDATABASE.Currently Azure SQL Data Warehouse does not support DBCC SHRINKDATABASE. Não é recomendável executar esse comando, uma vez que esta é uma operação que faz uso intenso de E/S e pode deixar seu data warehouse offline.Running this command is not recommended as this is an i/o intensive operation and can take your data warehouse offline. Além disso, haverá implicações de custo para seus instantâneos de data warehouse depois de executar esse comando.In addition, there will be costing implications to your data warehouse snapshots after running this command.

Para reduzir todos os arquivos de dados e de log de um banco de dados específico, execute o comando DBCC SHRINKDATABASE.To shrink all data and log files for a specific database, execute the DBCC SHRINKDATABASE command. Para reduzir um arquivo de dados ou de log de cada vez para um banco de dados específico, execute o comando DBCC SHRINKFILE.To shrink one data or log file at a time for a specific database, execute the DBCC SHRINKFILE command.

Para exibir a quantidade atual de espaço livre (não alocado) no banco de dados, execute sp_spaceused.To view the current amount of free (unallocated) space in the database, run sp_spaceused.

Operações DBCC SHRINKDATABASE podem ser interrompidas a qualquer momento do processo, sendo preservado todo o trabalho concluído.DBCC SHRINKDATABASE operations can be stopped at any point in the process, and any completed work is kept.

O banco de dados não pode ser menor que o tamanho mínimo configurado do banco de dados.The database can't be smaller than the configured minimum size of the database. Você especifica o tamanho mínimo quando o banco de dados é originalmente criado.You specify the minimum size when the database is originally created. Ou então, o tamanho mínimo pode ser o último tamanho explicitamente definido por meio de uma operação de alteração de tamanho do arquivo.Or, the minimum size can be the last size explicitly set by using a file size changing operation. Operações como DBCC SHRINKFILE ou ALTER DATABASE são exemplos de operações de alteração do tamanho do arquivo.Operations like DBCC SHRINKFILE or ALTER DATABASE are examples of file-size changing operations.

Digamos que um banco de dados foi criado originalmente com um tamanho de 10 MB.Let's say a database is originally created with a size of 10 MB in size. Em seguida, ele atinge 100 MB.Then, it grows to 100 MB. O tamanho mínimo ao qual o banco de dados pode ser reduzido é 10 MB, mesmo se todos os dados no banco de dados são excluídos.The smallest the database can be reduced to is 10 MB, even if all the data in the database has been deleted.

Especifique a opção NOTRUNCATE ou a opção TRUNCATEONLY ao executar DBCC SHRINKDATABASE.Specify either the NOTRUNCATE option or the TRUNCATEONLY option when you run DBCC SHRINKDATABASE. Se você não fizer isso, o resultado será o mesmo que se você executar uma operação DBCC SHRINKDATABASE com NOTRUNCATE seguida pela execução de uma operação DBCC SHRINKDATABASE com TRUNCATEONLY.If you don't, the result is the same as if you run a DBCC SHRINKDATABASE operation with NOTRUNCATE followed by running a DBCC SHRINKDATABASE operation with TRUNCATEONLY.

O banco de dados reduzido não precisa estar no modo do usuário único.The shrunk database doesn't have to be in single user mode. Outros usuários podem trabalhar no banco de dados quando ele é reduzido, incluindo bancos de dados do sistema.Other users can be working in the database when it's shrunk, including system databases.

Não é possível reduzir um banco de dados enquanto ele estiver sendo armazenado em backup.You can't shrink a database while the database is being backed up. Da mesma forma, não é possível fazer backup de um banco de dados enquanto houver uma operação de redução em processamento.Conversely, you can't back up a database while a shrink operation on the database is in process.

Como DBCC SHRINKDATABASE funcionaHow DBCC SHRINKDATABASE Works

O DBCC SHRINKDATABASE reduz arquivos de dados individualmente, porém reduz arquivos de log como se todos esses arquivos existissem em uma série de logs contíguos.DBCC SHRINKDATABASE shrinks data files on a per-file basis, but shrinks log files as if all the log files existed in one contiguous log pool. Os arquivos são sempre reduzidos do final.Files are always shrunk from the end.

Suponha que você tem alguns arquivos de log, um arquivo de dados e um banco de dados denominado mydb.Assume you have a couple of log files, a data file, and a database named mydb. Os arquivos de dados e de log têm 10 MB cada e o arquivo de dados contém 6 MB de dados.The data and log files are 10 MB each and the data file contains 6 MB of data. Para cada arquivo, o Mecanismo de Banco de DadosDatabase Engine calcula um tamanho de destino.The Mecanismo de Banco de DadosDatabase Engine calculates a target size for each file. O valor é o tamanho a que se pretende chegar após a redução do arquivo.This value is the size to which the file is to be shrunk. Quando DBCC SHRINKDATABASE é especificado com target_percent, o Mecanismo de Banco de DadosDatabase Engine calcula o tamanho de destino como a quantidade target_percent de espaço livre no arquivo após a redução.When DBCC SHRINKDATABASE is specified with target_percent, the Mecanismo de Banco de DadosDatabase Engine calculates target size to be the target_percent amount of space free in the file after shrinking.

Por exemplo, se você especificar um target_percent igual a 25 para a redução de mydb, o Mecanismo de Banco de DadosDatabase Engine calculará o tamanho de destino para o arquivo de dados como 8 MB (6 MB de dados mais 2 MB de espaço livre).For example, if you specify a target_percent of 25 for shrinking mydb, the Mecanismo de Banco de DadosDatabase Engine calculates the target size for the data file to be 8 MB (6 MB of data plus 2 MB of free space). Portanto, o Mecanismo de Banco de DadosDatabase Engine moverá todos os dados dos últimos 2 MB do arquivo de dados para qualquer espaço livre nos primeiros 8 MB do arquivo de dados e, em seguida, reduzirá o arquivo.As such, the Mecanismo de Banco de DadosDatabase Engine moves any data from the data file's last 2 MB to any free space in the data file's first 8 MB and then shrinks the file.

Considere que o arquivo de dados de mydb contém 7 MB de dados.Assume the data file of mydb contains 7 MB of data. Especificar um target_percent igual a 30 permite que esse arquivo de dados seja reduzido para um percentual livre igual a 30.Specifying a target_percent of 30 allows for this data file to be shrunk to the free percentage of 30. No entanto, especificar um_target_percent_ igual a 40 não reduz o arquivo de dados porque o Mecanismo de Banco de DadosDatabase Engine não reduzirá um arquivo para um tamanho menor do que aquele que os dados ocuparem no momento.However, specifying a target_percent of 40 doesn't shrink the data file because the Mecanismo de Banco de DadosDatabase Engine won't shrink a file to a size smaller than the data currently occupies.

Você também pode pensar neste assunto outro modo: um arquivo de dados com 40 por cento de espaço livre desejado + 70 por cento de espaço cheio de dados (7 MB de 10 MB) dá mais que 100 por cento.You can also think of this issue another way: 40 percent wanted free space + 70 percent full data file (7 MB out of 10 MB) is more than 100 percent. Qualquer target_size maior que 30 não reduzirá o arquivo de dados.Any target_size greater than 30 won't shrink the data file. Ele não será reduzido porque o percentual de espaço que você deseja mais o percentual atual ocupado pelo arquivo de dados soma mais de 100%.It won't shrink because the percentage free you want plus the current percentage that the data file occupies is over 100 percent.

Para arquivos de log, o Mecanismo de Banco de DadosDatabase Engine usa target_percent para calcular o tamanho de destino do log inteiro.For log files, the Mecanismo de Banco de DadosDatabase Engine uses target_percent to calculate the target size for the whole log. É por isso que target_percent é a quantidade de espaço livre no log após a operação de redução.That's why target_percent is the amount of free space in the log after the shrink operation. O tamanho designado do log inteiro é convertido no tamanho designado de cada arquivo de log.Target size for the whole log is then translated to a target size for each log file.

DBCC SHRINKDATABASE tenta reduzir cada arquivo de log físico imediatamente para seu tamanho designado.DBCC SHRINKDATABASE tries to shrink each physical log file to its target size immediately. Digamos que nenhuma parte do log lógico permanece nos logs virtuais além do tamanho de destino do arquivo de log.Let's say no part of the logical log stays in the virtual logs beyond the target size of the log file. Em seguida, o arquivo será truncado com êxito e DBCC SHRINKDATABASE terminará sem nenhuma mensagem.Then the file is successfully truncated and DBCC SHRINKDATABASE finishes without any messages. No entanto, se parte do log lógico permanecer nos logs virtuais com tamanho maior que o tamanho de destino, o Mecanismo de Banco de DadosDatabase Engine liberará o espaço disponível possível e emitirá uma mensagem informativa.However, if part of the logical log stays in the virtual logs beyond the target size, the Mecanismo de Banco de DadosDatabase Engine frees as much space as possible, and then issues an informational message. A mensagem descreve as ações necessárias para mover o log lógico dos logs virtuais no final do arquivo.The message describes what actions are required to move the logical log out of the virtual logs at the end of the file. Depois que as ações forem executadas, DBCC SHRINKDATABASE poderá ser usado para liberar o espaço restante.After the actions are run, DBCC SHRINKDATABASE can be used to free the remaining space.

Um arquivo de log só pode ser reduzido para um limite de arquivo de log virtual.A log file can only be shrunk to a virtual log file boundary. Esse é o motivo pelo qual reduzir um arquivo de log para um tamanho menor que o tamanho de um arquivo de log virtual pode não ser possível.That's why shrinking a log file to a size smaller than the size of a virtual log file might not be possible. Isso pode não ser possível mesmo que ele não esteja sendo usado.It might not be possible even if it isn't being used. O tamanho do arquivo de log virtual é definido dinamicamente pelo Mecanismo de Banco de DadosDatabase Engine quando os arquivos de log são criados ou estendidos.The size of the virtual log file is chosen dynamically by the Mecanismo de Banco de DadosDatabase Engine when log files are created or extended.

Práticas recomendadasBest Practices

Considere as seguintes informações ao planejar reduzir um banco de dados:Consider the following information when you plan to shrink a database:

  • Uma operação de redução é mais eficaz depois de uma operação.A shrink operation is most effective after an operation. Essa operação cria espaço não utilizado, assim como uma operação TRUNCATE TABLE ou DROP TABLE.This operation creates unused space, such as a truncate table or a drop table operation.
  • A maioria dos bancos de dados exige algum espaço livre disponível para operações comuns rotineiras.Most databases require some free space to be available for regular day-to-day operations. Você pode reduzir um banco de dados repetidamente e observar que o tamanho do banco de dados cresce novamente.You might shrink a database repeatedly and notice that the database size grows again. Esse crescimento indica que o espaço reduzido é necessário para operações regulares.This growth indicates that the shrunken space is required for regular operations. Nesse caso, reduzir repetidamente um banco de dados é uma operação inútil.In these cases, repeatedly shrinking the database is a wasted operation.
  • Uma operação de redução não preserva o estado de fragmentação de índices do banco de dados e, em geral, aumenta o nível de fragmentação.A shrink operation doesn't preserve the fragmentation state of indexes in the database, and generally increases fragmentation to a degree. Esse resultado é outra razão para não reduzir o banco de dados repetidamente.This result is another reason not to repeatedly shrink the database.
  • A menos que você tenha um requisito específico, não defina a opção de banco de dados AUTO_SHRINK como ON.Unless you have a specific requirement, don't set the AUTO_SHRINK database option to ON.

Solução de problemasTroubleshooting

É possível bloquear operações de redução por uma transação que está esteja executada em um nível de isolamento baseado em controle de versão de linha.It's possible to block shrink operations by a transaction that is running under a row versioning-based isolation level. Por exemplo, se uma grande operação de exclusão estiver sendo executada em um nível de isolamento de controle de versão de linha quando uma operação DBCC SHRINK DATABASE é executada.For example, a large delete operation running under a row versioning-based isolation level is in progress when a DBCC SHRINK DATABASE operation is executed. Quando essa situação ocorrer, a operação de redução aguardará a operação de exclusão ser concluída para então reduzir os arquivos.When this situation happens, the shrink operation will wait for the delete operation to complete before it shrinks the files. Quando essa operação de redução aguarda, as operações DBCC SHRINKFILE e DBCC SHRINKDATABASE emitem uma mensagem informativa (5202 para SHRINKDATABASE e 5203 para SHRINKFILE).When the shrink operation waits, DBCC SHRINKFILE and DBCC SHRINKDATABASE operations print out an informational message (5202 for SHRINKDATABASE and 5203 for SHRINKFILE). Essa mensagem é registrada no log de erros SQL ServerSQL Server a cada cinco minutos na primeira hora e, posteriormente, a cada hora.This message prints to the SQL ServerSQL Server error log every five minutes in the first hour and then every upcoming hour. Por exemplo, se o log de erros contiver a seguinte mensagem de erro:For example, if the error log contains the following error message:

DBCC SHRINKDATABASE for database ID 9 is waiting for the snapshot   
transaction with timestamp 15 and other snapshot transactions linked to   
timestamp 15 or with timestamps older than 109 to finish.  

Esse erro significa que as transações de instantâneo que têm carimbos de data/hora anteriores a 109 bloquearão a operação de redução.This error means snapshot transactions that have timestamps older than 109 will block the shrink operation. Essa transação é a última transação concluída pela operação de redução.That transaction is the last transaction that the shrink operation completed. Ele também indica que as colunas transaction_sequence_num ou first_snapshot_sequence_num na exibição de gerenciamento dinâmica sys.dm_tran_active_snapshot_database_transactions (Transact-SQL) contêm um valor igual a 15.It also indicates the transaction_sequence_num or first_snapshot_sequence_num columns in the sys.dm_tran_active_snapshot_database_transactions (Transact-SQL) dynamic management view contain a value of 15. A coluna transaction_sequence_num ou first_snapshot_sequence_num da exibição pode conter um número menor que o da última transação concluída por uma operação de redução (109).The transaction_sequence_num or first_snapshot_sequence_num column in the view might contain a number that is less than the last transaction completed by a shrink operation (109). Nesse caso, a operação de redução esperará o término dessas transações.If so, the shrink operation will wait for those transactions to finish.

Para resolver o problema, você pode fazer uma das seguintes tarefas:To resolve the problem, you can do one of the following tasks:

  • Encerrar a transação que está bloqueando a operação de redução.End the transaction that is blocking the shrink operation.
  • Encerrar a operação de redução.End the shrink operation. Todo o trabalho concluído será preservado.Any completed work is kept.
  • Não interferir e permitir que a operação de redução aguarde até que a transação de bloqueio seja concluída.Do nothing and allow the shrink operation to wait until the blocking transaction completes.

PermissõesPermissions

Exige associação à função de servidor fixa sysadmin ou à função de banco de dados fixa db_owner .Requires membership in the sysadmin fixed server role or the db_owner fixed database role.

ExemplosExamples

A.A. Reduzindo um banco de dados e especificando uma porcentagem de espaço livreShrinking a database and specifying a percentage of free space

O exemplo a seguir reduz o tamanho dos arquivos de dados e de log no banco de dados de usuário UserDB para permitir 10 por cento de espaço livre no banco de dados.The following example reduces the size of the data and log files in the UserDB user database to allow for 10 percent free space in the database.

DBCC SHRINKDATABASE (UserDB, 10);  
GO  

B.B. Truncando um banco de dadosTruncating a database

O exemplo a seguir reduz os arquivos de dados e de log no banco de dados de exemplo AdventureWorks até a última extensão atribuída.The following example shrinks the data and log files in the AdventureWorks sample database to the last assigned extent.

DBCC SHRINKDATABASE (AdventureWorks2012, TRUNCATEONLY);  

Confira tambémSee also

ALTER DATABASE (Transact-SQL)ALTER DATABASE (Transact-SQL)
DBCC (Transact-SQL)DBCC (Transact-SQL)
DBCC SHRINKFILE (Transact-SQL)DBCC SHRINKFILE (Transact-SQL)
Reduzir um banco de dadosShrink a Database