No SQL Server (2008 neste caso), como posso reduzir rapidamente todos os arquivos, log e dados, para todos os bancos de dados em uma instância? Eu poderia passar pelo SSMS e clicar com o botão direito em cada um e escolher Tarefas -> Encolher, mas estou procurando algo mais rápido.
Eu criei scripts de alguns scripts "Criar banco de dados" e esqueci que eles tinham tamanhos de balão para padrões e não precisam de muito espaço reservado para esses arquivos neste projeto.
Quando você faz "Tasks -> Shrink" na GUI, ele realmente emite um
DBCC SHRINKDATABASE
comando nos bastidores. Tente. Quando a caixa de diálogo aparecer, não clique no botão "OK". Em vez disso, clique no botão "Script". Você verá o comando em uma janela de consulta. Combine isso com uma consulta em sys.databases (deixe de fora master e msdb), e você pode fazer um script para reduzir todos os bancos de dados.Por exemplo (retirado do comentário de jcolebrand):
Copie a saída dessa consulta e execute-a para reduzir todos os seus arquivos.
Que tal uma única linha de instrução sql?
Por favor, leia esta postagem de blog muito interessante antes de executar a seguinte instrução sql.
DBCC SHRINKDB (e seu primo SHRINKFILE) são extremamente lentos, porque há muita execução de thread único acontecendo nesse código.
Uma maneira muito mais rápida de reduzir um arquivo de banco de dados é esta:
sp_spaceused
para determinar o tamanho)Como as reconstruções de índice são maciçamente paralelas, essa técnica geralmente resulta em uma redução muito mais rápida do banco de dados. Claro, isso requer que você tenha um pouco de espaço extra para o novo grupo de arquivos enquanto o processo está em andamento. No entanto, você só precisa de espaço suficiente no novo grupo de arquivos para manter o maior grupo de arquivos na instância (já que você estará recuperando espaço à medida que avança).
Essa técnica também tem o benefício adicional de desfragmentar seus índices no processo.
Aumentei um pouco a query para encolher apenas o LOG conforme solicitado:
O código abaixo, obtenha uma lista de bancos de dados que não são do sistema, defina o banco de dados como somente leitura e reduza o arquivo. Eu mantive esse código em algumas caixas do SQL Server usando o SQL Agent Job, onde o espaço é sempre um problema. Na noite de sábado/domingo todas as semanas, ele começa a ser executado e reduz todos os bancos de dados em poucas horas (dependendo do tamanho dos bancos de dados).
Podemos repetir
SHRINKDB
eSHRINKFILE
para todos os bancos de dados dinamicamente:Você pode encontrar detalhes neste artigo .
Reduza todos os arquivos de log, exceto master, model, msdb:
Este estende a resposta acima, usando um cursor para percorrer as instruções SQL uma a uma. Não é tão curto quanto a resposta de Emrah, mas permite lógica adicional dentro do loop while dentro do cursor.