patternsqlModerate
Is it okay to delete MSDB?
Viewed 0 times
okaymsdbdelete
Problem
I'm not a DBA, I've only googled what MSDB does it's basically a DB of SQL Agent of its Job and History, Now I'm running out of space in my cloud server and I have 1 year worth of MSDB year 2017, Is it okay to delete this or do I keep it for backup purposes?
My MSDB is 93GB in a 250GB HDD.
My MSDB is 93GB in a 250GB HDD.
Solution
You can't drop the
Restrictions
The following operations cannot be performed on the msdb database:
-
Changing collation. The default collation is the server collation.
-
Dropping the database.
-
Dropping the guest user from the database.
-
Enabling change data capture.
-
Participating in database mirroring.
-
Removing the primary filegroup, primary data file, or log file.
-
Renaming the database or primary filegroup.
-
Setting the database to OFFLINE.
-
Setting the primary filegroup to READ_ONLY.
Tampering with system databases isn't a good idea usually. You should check where your space problem is and consider expanding your drives.
To check where your size problem is:
-
Check table and index sizes inside
If
-
Check database data and log file sizes with this query:
If the log file size is high you need to find out which operation made it increase it's size and troubleshoot it. Shrinking the file will free some space but won't solve the underlying problem.
msdb database as stated in the docs (emphasis mine):Restrictions
The following operations cannot be performed on the msdb database:
-
Changing collation. The default collation is the server collation.
-
Dropping the database.
-
Dropping the guest user from the database.
-
Enabling change data capture.
-
Participating in database mirroring.
-
Removing the primary filegroup, primary data file, or log file.
-
Renaming the database or primary filegroup.
-
Setting the database to OFFLINE.
-
Setting the primary filegroup to READ_ONLY.
Tampering with system databases isn't a good idea usually. You should check where your space problem is and consider expanding your drives.
To check where your size problem is:
-
Check table and index sizes inside
msdb database using this query:USE msdb
GO
SELECT
t.NAME AS TableName,
s.Name AS SchemaName,
p.rows AS RowCounts,
SUM(a.total_pages) * 8 AS TotalSpaceKB,
CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS TotalSpaceMB,
SUM(a.used_pages) * 8 AS UsedSpaceKB,
CAST(ROUND(((SUM(a.used_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS UsedSpaceMB,
(SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB,
CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00, 2) AS NUMERIC(36, 2)) AS UnusedSpaceMB
FROM
sys.tables t
INNER JOIN
sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN
sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN
sys.allocation_units a ON p.partition_id = a.container_id
LEFT OUTER JOIN
sys.schemas s ON t.schema_id = s.schema_id
GROUP BY
t.Name, s.Name, p.Rows
ORDER BY
TotalSpaceMB DESCIf
sysjobhistory pops up in space then review your current job history rentention policy and make sure that your jobs' schedules are on check and not triggering more often than they need.-
Check database data and log file sizes with this query:
;with fs
as
(
select database_id, type, size * 8.0 / 1024 size
from sys.master_files
)
select
name,
(select sum(size) from fs where type = 0 and fs.database_id = db.database_id) DataFileSizeInMB,
(select sum(size) from fs where type = 1 and fs.database_id = db.database_id) LogFileSizeInMB
from
sys.databases db
where
db.name = 'msdb'If the log file size is high you need to find out which operation made it increase it's size and troubleshoot it. Shrinking the file will free some space but won't solve the underlying problem.
Code Snippets
USE msdb
GO
SELECT
t.NAME AS TableName,
s.Name AS SchemaName,
p.rows AS RowCounts,
SUM(a.total_pages) * 8 AS TotalSpaceKB,
CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS TotalSpaceMB,
SUM(a.used_pages) * 8 AS UsedSpaceKB,
CAST(ROUND(((SUM(a.used_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS UsedSpaceMB,
(SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB,
CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00, 2) AS NUMERIC(36, 2)) AS UnusedSpaceMB
FROM
sys.tables t
INNER JOIN
sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN
sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN
sys.allocation_units a ON p.partition_id = a.container_id
LEFT OUTER JOIN
sys.schemas s ON t.schema_id = s.schema_id
GROUP BY
t.Name, s.Name, p.Rows
ORDER BY
TotalSpaceMB DESC;with fs
as
(
select database_id, type, size * 8.0 / 1024 size
from sys.master_files
)
select
name,
(select sum(size) from fs where type = 0 and fs.database_id = db.database_id) DataFileSizeInMB,
(select sum(size) from fs where type = 1 and fs.database_id = db.database_id) LogFileSizeInMB
from
sys.databases db
where
db.name = 'msdb'Context
StackExchange Database Administrators Q#212533, answer score: 14
Revisions (0)
No revisions yet.