SQL Talent SQLServer Capture and Store SQL Server Database Log File Sizes

Capture and Store SQL Server Database Log File Sizes

Capture and Store SQL Server Database Log File Sizes

Objective:

This SOP outlines the steps to create a historical log of SQL Server database log file sizes using a SQL Agent Job. This helps in monitoring growth trends and managing disk space effectively.

Step 1: Create the Log Size History Table

Target Database: msdb

USE [msdb];
GO

CREATE TABLE [dbo].[DatabaseLogSizeHistory] (
[DatabaseName] NVARCHAR(128) NULL,
[LogFileName] NVARCHAR(128) NULL,
[SizeMB] DECIMAL(10,2) NULL,
[AsOnDate] DATETIME NULL DEFAULT GETDATE()
);

Purpose:

This table stores the log file size in MB and the timestamp of capture.

Step 2: Create SQL Agent Job

Job Name: CaptureDatabaseLogSize
Category: Database Maintenance
Job Creation Script

USE [msdb];
GO

BEGIN TRANSACTION;

DECLARE @ReturnCode INT = 0;
DECLARE @jobId BINARY(16);

— Create Job Category if it doesn’t exist
IF NOT EXISTS (
SELECT name FROM msdb.dbo.syscategories
WHERE name = N’Database Maintenance’ AND category_class = 1
)
BEGIN
EXEC msdb.dbo.sp_add_category
@class = N’JOB’,
@type = N’LOCAL’,
@name = N’Database Maintenance’;
END

— Create SQL Agent Job
EXEC @ReturnCode = msdb.dbo.sp_add_job
@job_name = N’CaptureDatabaseLogSize’,
@enabled = 1,
@description = N’Captures SQL Server log file size history’,
@category_name = N’Database Maintenance’,
@owner_login_name = N’sa’,
@job_id = @jobId OUTPUT;

— Add Job Step
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep
@job_id = @jobId,
@step_name = N’CaptureDatabaseLogSize’,
@subsystem = N’TSQL’,
@command = N’
INSERT INTO msdb.dbo.DatabaseLogSizeHistory (DatabaseName, LogFileName, SizeMB, AsOnDate)
SELECT
DB_NAME(mf.database_id),
mf.name,
CAST(mf.size * 8.0 / 1024 AS DECIMAL(10,2)),
GETDATE()
FROM sys.master_files mf
INNER JOIN sys.databases db ON mf.database_id = db.database_id
WHERE mf.type_desc = ”LOG”;’,
@database_name = N’master’,
@output_file_name = N’K:\SQLMPLANLOG\CaptureDatabaseLogSize.txt’,
@on_success_action = 1,
@on_fail_action = 2,
@flags = 6;

— Define Schedule (Every 30 Minutes Daily)
EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule
@job_id = @jobId,
@name = N’CaptureDatabaseLogSize’,
@enabled = 1,
@freq_type = 4, — Daily
@freq_interval = 1,
@freq_subday_type = 4, — Minutes
@freq_subday_interval = 30,
@active_start_date = 20250425,
@active_start_time = 300;

— Attach Job to Local Server
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver
@job_id = @jobId,
@server_name = N'(local)’;

IF (@@ERROR <> 0 OR @ReturnCode <> 0)
ROLLBACK TRANSACTION;
ELSE
COMMIT TRANSACTION;

Step 3: Validate the Data

To verify the data collected:

USE [msdb];
GO

SELECT
[DatabaseName],
[LogFileName],
[SizeMB],
[AsOnDate]
FROM msdb.dbo.DatabaseLogSizeHistory
ORDER BY AsOnDate DESC;

Maintenance Tips

  • Review this data weekly for unusual log growth patterns.
  • Add alerts for abnormally large log sizes if needed.
  • Purge or archive old data periodically to manage table size.

Loading

Leave a Reply

Your email address will not be published. Required fields are marked *

Related Post