SQLJOB
创建定时作业
如果在SQL Server 里需要定时或者每隔一段时间执行某个存储过程或3200 字符以内的SQL 语句时,可以用管理->SQL Server 代理->作业来实现。
(1)、管理->SQL Server 代理->作业(按鼠标右键)->新建作业
(2)、新建作业属性(常规)->名称[自定义本次作业的名称]->启用的方框内是勾号->分类处可选择也可用默认的[未分类(本地)]->所有者默认为登录SQL Server 用户[也可选其它的登录]->描述[填写本次工作详细描述内容];
创建作业分类的步骤:
SQLServer 代理->作业->右键选所有任务->添加、修改、删除
(3)、新建作业属性(步骤)->新建->步骤名[自定义第一步骤名称]->类型
[Transact-SQL(TSQL)脚本]->数据库[要操作的数据库]->命令 [ 如果是简单的SQL 直接写进去即可,也可用打开按钮输入一个已写好的*.sql。文件如果要执行存储过程,填execp_procedure_namev_parameter1,[ v_parameter2v_parameterN] ->确定 (如果有多个步骤,可以再次调用下面的新建按钮;也可以对已有的多个步骤插入、编辑、删除);
(4)、建作业属性(调度)->新建调度->名称[自定义调度名称]->启用的方框内是勾号->调度->反复出现-> 更改[调度时间表]->确定(如果只要保存此作业,不要定时做可以把启用的方框内是勾号去掉);
(5)、建作业属性(通知)->用默认的通知方法就好[当作业失败时,写入Windows 应用程序系统日志] ->确定。
(6)、跟作业执行相关的一些SQL Server 知识:
SQLServer Agent 服务必须正常运行,启动它的NT 登录用户要跟启动SQL Server数据库的NT 登录用户一致;
点作业右键可以查看作业执行的历史记录情况,也可以立即启动作业和停止作业。
最近在看作业历史记录时,发现有的作业记录的历史记录多,有的作业记录的记录的历史记录少。如何能使某些作业按各自的需求,保留一段时间.比如保留一个月的历史记录.
看了SQL Server 的在线帮助文档,里
面介绍说:
在管理->SQL Server 代理->右键选属性->作业系统->限制作业历史记录日志的大小作业历史记录日志的最大大小(行数) ,默认为1000 。如果某台机器的作业数量很多,一定要提高它,例如为100000每个作业历史记录日志的最大行数,默认为100。如果作业每天执行两次,需要保留一个月的日志,可以设为60
它们之间有一个相互制约关系, 我们可以根据自己的需要来改.
如果SQL Server 服务器改过机器名, 管理是旧名称时建立的job的时候可能会遇到。
错误14274: 无法添加、更新或删除从MSX 服务器上发起的作业(或其步骤或调度)。看了
Microsoft的文档:http:
//support.microsoft.com/default.aspx?scid=kb;en-us;281642说SQL Server 2000 系统里msdb..sysjobs 里originating_server 字段里存的是原来的服务器的名称。24X7 在用的系统肯定不能按上面Microsoft 的文档说的那样把名字改回来又改过去。于是想,msdb..sysjobs 能否update originating_server 字段成现在在用的新服务器名?
Solution:
usemsdb
select* from sysjobs
找到originating_server 字段还是旧服务器的job_id,
然后执行update 语句:
updatesysjobs set originating_server='new_server_name'
wherejob_id='B23BBEBE-A3C1-4874-A4AB-0E2B7CD01E14'
(所影响的行数为1 行)
这样就可以添加、更新或删除那些曾经出error 14274 的作业了。
如果想把作业由一台机器迁移到另一台机器,可以先保留好创建作业的脚本, 然后在另一台机器上运行。
12.2、导出所有作业的创建脚本操作步骤:
管理->SQL Server 代理->作业(鼠标右键)->所有任务->生成SQL 脚本->保存到操作系统下的某个sql 文件导出某一个作业的创建脚本操作步骤:
(1)、管理->SQL Server 代理->作业->选中待转移的作业(鼠标右键)->所有任务->生成SQL 脚本->保存到OS 下的某个sql 文件
(2)、然后在目的服务器上运行刚才保存下来的创建作业的sql 脚本。( 如果建作业的用户或者提醒的用户不存在,则会出错; 我们需要在目的服务器上建立相关的WINDOWS 用户或者SQL Server 数据库登录, 也可以修改创建作业的脚本, 把目的服务器上不存在的用户替换成已经有的用户。如果生成日志的物理文件目录不存在,也应该做相关的修改,
例如d:\区转f:\区等字符串的 @command 命令里有分隔符号 go 也会出错, 可以把它去掉)。
SQL作业的操作:
--定义创建作业
DECLARE @jobid uniqueidentifier
EXEC msdb.dbo.sp_add_job
@job_name = N'作业名称',
@job_id = @jobid OUTPUT
--定义作业步骤
DECLARE @sql nvarchar(400),@dbname sysname
SELECT @dbname=DB_NAME(), --作业步骤在当前数据库中执行
@sql=N'--作业步骤内容' --一般定义的是使用TSQL处理的作业,
这里定义要执行的Transact-SQL语句
EXEC msdb.dbo.sp_add_jobstep
@job_id = @jobid,
@step_name = N'作业步骤名称',
@subsystem = 'TSQL', --步骤的类型,一般为TSQL
@database_name=@dbname,
@command = @sql
--创建调度(使用后面专门定义的几种作业调度模板)
EXEC msdb..sp_add_jobschedule
@job_id = @jobid,
@name = N'调度名称',
@freq_type=4, --每天
@freq_interval=1, --指定每多少天发生一次,这里是天.
@freq_subday_type=0x8, --重复方式,0x1=在指定的时间,0x4=多少分钟,0x8=多少小时执行一
次
@freq_subday_interval=1, --重复周期数,这里每小时执行一次
@active_start_date = NULL, --作业执行的开始日期,为NULL时表示当前日期,格式为YYYYMMDD
@active_end_date = 99991231, --作业执行的停止日期,默认为,格式为YYYYMMDD
@active_start_time = 00000, --作业执行的开始时间,格式为HHMMSS
@active_end_time = 235959 --作业执行的停止时间,格式为HHMMSS
--添加目标服务器
DECLARE @servername sysname
SET @servername=CONVERT(nvarchar(128),SERVERPROPERTY(N'ServerName'))
EXEC msdb.dbo.sp_add_jobserver
@job_id = @jobid,
@server_name = @servername --使用当前SQL实例
--调度模板定义
--/*--日调度
EXEC msdb..sp_add_jobschedule
@job_id = @jobid,
@name = N'调度名称',
@freq_type=4, --每天
@freq_interval=1, --指定每多少天发生一次,这里是天.
@freq_subday_type=0x8, --重复方式,0x1=在指定的时间,0x4=多少分钟,0x8=多少小时执行一次
@freq_subday_interval=1, --重复周期数,这里每小时执行一次
@active_start_date= NULL, --作业执行的开始日期,为NULL时表示当前日期,格式为YYYYMMDD
@active_end_date= 99991231, --作业执行的停止日期,默认为,格式为YYYYMMDD
@active_start_time= 00000, --作业执行的开始时间,格式为HHMMSS
@active_end_time= 235959 --作业执行的停止时间,格式为HHMMSS
--*/
--/*--周调度
EXEC msdb.dbo.sp_add_jobschedule
@job_id= @jobid,
@name= N'调度名称',
@freq_type= 8, --每周
@freq_recurrence_factor= 1, --每多少周执行一次,这里是每周
@freq_interval= 62, --在星期几执行,由POWER(2,N)表示,N的值为~6,代表星期日~
星期六,如果指定两个,则将值相加,例如,值为表示在星期天和星期日执行(POWER(2,0)+POWER(2,6))
@freq_subday_type= 0x8, --重复方式,0x1=在指定的时间,0x4=多少分钟,0x8=多少小时
执行一次
@freq_subday_interval= 1, --重复周期数,这里每小时执行一次
@active_start_date= NULL, --作业执行的开始日期,为NULL时表示当前日期,格式为
YYYYMMDD
@active_end_date= 99991231, --作业执行的停止日期,默认为,格式为YYYYMMDD
@active_start_time= 00000, --作业执行的开始时间,格式为HHMMSS
@active_end_time= 235959 --作业执行的停止时间,格式为HHMMSS
--*/
--/*--月调度(每X个月的每月几号)
EXEC msdb.dbo.sp_add_jobschedule
@job_id= @jobid,
@name= N'调度名称',
@freq_type= 16, --每月
@freq_recurrence_factor= 2, --每多少月执行一次,这里是每个月
@freq_interval= 2, --在执行月的第几天执行,这里是第天
@freq_subday_type= 0x8, --重复方式,0x1=在指定的时间,0x4=多少分钟,0x8=多少小时
执行一次
@freq_subday_interval= 1, --重复周期数,这里每小时执行一次
@active_start_date= NULL, --作业执行的开始日期,为NULL时表示当前日期,格式为
YYYYMMDD
@active_end_date= 99991231, --作业执行的停止日期,默认为,格式为YYYYMMDD
@active_start_time= 00000, --作业执行的开始时间,格式为HHMMSS
@active_end_time= 235959 --作业执行的停止时间,格式为HHMMSS
--*/
--/*--月调度(每X个月的相对时间)
EXEC msdb.dbo.sp_add_jobschedule
@job_id= @jobid,
@name= N'调度名称',
@freq_type= 32, --每月
@freq_recurrence_factor= 2, --每多少月执行一次,这里是每个月
@freq_interval= 9, --在当月的那个时间执行,1~7=星期日至星期六,8=日,9=工作
日,10=周末
@freq_relative_interval= 1, --在第几个相对时间执行,允许的值为,2,4,8代表第~4个相对
时间,16表示最后一个相对时间
@freq_subday_type= 0x8, --重复方式,0x1=在指定的时间,0x4=多少分钟,0x8=多少小时
执行一次
@freq_subday_interval= 1, --重复周期数,这里每小时执行一次
@active_start_date= NULL, --作业执行的开始日期,为NULL时表示当前日期,格式为
YYYYMMDD
@active_end_date= 99991231, --作业执行的停止日期,默认为,格式为YYYYMMDD
@active_start_time= 00000, --作业执行的开始时间,格式为HHMMSS
@active_end_time= 235959 --作业执行的停止时间,格式为HHMMSS
--*/
--/*--在特定时候执行的作业调度
EXEC msdb.dbo.sp_add_jobschedule
@job_id= @jobid,
@name= N'调度名称',
@freq_type= 64 --64=在SQLServerAgent 服务启动时运行,128=计算机空闲时运行
--*/
--/*--只执行一次的作业调度
EXEC msdb..sp_add_jobschedule
@job_id= @jobid,
@name= N'调度名称',
@freq_type=1, --仅执行一次
@active_start_date= NULL, --作业执行的开始日期,为NULL时表示当前日期,格式为
YYYYMMDD
@active_start_time= 00000 --作业执行的开始时间,格式为HHMMSS
--*/__