Technical Article

T-SQL Maintenance Plan Creation

,

Use this script ot be able to create DB Maintenance Plans fast.
If you need to create the plans on servers similarly set up, edit the required parameters once, and when you create a new plan, you will only need to specify a database name and one task start time, run the script and the plan is created in a second.
The script also changes the owner of the generated jobs to 'sa' or other login.

set nocount on

BEGIN TRANSACTION 

declare @ServerName varchar(22), @DBName varchar(128), @ReportPath varchar(128), @BackupPath varchar(128) 
declare @ReportsRetention varchar(11), @FullBckRetention varchar(11), @TranBckRetention varchar(11), @HistRows int, @Owner varchar(128) 
declare @FullBckStartTime varchar(6), @TranBckStartTime varchar(6), @IntegriStartTime varchar(6), @OptimalStartTime varchar(6)

DECLARE @ReturnCode INT 
DECLARE @JobID0 nchar(36), @JobID1 nchar(36), @JobID2 nchar(36), @JobID3 nchar(36), @JobID4 nchar(36) 
DECLARE @JobID5 nchar(36), @JobID6 nchar(36), @JobID7 nchar(36), @JobIDD nchar(36) 

DECLARE @FullBckCommand nvarchar(400), @TranBckCommand nvarchar(400), @IntegriCommand nvarchar(400), @OptimalCommand nvarchar(400)
declare @JobName0 varchar(128), @JobName2 varchar(128), @JobName4 varchar(128), @JobName6 varchar(128) 
DECLARE @PlanID nchar(36)  
declare @Date char(8)

-------------------------------------------------------------
--   Set the parameters: BEGIN
-------------------------------------------------------------

SELECT @ServerName = @@ServerName
SELECT @DBName = 'PUBS'
SELECT @ReportPath = 'E:\egdata\errorlog'
SELECT @BackupPath = 'E:\egdata\BACKUP'
SELECT @ReportsRetention = '1WEEKS'
SELECT @FullBckRetention = '47HOURS'
SELECT @TranBckRetention = '47HOURS'
SELECT @Owner = 'sa'

-- Create tasks' schedules: 1. Tranlog backup,2. Integrity, 3. Optimization,4. Backup(Full)
-- set the 1st and it will add 1 hour for the 2nd, anotherhour for the 3rd, 1 hour more for the 4th task
SELECT @TranBckStartTime = '200000'

SELECT @FullBckStartTime = case when @TranBckStartTime + 30000 >= 240000 then @TranBckStartTime + 30000 - 240000 else @TranBckStartTime + 30000 end
SELECT @IntegriStartTime = case when @TranBckStartTime + 10000 >= 240000 then @TranBckStartTime + 10000 - 240000 else @TranBckStartTime + 10000 end
SELECT @OptimalStartTime = case when @TranBckStartTime + 20000 >= 240000 then @TranBckStartTime + 20000 - 240000 else @TranBckStartTime + 20000 end 

-- or set the schedules manually 
/*
SELECT @FullBckStartTime = '230000' 
SELECT @IntegriStartTime = '210000' 
SELECT @OptimalStartTime = '220000' 
*/
SELECT 
@Date = datepart(yy, getdate())*10000 + datepart(mm, getdate())*100 + datepart(dd, getdate())  
-- or set the start date manually
-- @Date = '2006xxxx'

-- set the number of rows for maint. plan history
SELECT @HistRows = 10000

SELECT  @PlanID = NEWID()                             
INSERT  msdb.dbo.sysdbmaintplans (plan_id, plan_name,  owner, max_history_rows, remote_history_server, max_remote_history_rows) 
VALUES (@PlanID, @DBName + N' DB Maintenance Plan', @Owner, @HistRows, N'', 0)              

-------------------------------------------------------------
--   Set the parameters: END
-------------------------------------------------------------


print '================================================================================================'  
print 'PLAN CREATED: '
print '------------------------------------------------------------------------------------------------' 
print 'Name: ' + CHAR(9) + CHAR(9) + @DBName + N' DB Maintenance Plan' 
print 'ID: ' + CHAR(9) + CHAR(9) + @planid      
print '================================================================================================'  

select @FullBckCommand = N'EXECUTE master.dbo.xp_sqlmaint N''-PlanID ' + @PlanID + ' -Rpt "' + @ReportPath + '\' + @DBName + ' DB Maintenance Plan4.txt" -DelTxtRpt ' + @ReportsRetention + ' -WriteHistory  -VrfyBackup -BkUpOnlyIfClean -CkDB  -BkUpMedia DISK -BkUpDB "' + @BackupPath + '" -DelBkUps ' + @FullBckRetention + ' -CrBkSubDir -BkExt "BAK"'''
select @TranBckCommand = N'EXECUTE master.dbo.xp_sqlmaint N''-PlanID ' + @PlanID + ' -Rpt "' + @ReportPath + '\' + @DBName + ' DB Maintenance Plan6.txt" -DelTxtRpt ' + @ReportsRetention + ' -WriteHistory  -VrfyBackup -BkUpOnlyIfClean -CkDB  -BkUpMedia DISK -BkUpLog "' + @BackupPath + '" -DelBkUps ' + @TranBckRetention + ' -CrBkSubDir -BkExt "TRN"'''
select @IntegriCommand = N'EXECUTE master.dbo.xp_sqlmaint N''-PlanID ' + @PlanID + ' -Rpt "' + @ReportPath + '\' + @DBName + ' DB Maintenance Plan2.txt" -DelTxtRpt ' + @ReportsRetention + ' -WriteHistory  -CkDB  '''
select @OptimalCommand = N'EXECUTE master.dbo.xp_sqlmaint N''-PlanID ' + @PlanID + ' -Rpt "' + @ReportPath + '\' + @DBName + ' DB Maintenance Plan0.txt" -DelTxtRpt ' + @ReportsRetention + ' -WriteHistory  -RebldIdx 100 '''

select @JobName4 = N'DB Backup Job for DB Maintenance Plan ''' + @DBName + ' DB Maintenance Plan'''
select @JobName6 = N'Transaction Log Backup Job for DB Maintenance Plan ''' + @DBName + ' DB Maintenance Plan'''
select @JobName2 = N'Integrity Checks Job for DB Maintenance Plan ''' + @DBName + ' DB Maintenance Plan'''
select @JobName0 = N'Optimizations Job for DB Maintenance Plan ''' + @DBName + ' DB Maintenance Plan'''

  EXECUTE @ReturnCode = msdb.dbo.sp_add_job @job_id = @JobID4 OUTPUT, @job_name = @JobName4, @enabled = 1, @category_id = 3
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 
  EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID4, @step_id = 1, @step_name = N'Step 1', @subsystem = N'TSQL', @on_success_action = 1, @on_fail_action = 2, @command = @FullBckCommand, @flags = 4
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 
  EXECUTE @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id = @JobID4, @name = N'Schedule 1', @enabled = 1, @freq_type = 4, @active_start_date = @Date, @active_start_time = @FullBckStartTime, @freq_interval = 1, @freq_subday_type = 1, @freq_subday_interval = 0, @freq_relative_interval = 0, @freq_recurrence_factor = 1, @active_end_date = 99991231, @active_end_time = 235959
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 
  EXECUTE @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @JobID4, @server_name = @ServerName 
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 

print 'Full Backup Job: '
print '------------------------------------------------------------------------------------------------' 
print 'Name: ' + CHAR(9) + CHAR(9) + @JobName4 
print 'ID: ' + CHAR(9) + CHAR(9) + @JobID4
print '================================================================================================'  

  EXECUTE @ReturnCode = msdb.dbo.sp_add_job @job_id = @JobID6 OUTPUT, @job_name = @JobName6, @enabled = 1, @category_id = 3
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 
  EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID6, @step_id = 1, @step_name = N'Step 1', @subsystem = N'TSQL', @on_success_action = 1, @on_fail_action = 2, @command = @TranBckCommand, @flags = 4
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 
  EXECUTE @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id = @JobID6, @name = N'Schedule 1', @enabled = 1, @freq_type = 4, @active_start_date = @Date, @active_start_time = @TranBckStartTime, @freq_interval = 1, @freq_subday_type = 1, @freq_subday_interval = 0, @freq_relative_interval = 0, @freq_recurrence_factor = 1, @active_end_date = 99991231, @active_end_time = 235959
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 
  EXECUTE @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @JobID6, @server_name = @ServerName 
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 

print 'Tran Backup Job: '
print '------------------------------------------------------------------------------------------------' 
print 'Name: ' + CHAR(9) + CHAR(9) + @JobName6  
print 'ID: ' + CHAR(9) + CHAR(9) + @JobID6 
print '================================================================================================'  

  EXECUTE @ReturnCode = msdb.dbo.sp_add_job @job_id = @JobID2 OUTPUT, @job_name = @JobName2, @enabled = 1, @category_id = 3
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 
  EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID2, @step_id = 1, @step_name = N'Step 1', @subsystem = N'TSQL', @on_success_action = 1, @on_fail_action = 2, @command = @IntegriCommand, @flags = 4
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 
  EXECUTE @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id = @JobID2, @name = N'Schedule 1', @enabled = 1, @freq_type = 4, @active_start_date = @Date, @active_start_time = @IntegriStartTime, @freq_interval = 1, @freq_subday_type = 1, @freq_subday_interval = 0, @freq_relative_interval = 0, @freq_recurrence_factor = 1, @active_end_date = 99991231, @active_end_time = 235959
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 
  EXECUTE @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @JobID2, @server_name = @ServerName 
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 

print 'Integrity C Job: '
print '------------------------------------------------------------------------------------------------' 
print 'Name: ' + CHAR(9) + CHAR(9) + @JobName2 
print 'ID: ' + CHAR(9) + CHAR(9) + @JobID2 
print '================================================================================================'  

  EXECUTE @ReturnCode = msdb.dbo.sp_add_job @job_id = @JobID0 OUTPUT, @job_name = @JobName0, @enabled = 1, @category_id = 3
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 
  EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID0, @step_id = 1, @step_name = N'Step 1', @subsystem = N'TSQL', @on_success_action = 1, @on_fail_action = 2, @command = @OptimalCommand, @flags = 4
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 
  EXECUTE @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id = @JobID0, @name = N'Schedule 1', @enabled = 1, @freq_type = 4, @active_start_date = @Date, @active_start_time = @OptimalStartTime, @freq_interval = 1, @freq_subday_type = 1, @freq_subday_interval = 0, @freq_relative_interval = 0, @freq_recurrence_factor = 1, @active_end_date = 99991231, @active_end_time = 235959
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 
  EXECUTE @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @JobID0, @server_name = @ServerName 
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 
--  SELECT @JobID0, @JobID1, @JobID2, @JobID3, @JobID4, @JobID5, @JobID6, @JobID7

print 'Optimalizat Job: '
print '------------------------------------------------------------------------------------------------' 
print 'Name: ' + CHAR(9) + CHAR(9) + @JobName0 
print 'ID: ' + CHAR(9) + CHAR(9) + @JobID0 
print '================================================================================================'  

print 'JOBS CREATED' 
print '================================================================================================'  

--  DECLARE  @ReturnCode INT  
--  BEGIN TRANSACTION         
  IF (SELECT COUNT(*) FROM msdb.dbo.sysdbmaintplan_databases WHERE plan_id = @PlanID AND database_name = @DBName) < 1 
INSERT msdb.dbo.sysdbmaintplan_databases (plan_id, database_name) VALUES (@PlanID, @DBName)

  DELETE FROM msdb.dbo.sysdbmaintplan_jobs WHERE plan_id = @PlanID

  INSERT msdb.dbo.sysdbmaintplan_jobs VALUES (@PlanID, @JobID4)
  INSERT msdb.dbo.sysdbmaintplan_jobs VALUES (@PlanID, @JobID6)
  INSERT msdb.dbo.sysdbmaintplan_jobs VALUES (@PlanID, @JobID2)
  INSERT msdb.dbo.sysdbmaintplan_jobs VALUES (@PlanID, @JobID0)
IF (@@ERROR <> 0) GOTO QuitWithRollback 

print 'JOBS and DATABASE has been linked to PLAN.' 
print '================================================================================================'  

COMMIT TRANSACTION

GOTO   EndSave              
QuitWithRollback:
  IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION 
print '================================================================================================'  
  print CHAR(10) + CHAR(13) + 'Failed'  + CHAR(10) + CHAR(13)
print '================================================================================================'  

EndSave: 

BEGIN TRANSACTION 
           
  SELECT @ReturnCode = 0     
  EXECUTE @ReturnCode = msdb.dbo.sp_update_job @job_id = @JobID4, @automatic_post = 0 , @owner_login_name = @Owner
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback2 

  SELECT @ReturnCode = 0     
  EXECUTE @ReturnCode = msdb.dbo.sp_update_job @job_id = @JobID6, @automatic_post = 0 , @owner_login_name = @Owner
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback2 

  SELECT @ReturnCode = 0     
  EXECUTE @ReturnCode = msdb.dbo.sp_update_job @job_id = @JobID2, @automatic_post = 0 , @owner_login_name = @Owner
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback2 

  SELECT @ReturnCode = 0     
  EXECUTE @ReturnCode = msdb.dbo.sp_update_job @job_id = @JobID0, @automatic_post = 0 , @owner_login_name = @Owner
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback2 

print 'OWNER changed to ''' + @Owner + '''.'
print '================================================================================================'  

COMMIT TRANSACTION
          
GOTO   EndSave2              
QuitWithRollback2:
  IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION 
print '================================================================================================'  
  print CHAR(10) + CHAR(13) + 'Failed'
print '================================================================================================'  
EndSave2: 

set nocount off

Rate

You rated this post out of 5. Change rating

Share

Share

Rate

You rated this post out of 5. Change rating