当前位置: 代码迷 >> SQL >> mssql 功课
  详细解决方案

mssql 功课

热度:356   发布时间:2016-05-05 10:55:48.0
mssql 作业

1.什么叫作业?

作业是一系列由 SQL Server 代理按顺序执行的指定操作。 一个作业可以执行各种类型的活动,包括运行 Transact-SQL 脚本、命令提示符应用程序、Microsoft ActiveX 脚本、Integration Services 包、Analysis Services 命令和查询或复制任务。 作业可以运行重复或可计划的任务,然后它们可以通过生

成警报来自动通知用户作业状态,从而极大地简化了 SQL Server 管理。

2.先看一个常用通过GUI利用作业动态备份数据据库。

    1、打开SQL Server Management Studio    2、启动SQL Server代理    3、点击作业->新建作业    4、"常规"中输入作业的名称    5、新建步骤,类型选T-SQL,在下面的命令中输入下面语句     DECLARE @strPath NVARCHAR(200)        set @strPath = convert(NVARCHAR(20),getdate(),120)        set @strPath = REPLACE(@strPath, ':' , '.')        set @strPath = 'E:\DATA_db\MSSQL.1\MSSQL\Backup' + @strPath + '.bak'        BACKUP DATABASE [数据库名] TO DISK = @strPath WITH NOINIT , NOUNLOAD , NOSKIP , STATS = 10, NOFORMAT     6、添加计划,设置频率,时间等。基本把以上的流程基本的填写完,就可以正常作业了。

3.作业系统表
    SELECT * FROM msdb.dbo.sysjobs            --存储将由 SQL Server 代理执行的各个预定作业的信息  SELECT * FROM msdb.dbo.sysjobschedules    --包含将由 SQL Server 代理执行的作业的计划信息  SELECT * FROM msdb.dbo.sysjobactivity;    --记录当前 SQL Server 代理作业活动和状态  SELECT * FROM msdb.dbo.sysjobservers      --存储特定作业与一个或多个目标服务器的关联或关系  SELECT * FROM msdb.dbo.sysjobsteps;       --包含 SQL Server 代理要执行的作业中的各个步骤的信息  SELECT * FROM msdb.dbo.sysjobstepslogs;   --包含所有 SQL Server 代理作业步骤的作业步骤日志  SELECT * FROM msdb.dbo.sysjobs_view;      --  SELECT * FROM msdb.dbo.sysjobhistory      --包含有关 SQL Server 代理执行预定作业的信息  SELECT * FROM msdb.dbo.syscategories      --包含由 SQL Server Management Studio 用来组织作业、警报和操作员的类别
4.创建作业
 创建作业的步骤一般如下所示:  执行 sp_add_job 来创建作业。  执行 sp_add_jobstep 来创建一个或多个作业步骤。  执行 sp_add_schedule 来创建计划。  执行 sp_attach_schedule 将计划附加到作业。  执行 sp_add_jobserver 来设置作业的服务器。  本地作业是由本地 SQL Server 代理进行缓存的。因此,任何修改都会隐式强制 SQL Server 代理重新缓存该作业。由于直到调用 sp_add_jobserver 时,SQL Server 代理才缓存作业,因此最后调用 sp_add_jobserver 将更为有效。

启动作业

        1:通过SSMS工具启动作业[]

        2:通过SQL命令启动作业

启动作业一般通过sp_start_job来实现,具体语法与操作见下面。

语法:

sp_start_job 

     {   [@job_name =] 'job_name'

       | [@job_id =] job_id }

     [ , [@error_flag =] error_flag]

     [ , [@server_name =] 'server_name']

     [ , [@step_name =] 'step_name']

     [ , [@output_flag =] output_flag]

     

例子:

 

exec msdb.dbo.sp_start_job @job_name='JOB_CYCLE_ERRORLOG'

停止作业

        1:通过SSMS工具停作业[]

        2:通过SQL命令停止作业

语法:

sp_stop_job 

      [@job_name =] 'job_name'

    | [@job_id =] job_id 

    | [@originating_server =] 'master_server'

    | [@server_name =] 'target_server'

例子:

exec msdb.dbo.sp_stop_job    @job_name='JOB_CYCLE_ERRORLOG'

启用或禁用作业

1:通过SSMS工具启用作业[]

        2:通过SQL命令禁用作业

语法:

列子:EXEC msdb.dbo.sp_update_job

    @job_name = N'JOB_CYCLE_ERRORLOG',

    @enabled = 0 ;  --0 禁用作业、  1启用作业

GO

删除作业

1:通过SSMS工具删除作业[]

2:通过SQL命令删除作业

例子:

EXEC msdb.dbo.sp_delete_job  @job_name = 'JOB_CYCLE_ERRORLOG';

    

5.查看作业的T-SQL语句

  --1:查看属于某个数据库的所有作业。  SELECT job.job_id        AS JOB_ID            ,         name            AS JOB_NAME          ,         enabled         AS JOB_ENABLED       ,         description     AS JOB_DESCRIPTION   ,         date_created    AS DATE_CREATED      ,         date_modified   AS DATE_MODIFIED  FROM msdb.dbo.sysjobs job  WHERE   job_id IN( SELECTjob_id                    FROM    msdb.dbo.sysjobsteps                    WHERE   database_name = 'DataBaseName' )   --2:查看某个作业类别的所有作业  SELECT  job.name             AS Job_Name       ,           job.description      AS Job_Description ,           job.date_created     AS Date_Created    ,           job.date_modified    AS Date_Modified   ,           type .name             AS Job_Class  FROM  msdb.dbo.sysjobs job        LEFT JOIN msdb.dbo.syscategories type ON job.category_id = type .category_id   WHERE type.name = '[Uncategorized (Local)]'     --3:查看禁用/启用的作业  SELECT * FROM msdb.dbo.sysjobs WHERE  enabled=0    --0:禁用 1:为启用     --4:查看出错的作业记录     --4.1:查询那些作业在今天出错(如果要查询历史出错作业,去掉查询时间条件即可)  SELECT name               AS JOB_NAME        ,        description         AS JOB_Description ,        date_created        AS Date_Created    ,        date_modified       AS Date_Modified  FROM  msdb.dbo.sysjobs  WHERE enabled = 1        AND job_id IN(        SELECT  job_id        FROM    Msdb.dbo.sysjobhistory        WHERE   run_status = 0                AND run_date = CAST(CONVERT(VARCHAR(8), GETDATE(), 112) AS INT) )     --4.2:查看出错详细信息  SELECT job.name                AS JOB_NAME ,        h.step_id              AS STEP_ID  ,        h.step_name            AS STEP_NAME,        h.message              AS ERR_MSG  ,        h.run_date             AS RUN_DATE ,        h.run_time             AS RUN_TIME ,        msdb.dbo.agent_datetime(h.run_date, h.run_time) AS 'RunDateTime' ,        CAST(run_duration / 10000 AS VARCHAR(2)) + N'小时'      + CAST(( run_duration - run_duration / 10000 * 10000 ) / 100 AS VARCHAR(2))      + N'分钟' + SUBSTRING(CAST(run_duration AS VARCHAR(10)),                            LEN(CAST(run_duration AS VARCHAR(10))) - 1, 2)      + N'秒' AS run_duration  FROM  msdb.dbo.sysjobhistory h        LEFT JOIN msdb.dbo.sysjobs job ON h.job_id = job.job_id  WHERE run_status = 0        AND run_date = CAST(CONVERT(VARCHAR(8), GETDATE(), 112) AS INT)     --5:查看作业的执行时间:  --5.1:查看当天成功执行的作业的时间(查看的是作业Step信息)  SELECT job.name         AS job_name ,        h.step_id      AS step_id  ,        h.step_name     AS step_name,        h.message       AS Message  ,        h.run_date      AS Run_date ,        h.run_time      AS run_time ,        msdb.dbo.agent_datetime(h.run_date, h.run_time) AS 'RunDateTime' ,        CAST(run_duration / 10000 AS VARCHAR(2)) + N'小时'        + CAST(( run_duration - run_duration / 10000 * 10000 ) / 100 AS VARCHAR(2))        + N'分钟' + SUBSTRING(CAST(run_duration AS VARCHAR(10)),                            LEN(CAST(run_duration AS VARCHAR(10))) - 1, 2)        + N'秒' AS run_duration  FROM msdb.dbo.sysjobhistory h        LEFT JOIN msdb.dbo.sysjobs job ON h.job_id = job.job_id   WHERE run_status = 1        AND run_date = CAST(CONVERT(VARCHAR(8), GETDATE(), 112) AS INT)        ORDER BY run_duration DESC     --5.2:查询每个作业的执行时间、按执行时间降序  SELECT  job.name            AS JOB_NAME ,          h.run_date        AS RUN_DATE ,          SUM(run_duration) AS SUM_DURATION  FROM  msdb.dbo.sysjobhistory h          LEFT JOIN msdb.dbo.sysjobs job ON h.job_id = job.job_id  WHERE run_status = 1          AND run_date = CAST(CONVERT(VARCHAR(8), GETDATE(), 112) AS INT)  GROUP BY name ,          run_date  ORDER BY Sum_Duration DESC




  相关解决方案