Experimentando comportamentos de VLFs com meu laboratório de testes. Primeiro, criei dois bancos de dados (BASE2 e BASE3) com tamanhos de arquivos de log diferentes (1024 e 2048 MO):
Em segundo lugar, estou executando as seguintes consultas para determinar o uso do espaço de log e a parte ativa do VLF:
USE BASE2
dbcc loginfo
GO
USE BASE3
dbcc loginfo
GO
DBCC SQLPERF(LOGSPACE)
Portanto, na minha opinião, há muito espaço que posso recuperar. Agora, iniciando esta consulta para reduzir todos os arquivos de log do banco de dados:
DECLARE
@db nvarchar(255),
@fileName nvarchar(255),
@cmd nvarchar(255)
BEGIN
DECLARE dbcursor CURSOR
FOR
SELECT table2.name AS BASE, table1.name AS FICHIER_JOURNAL_BASE
--table1.database_id,
--table1.physical_name,
--table1.type_desc
FROM sys.master_files AS table1
INNER JOIN sys.databases AS table2
ON table1.database_id = table2.database_id
WHERE table1.database_id > 4 AND table1.type_desc = 'LOG'
AND table2.state_desc = 'ONLINE' AND table2.recovery_model_desc = 'FULL';
OPEN dbcursor
FETCH NEXT FROM dbcursor INTO @db, @fileName;
WHILE (@@FETCH_STATUS <> -1)
BEGIN
--print @db;
SET @cmd = 'USE ['+ @db +']; DBCC SHRINKFILE ('''+@fileName+''',512);'
PRINT 'USE ['+ @db +']; DBCC SHRINKFILE ('''+@fileName+''',512);'
EXECUTE (@cmd)
FETCH NEXT FROM dbcursor INTO @db, @fileName;
END
CLOSE dbcursor;
DEALLOCATE dbcursor;
END
termine aqui o resultado:
O valor solicitado foi 512MO, mas o valor atual no disco está em torno de 650MO. Se eu reiniciar a consulta com
USE [BASE2]; DBCC SHRINKFILE ('BASE2_log',8);
USE [BASE3]; DBCC SHRINKFILE ('BASE3_log',8);
o valor no disco será em torno de 250 MO. Então, por que minha primeira consulta não reduziu os arquivos de log para o valor solicitado 512 MO? De fato, não havia VLF ativo no final do arquivo e ainda muito espaço não utilizado.
De acordo com esta documentação (Seção: Como funciona a redução do arquivo de log?):
Você tem arquivos de log de 1 GB e 2 GB que equivalem a 8 e 16 vlfs de 131.072. Você disse encolher para 512 MB (524.288 kb). Como está em um limite VLF, ele é arredondado para o próximo limite VLF mais alto (adicione 131.072), que seria (655.360kb), o que é bastante próximo da alocação de espaço em disco que você está vendo.