Automated Process to Shrink database log files
-- Automated Process to Shrink database log files of all online databases whose size is Greater than 10000
DECLARE @loopStart INT = 1 ,
@LoopEnd INT;
DECLARE @t TABLE
(
idx INT IDENTITY(1, 1) ,
DBName VARCHAR(MAX) ,
FileType VARCHAR(150) ,
Location VARCHAR(MAX) ,
LogicalFileName VARCHAR(MAX) ,
FileSize BIGINT
);
INSERT INTO @t
( DBName ,
FileType ,
Location ,
LogicalFileName ,
FileSize
)
SELECT db.name ,
type_desc ,
physical_name ,
mf.name ,
mf.size
FROM sys.master_files mf
INNER JOIN sys.databases db ON db.database_id = mf.database_id
AND type_desc = 'LOG' AND db.state_desc='ONLINE'
WHERE mf.size > 10000
ORDER BY mf.size DESC;
SET @LoopEnd = ( SELECT MAX(idx)
FROM @t
);
DECLARE @DbName VARCHAR(MAX) ,
@LogicalFileName VARCHAR(MAX),
@SQL NVARCHAR(MAX);
WHILE @loopStart <= @LoopEnd
BEGIN
SET @DbName = ( SELECT DBName
FROM @t
WHERE idx = @loopStart
);
SET @LogicalFileName = ( SELECT LogicalFileName
FROM @t
WHERE idx = @loopStart
);
SET @SQL='
Use '+@DbName+
' ALTER DATABASE '+ @DbName +
' SET RECOVERY SIMPLE;
-- Shrink the truncated log file to 1 MB.
DBCC SHRINKFILE ('+ @LogicalFileName+', 1);
-- Reset the database recovery model.
ALTER DATABASE '+ @DbName+
' SET RECOVERY FULL;
'
--SELECT @DbName,@LogicalFileName
--SELECT @SQL
EXEC sp_executesql @SQL
SET @loopStart = @loopStart + 1;
END;
DECLARE @loopStart INT = 1 ,
@LoopEnd INT;
DECLARE @t TABLE
(
idx INT IDENTITY(1, 1) ,
DBName VARCHAR(MAX) ,
FileType VARCHAR(150) ,
Location VARCHAR(MAX) ,
LogicalFileName VARCHAR(MAX) ,
FileSize BIGINT
);
INSERT INTO @t
( DBName ,
FileType ,
Location ,
LogicalFileName ,
FileSize
)
SELECT db.name ,
type_desc ,
physical_name ,
mf.name ,
mf.size
FROM sys.master_files mf
INNER JOIN sys.databases db ON db.database_id = mf.database_id
AND type_desc = 'LOG' AND db.state_desc='ONLINE'
WHERE mf.size > 10000
ORDER BY mf.size DESC;
SET @LoopEnd = ( SELECT MAX(idx)
FROM @t
);
DECLARE @DbName VARCHAR(MAX) ,
@LogicalFileName VARCHAR(MAX),
@SQL NVARCHAR(MAX);
WHILE @loopStart <= @LoopEnd
BEGIN
SET @DbName = ( SELECT DBName
FROM @t
WHERE idx = @loopStart
);
SET @LogicalFileName = ( SELECT LogicalFileName
FROM @t
WHERE idx = @loopStart
);
SET @SQL='
Use '+@DbName+
' ALTER DATABASE '+ @DbName +
' SET RECOVERY SIMPLE;
-- Shrink the truncated log file to 1 MB.
DBCC SHRINKFILE ('+ @LogicalFileName+', 1);
-- Reset the database recovery model.
ALTER DATABASE '+ @DbName+
' SET RECOVERY FULL;
'
--SELECT @DbName,@LogicalFileName
--SELECT @SQL
EXEC sp_executesql @SQL
SET @loopStart = @loopStart + 1;
END;
Comments
Post a Comment