Não, usar DBCC SHRINKFILE ('filename', target_size)
é o jeito certo de fazer isso.
Se você quiser fazer isso em "partes", pode definir tamanhos de destino progressivamente menores ou apenas deixá-lo rodar o máximo que puder antes de ser cancelado.
Alguns comentários:
- Coloque um tamanho de destino razoável, com alguma margem de espaço livre permitido. Talvez 90GB total para 75GB de dados?
- Enquanto a redução estiver em execução, verifique o monitor de atividade para ver se o SPID está sendo bloqueado. Se houver uma transação aberta em uma página no final do arquivo, a redução não poderá ser movida até que a transação seja confirmada ou revertida.
- O spid está realmente progredindo? (Os números de CPU e IO estão mudando)
- O Shrink pode levar muito, muito tempo, mas deve salvar seu progresso (o que significa que ele move 1 página por vez e, quando é cancelado, todos os movimentos concluídos da página já foi feito)
- Depois de cancelar o encolhimento, tente fazer um
DBCC SHRINKFILE ('filename', TRUNCATEONLY)
. Deve recuperar todo o espaço já liberado no final do arquivo (veja meu ponto anterior) - Se você ficar desesperado, tente reiniciar o SQL no modo de usuário único, para saber que nada mais está funcionando contra o banco de dados nesse momento (obviamente, isso pode ser impossível em um servidor prod)
- Depois de concluir a redução, certifique-se de fazer uma reindexação completa no banco de dados para eliminar a fragmentação criada pela redução. Isso pode recuperar parte do espaço que você acabou de liberar.
- Se você ainda não conseguir que o psiquiatra funcione, confira algumas das discussões sobre esta pergunta SO . Existem aparentemente algumas situações em que os psiquiatras podem não progredir.