• Generate the Jobs script from msdb Database


    前两周,由于数据库简繁体的转换,大量的数据库需要转到新的服务器。 在转其中的一台的时候,原先导出来的JOBS脚本不翼而飞(原因至今未明),而恰巧这一台服务器有90多个JOB(看下图恢复后的,注意滚动条的长短),这样一来,可急坏了人了。 这么多的JOB要一个一个建立,时间去了不说,有些JOB根本不知道执行的是哪些命令,执行顺序如何,这么多的系统相互交纵复杂,如果不能正确的处理好,星期一可就乱了套了。到时谁都不会有好果子吃。 由于JOBS都是存在于msdb数据库,还好,我们平时是有备份这个数据库的,这样一来,我们应该想办法从这个数据库里取回一些有用的信息。 首先,我应该恢复一个msdb数据库为别的名字,然后赶紧求助于互联网。经过了一番摸索终于可以从该数据库中提取出脚本。 现在把这脚本也放出来,希望有此需要的人做参考使用,亦或大家做学习之用,如果大家有好的方法也请讲出。 当然,要是在系统完好之前,直接备份就用不着这么麻烦了,直接在图形介面产生的脚本又快又准确。

    CREATE  PROCEDURE  Get_JobList
    as    
    --  created by geton on 2014-08-16    
    declare @jobnamecc  varchar(250)    
    declare @strsql  varchar(5000)    
    declare @jobname varchar(30),@category_calss_i int,@category_calss varchar(50),@category_name varchar(50),
            @category_type varchar(30),@category_id int,@category_type_i int    
        
        
    declare joblist cursor for 
    select [name]  from     msdb.dbo.sysjobs --where name='HR - AUTO GET COE' 
    
    open joblist
        fetch next from joblist into @jobnamecc  
        while @@fetch_status=0    
           begin    
              begin try   
                select @jobname =@jobnamecc ,@category_calss = '',@category_name='',@category_type = ''    
        
                    select 
                    @category_calss = case when tshc.category_class = 1 then 'JOB'    
                                           when tshc.category_class = 2 then 'ALERT'    
                                           else 'OPERATOR'    
                                           end,
                    @category_type = case when tshc.category_type = 1 then 'LOCAL'    
                                          when tshc.category_type = 2 then 'MULTI-SERVER'    
                                          else 'NONE'    
                                          end,     
                    @category_name = tshc.name,    
                    @category_type_i = category_type,    
                    @category_calss_i = tshc.category_class,    
                    @category_id = tshc.category_id    
                    from    
                    msdb.dbo.sysjobs_view as sv    -- Here "msdb.dbo.sysjobs_view" should be changed to the DB which you restored
                    INNER JOIN msdb.dbo.syscategories  as tshc on sv.category_id = tshc.category_id  
                    where    -- Here "msdb.dbo.syscategories" should be changed to the DB which you restored 
                    (sv.name=@jobname AND tshc.category_class = 1)   --  category_class = 1 -- only job type are exported
        
        PRINT 'BEGIN TRANSACTION'    
        PRINT 'DECLARE @ReturnCode INT'   
        PRINT 'SELECT @ReturnCode = 0'  
        PRINT 'IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N''' + @category_name +'''AND category_class=' +rtrim(@category_calss_i)+')'    
        PRINT 'BEGIN'    
        PRINT 'EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'''+ @category_calss+''', @type=N'''+@category_type+''', @name=N'''+@category_name+''''    
        PRINT 'IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback'    
        PRINT 'end'    
        
        declare @eventloglevel int,@emaillevel int,@netsendlevel int,@pagelevel int    
        declare @emailleveloprid nvarchar(256),@netsendleveloprid nvarchar(256),@pageleveloprid nvarchar(256)    
        declare @isenable int , @description nvarchar(1024),@owner_log_name nvarchar(512),@delete_level int    
        declare @jobid uniqueidentifier,@start_step_id int,@server nvarchar(512)    
        select    
        @eventloglevel=sv.notify_level_eventlog,    
        @emaillevel=sv.notify_level_email ,    
        @netsendlevel=sv.notify_level_netsend,     
        @pagelevel=sv.notify_level_page,     
        @emailleveloprid = isnull((select top 1 name from   msdb..sysoperators where id = sv.notify_email_operator_id),''),    
        @netsendleveloprid  =  isnull((select top 1 name from   msdb..sysoperators where id = sv.notify_netsend_operator_id),''),    
        @pageleveloprid = isnull((select top 1 name from   msdb..sysoperators where id = sv.notify_page_operator_id),'') ,   
        @isenable = sv.enabled ,   
        @description = sv.description ,   
        @owner_log_name = isnull(suser_sname(sv.owner_sid), N''''),  
        @delete_level = sv.delete_level,    
        @jobid = sv.job_id,    
        @start_step_id = start_step_id ,   
        @server = '(local)'--originating_server  --Due to this script would be executed on target machine,Here change the @server parameter to "LOCAL" 
        from msdb.dbo.sysjobs_view as sv    
        where (sv.name=@jobname )    
        
        --  select * from msdb.dbo.sysjobs_view
        PRINT 'DECLARE @jobId BINARY(16)'    
        PRINT 'EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name=N'''+@jobname+''','    
        PRINT ' @enabled='+RTRIM(@isenable)+', '    
        PRINT ' @notify_level_eventlog='+RTRIM(@eventloglevel)+', '    
        PRINT ' @notify_level_email='+RTRIM(@emaillevel)+', '    
        PRINT ' @notify_level_netsend='+RTRIM(@netsendlevel)+', '    
        PRINT ' @notify_level_page='+RTRIM(@pagelevel)+', '    
        PRINT ' @notify_email_operator_name ='''+RTRIM(@emailleveloprid)+''', '    
        PRINT ' @notify_netsend_operator_name='''+RTRIM(@netsendleveloprid)+''', '    
        PRINT ' @notify_page_operator_name='''+RTRIM(@pageleveloprid)+''', '    
        PRINT ' @delete_level='+RTRIM(@delete_level)+', '    
        PRINT ' @description=N'''+@description+''', '    
        PRINT ' @category_name=N'''+@category_name+''', '    
        PRINT ' @owner_login_name=N'''+@owner_log_name+''', '    
        PRINT ' @job_id = @jobId OUTPUT'    
        PRINT 'IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback'    
         --SELECT * FROM msdb.dbo.syscategories    
    
    
     
    
        declare @step_id int    
        declare @step_name nvarchar(512) ,@cmdexec_success_code int,@on_success_action int,@on_success_step_id int,   
                @on_fail_action int,@on_fail_step_id int,@retry_attempts int,@retry_interval int,@os_run_priority int,    
                @subsystem nvarchar(512),@database_name nvarchar(512),@flags int,@command nvarchar(max)    
        
        declare jbcur cursor  for  
        select step_id  from msdb..sysjobsteps  where job_id = @jobid order by step_id ;  
        --  "msdb..sysjobsteps"  should be changed to the DB which you restored
        open jbcur;    
        fetch next from jbcur into @step_id    
        while @@fetch_status = 0    
        begin    
               
           SELECT 
           @step_name = step_name,    
           @cmdexec_success_code= cmdexec_success_code ,   
           @on_success_action = on_success_action ,
           @on_success_step_id = on_success_step_id  ,  
           @on_fail_action = on_fail_action,    
           @on_fail_step_id = on_fail_step_id ,   
           @retry_attempts = retry_attempts,    
           @retry_interval = retry_interval,    
           @os_run_priority = os_run_priority,    
           @subsystem = subsystem,    
           @database_name = database_name,    
           @command = command,    
           @flags = flags    
         FROM  msdb..sysjobsteps a WHERE job_id = @jobid and step_id  = @step_id    
               
         PRINT ' EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, '    
         PRINT ' @step_name=N'''+@step_name+''', '    
         PRINT ' @step_id='+RTRIM(@step_id)+', '    
         PRINT ' @cmdexec_success_code='+RTRIM(@cmdexec_success_code)+', '    
         PRINT ' @on_success_action='+RTRIM(@on_success_action)+', '    
         PRINT ' @on_success_step_id='+RTRIM(@on_success_step_id)+', '    
         PRINT ' @on_fail_action='+RTRIM(@on_fail_action)+', '    
         PRINT ' @on_fail_step_id='+RTRIM(@on_fail_step_id)+', '    
         PRINT ' @retry_attempts='+RTRIM(@retry_attempts)+', '    
         PRINT ' @retry_interval='+RTRIM(@retry_interval)+', '    
         PRINT ' @os_run_priority='+RTRIM(@os_run_priority)+', @subsystem=N'''+@subsystem+''', '    
         PRINT ' @database_name=N'''+@database_name+''','    
         PRINT ' @flags='+RTRIM(@flags)+' ,'    
         PRINT ' @command=N'''+REPLACE(@command,'''','''''')+''''    
         PRINT ' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback'    
        
        fetch next from jbcur into @step_id    
        
        end    
        
        close jbcur    
        deallocate jbcur    
               
        PRINT '    EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = '+rtrim(@start_step_id)    
        PRINT '    IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback    '    
        
        DECLARE @enabled INT,@freq_type INT,@freq_interval INT,@freq_subday_type INT,@freq_subday_interval INT    
         ,@freq_relative_interval INT,@freq_recurrence_factor INT,@active_start_date INT,@active_end_date INT    
         ,@active_start_time INT,@active_end_time INT,@name VARCHAR(512)    
        
        SELECT    
         @name = a.name,  
         @enabled = enabled ,  
         @freq_interval = freq_interval ,   
         @freq_type = freq_type  ,  
         @freq_subday_type=freq_subday_type,    
         @freq_subday_interval=freq_subday_interval,    
         @freq_relative_interval=freq_relative_interval  ,  
         @freq_recurrence_factor=freq_recurrence_factor ,   
         @active_start_date=active_start_date ,   
         @active_end_date=active_end_date ,   
         @active_start_time=active_start_time  ,  
         @active_end_time=active_end_time    
         FROM msdb..sysschedules a   -- "msdb..sysschedules"  should be changed to the DB which you restored
         INNER JOIN msdb.dbo.sysjobschedules b ON a.schedule_id = b.schedule_id  -- "msdb..sysjobschedules " should be changed to the DB which you restored
        WHERE  job_id = @jobid    
            
        IF(@name IS not null)    
        begin    
         PRINT '    EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'''+@name+''', '    
         PRINT '    @enabled='+RTRIM(@enabled)+', '    
         PRINT '    @freq_type='+RTRIM(@freq_type)+', '    
         PRINT '    @freq_interval='+RTRIM(@freq_interval)+', '    
         PRINT '    @freq_subday_type='+RTRIM(@freq_subday_type)+', '    
         PRINT '    @freq_subday_interval='+RTRIM(@freq_subday_interval)+', '    
         PRINT '    @freq_relative_interval='+RTRIM(@freq_relative_interval)+', '    
         PRINT '    @freq_recurrence_factor='+RTRIM(@freq_recurrence_factor)+', '    
         PRINT '    @active_start_date='+RTRIM(@active_start_date)+', '    
         PRINT '    @active_end_date='+RTRIM(@active_end_date)+', '    
         PRINT '    @active_start_time='+RTRIM(@active_start_time)+', '    
         PRINT '    @active_end_time='+RTRIM(@active_end_time)+' '    
         --PRINT '    @schedule_uid=N'''+RTRIM(NEWID())+''''    
         PRINT ' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback'    
        end    
            
        
        PRINT ' EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'''+@server+''''    
        PRINT ' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback'    
        PRINT 'COMMIT TRANSACTION'    
        PRINT 'GOTO endSave'    
        PRINT 'QuitWithRollback:'    
        PRINT 'IF(@@TRANCOUNT>0)ROLLBACK TRANSACTION'    
        PRINT 'endSave:'    
        PRINT ' '    
        PRINT 'GO'          
                  
         --PRINT @strsql      
         exec (@strsql)    
         end try    
       begin catch     
            declare @errmsg varchar(1000)    
            set @errmsg='[Prco_Get_IPDataBase]:'+ERROR_MESSAGE()    
            print @errmsg    
            print @strsql    
      end catch;     
           fetch next from joblist into @jobnamecc   
           end  
      
       close joblist    
       deallocate  joblist
  • 相关阅读:
    Linux下通过.desktop 文件创建桌面程序图标及文件编写方式(Desktop Entry文件概述)
    Ubuntu16.04进入挂起或休眠状态时按任何键都无法唤醒问题解决办法
    Ubuntu16.04+Gnome3 锁定屏幕快捷键无效解决办法
    A start job is running for Raise network interface(5min 13s )问题解决方法
    Ubuntu16.04 “有线未托管”有线网络不可用问题解决
    A start job is running for Network Manager wait online (29s / no limit) 等待30s解决办法
    Linux 串口终端调试工具minicom
    Linux 终端仿真程序Putty
    Oracle:在 debian9 上完美安装 oracle 10.2.0.5 x64
    从debian9、ubuntu18.04的deb包依赖来看,似乎不是那么好!!
  • 原文地址:https://www.cnblogs.com/Geton/p/3957475.html
Copyright © 2020-2023  润新知