Seu gerenciamento de arquivos pode ser uma operação totalmente online. Você tem dois caminhos, dependendo da necessidade de manter suas informações de log para fins de recuperação:
Recuperação pontual não necessária
- Converta o banco de dados em
SIMPLE
recuperação. Execute um ponto de verificação para gravar transações no disco.
- Achate o log.
- Redimensione o log para o tamanho apropriado.
Também recomendo definir uma quantidade fixa de crescimento e um crescimento ilimitado (para ajudar a gerenciar melhor o seu log). Observe que a quantidade fixa de crescimento depende muito da quantidade, recomendo que você comece com 1 a 2 GB inicialmente, dependendo da quantidade de crescimento que o log pode esperar. Idealmente, seu log não crescerá muito, portanto, isso não deve causar muito impacto. Se o seu log estiver crescendo regularmente, pode ser necessário revisitar seu tamanho.
Realizado usando:
ALTER DATABASE [foo]
SET RECOVERY SIMPLE;
CHECKPOINT;
DBCC SHRINKFILE (foo_log,0);
ALTER DATABASE [foo]
MODIFY FILE (NAME=foo_log,SIZE=8000MB,MAXSIZE=UNLIMITED,FILEGROWTH=1000MB);
--Optional if you want the database in full recovery mode
--for point in time recovery going forward
ALTER DATABASE [foo]
SET RECOVERY FULL;
Recuperação pontual necessária
O maior problema é que você não pode reduzir seu arquivo de log além do segmento VLF atualmente ativo. Para ver isso, você pode usar DBCC LOGINFO
no contexto do banco de dados. Qualquer segmento com um Status = 2 está ativo. Para limpar segmentos ativos, você precisará executar um backup do log de transações quando nenhuma transação estiver ativa nesse segmento no momento. Suas etapas são:
- Execute um backup do log de transações.
- Encolha seu arquivo. (Idealmente, aplainar, mas se seu banco de dados estiver ativo, será difícil).
- Repita as etapas 1 e 2 até que seu log tenha um tamanho apropriado, idealmente o menor possível.
- Redimensione o log para o tamanho apropriado.
Realizado usando:
BACKUP LOG [foo] TO DISK='<Location of t-log backup>';
DBCC SHRINKFILE (foo_log,0);
--Repeat the above until your log file is small "enough"
ALTER DATABASE [foo]
MODIFY FILE (NAME=foo_log,SIZE=8000MB,MAXSIZE=UNLIMITED,FILEGROWTH=1000MB);
Alguns recursos adicionais para entender o que está acontecendo aqui: