System databases maintenance in SQL Server


Let’s talk about maintenance  of system databases in MS SQL Server. There are a few differences from user databases.

At first let`s remember what system databases we have and what do they stay for.

Master – this database keeps all system-level information of SQL Server instance.

Model – this databases is used as a template for all new databases created in SQL Server. Changing of the size, sorting options, recovery model or any other parameters of  model database will lead to having the same values of those parameters in all databases created after you change model..

Msdb – used by SQL Server agent for storing alerts and jobs, also it stores SSIS packages, information about backups and restores etc.

tempdb – database for temporary objects and for intermediate result sets.

Resource – read-only databases which contains system objects  which are part of SQL Server. System objects are actually kept in database Resource, but logically displayed in the sys schema of other databases.

 System databases maintenance is aimed at having an ability to restore data of these databases in case of disaster, failed upgrade, equipment failures and any other possible problems.

Typical service tasks for system databases (except TempDb and database Resource):

  • Backing up the database (with a retention period of at least 7 days);
  • Integrity check of the database with DBCC CHECKDB command.

All these operations can be put into SQL Server Agent job  and  performed on daily basis cause the volume  of data in these databases is usually small, so maintenance operations go quite fast…and add peace of mind.

But it’s not all; we`d like add more about msdb database because there msdb  specific maintenance tasks which should be done along side with the tasks mentioned above.

As you know, msdb database  stores the history of backups for databases. Now imagine the server, which has more than 50 databases, every 10-15 minutes creating transaction log backup. What will be the size of tables with this information?

One of our clients servers when we first time get there had over 70 databases, and the server was more than 2.5 years old … and the information on the backups has  never been cleaned. As a result msdb database size was more than 20 Gb! Given such database size it will take some time to create backup, run  integrity check of the database, also it will add extra disk activity, take additional time for disaster recovery; as a result we have many disadvantages, which we can easily to solve.

Backup history purging is made via a procedure:

sp_delete_backuphistory [ @oldest_date = ] 'oldest_date'


            [ @oldest_date = ] ‘oldest_date’ 

the earliest date stored in the log table for backup and recovery. Parameter oldest_date has datetime type and does not have default values.

Backup information has been cleaned, what else is stored there?

Mail. Have you set up Database Mail? Does it send e-mails? May be with attachments? 

The whole history of it is also stored in the database msdb. To clear this stuff, there is also a system procedure:

sysmail_delete_mailitems_sp  [ [ @sent_before = ] 'sent_before' ] [ , [ @sent_status = ] 'sent_status' ]


[ @sent_before = ] ‘sent_before’ 

Deletes e-mail messages before the date and time specified by parameter sent_before. Parameter sent_before has datetime type and does not have default values. NULL  matches all dates.

[ @sent_status = ] ‘sent_status’

Deletes e-mail messages of the type specified by parameter sent_status. Parameter  sent_status has varchar(8) type and doesn`t have default values. Valid values: sent, unsent, retrying  and  failed. NULL meaning matches all states.

sysmail_delete_log_sp  [ [ @logged_before = ] 'logged_before' ] [, [ @event_type = ] 'event_type' ]


[ @logged_before = ] ‘logged_before’

deletes the records up to the date and time specified in the parameter logged_before. Parameter logged_before has datetime type and default values NULL. NULL meaning matches all dates.

[ @event_type = ] ‘event_type’

Deletes journal entries of a certain type, specified by parameter event_type. Parameter  event_type has varchar(15) type and doesn’t have default values. Valid values: success, warning, error and informational. NULL matches all types of events.

We`re done with mail and old information, what else can still be there?

Do you have SSIS packages and how often do they run? Their run history is stored in the table [msdb].[dbo].[sysssislog].

If you want to clean it, run a simple statement:

DELETE   FROM [msdb].[dbo].[sysssislog] WHERE starttime<@dt

Where  @dt – records created  before this date will be deleted.

We should put all these operations into SQL Server Agent job:

– Remove backup history

– Cleaning the Database Mail

– Cleaning history table [msdb]. [Dbo]. [Sysssislog]

Running  this job for example  twice a month will allow us to have small system databases.

Part of these operations is done automatically during the creation of Maintenance Plans, but we seldom use it, so we always have a script for a job to perform maintenance of  system databases, which is simply ran on each new databases server we get.

If we missed something will be glad to get comments.

Be careful and keep the workplace clean!