MSSQL Spazio Disco

Da Emigar.
Jump to navigation Jump to search
SET NOCOUNT ON;

DECLARE @DbName NVARCHAR(255);
DECLARE @LogFileName NVARCHAR(255);
DECLARE @SQL NVARCHAR(MAX);

DECLARE db_cursor CURSOR FOR 
SELECT d.name, f.name 
FROM sys.databases d
JOIN sys.master_files f ON d.database_id = f.database_id
WHERE f.type = 1 
  AND d.name NOT IN ('master', 'model', 'msdb', 'tempdb')
  AND d.state_desc = 'ONLINE'; -- Lavoriamo solo su DB online

OPEN db_cursor;
FETCH NEXT FROM db_cursor INTO @DbName, @LogFileName;

WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT 'Tentativo di shrink per il database: ' + @DbName;

    -- Eseguiamo il checkpoint per forzare il flush delle pagine
    SET @SQL = 'USE [' + @DbName + ']; CHECKPOINT;';
    EXEC sp_executesql @SQL;

    -- Eseguiamo lo shrink del file di log
    -- Non forziamo 1MB, lasciamo che SQL decida quanto è effettivamente restringibile
    SET @SQL = 'USE [' + @DbName + ']; DBCC SHRINKFILE (''' + @LogFileName + ''');';
    EXEC sp_executesql @SQL;

    FETCH NEXT FROM db_cursor INTO @DbName, @LogFileName;
END

CLOSE db_cursor;
DEALLOCATE db_cursor;
GO