Dbms_scheduler是Oracle提供创建计划任务的包,任务类型可以是执行PL\SQL程序、执行外部脚本、调用操作系统命令,通常用于创建定期定时的任务,不依赖操作系统,保存在数据库内,数据库迁移时不受影响,发生错误有日志可以查询,比较方便创建和使用。例如实施数据备份计划,将数据的备份的脚步保存在day_backup.sh 中,然后创建计划定期执行该脚步:

$ vim /oracle/db_backup.sh
#!/bin/sh
ORACLE_SID=sydb;
export ORACLE_SID
ORACLE_HOME=/u01/app/product/11.2.0/db_1;
export ORACLE_HOME
PATH=$ORACLE_HOME/bin:$PATH;
export PATH
LD_LIBRARY_PATH=$ORACLE_HOME/lib;
export LD_LIBRARY_PATH
LOCAL=/EXPORT;
export LOCAL
$ORACLE_HOME/bin/rman target sys/oracle catalog rman/rman log='/tmp/db_backup.log' append <<EOF
run
{
allocate channel dev type disk;
backup incremental level 1 database plus archivelog format '/disk2/backup/sydb/%d_%U_%T.bkp'
tag 'db_backup';
release channel dev;
}
exit;
EOF

注意:这里要设置环境变量,在这里吃了好多苦,总之就是文件权限和环境变量要设置正确;

创建计划任务:

BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name=>'DB_BACKUP', --job名称
job_type => 'EXECUTABLE', --job任务类型,请参考2中的解释
job_action =>'/oracle/db_backup.sh', --job操作
start_date=> to_date('2015-05-19 03:00:00','yyyy-mm-dd hh24:mi:ss'),--执行时间和执行间隔时间为null,则表示立即执行
/*12 天执行一次*/
repeat_interval=>'FREQ=MONTHLY;BYMONTHDAY=15,-1',--执行间隔时间
enabled=>true,--是否启用
/* next night at 11:00 PM */
comments => 'Nightly incremental backups');
END;
/

支持的任务类型详解:

job_type
This attribute specifies the type of job that you are creating. If it is not specified, an error is generated. The supported values are:
'PLSQL_BLOCK'
This specifies that the job is an anonymous PL/SQL block. Job or program arguments are not supported when the job or program type is PLSQL_BLOCK. In this case, the number of arguments must be 0.
'STORED_PROCEDURE'
This specifies that the job is a PL/SQL or Java stored procedure, or an external C subprogram. Only procedures, not functions with return values, are supported.
'EXECUTABLE'
This specifies that the job is external to the database. External jobs are anything that can be executed from the command line of the operating system. Anydata arguments are not supported with a job or program type of EXECUTABLE. The job owner must have the CREATE EXTERNAL JOB system privilege before the job can be enabled or run.
'CHAIN'
This specifies that the job is a chain. Arguments are not supported for a chain, so number_of_arguments must be 0.

示例

创建一张表,然后创建插入数据的过程:

create table t_insert(cname varchar2(30),cnum number(3,4);
/ create or replace procedure fun_insertdata
/*
功能:向t_insert 表中插入数据
edit:2015-05-15
*/
as
v_sql varchar2(300);
begin
v_sql:='insert into t_insert(cname,cnum)values(:1,:2)';
for i in 1..10000 loop
execute immediate v_sql using 'AAA',i;
end loop;
commit;
end;
/

最后创建一个立即执行的任务

BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name=>'INSERT_DATATOTAB', --job名称
job_type => 'PLSQL_BLOCK', --job任务类型,请参考2中的解释
job_action =>'--job操作
BEGIN
fun_insertdata;
END;
',
start_date=>NULL, --执行时间和执行间隔时间如果为null,则表示立即执行
/*12 天执行一次*/
repeat_interval=>NULL,--执行间隔时间
enabled=>true,--是否启用
/* next night at 11:00 PM */
comments => 'Nightly incremental backups');
END;
/

查询结果:

SQL> column job_name format a15
SQL> column status format a8
SQL> column SESSION_ID format a7
SQL> column SLAVE_PID format a7
SQL> SELECT JOB_NAME,STATUS,session_id,slave_pid,cpu_used FROM DBA_SCHEDULER_JOB_RUN_DETAILS WHERE JOB_NAME='INSERT_DATATOTAB' and owner='SYS' ; JOB_NAME STATUS SESSION SLAVE_P CPU_USED
--------------- -------- ------- ------- ---------------------------------------------------------------------------
INSERT_DATATOTA SUCCEEDE 173,263 5228 +000 00:00:01.36
B D 3

所以的scheduler 可以在dbms_schedulers 视图中查询到,每个scheduler 任务执行后的结果可以在DBA_SCHEDULER_JOB_RUN_DETAILS中查询到; 如果想定期执行job可以通过配置repeat_interval,比如每月1,5和最后一天可以这样配置

repeat_interval=>'FREQ=MONTHLY;BYMONTHDAY=1,5,-1'--执行间隔时间 ,-1表示每月最后一天

上面使用到一个FREQ=,这个表示执行的时间截:

YEARLY 表示每一年
MONTHLY 表示每一月
WEEKLY 表示每一周
DAILY 表示每一天
HOURLY 表示每小时
MINUTELY 表示每分钟
SECONDLY 表示每秒钟

so 上面的 (FREQ=MONTHLY;BYMONTHDAY=1,5,-1) MONTHLY表示周期为每月执行,BYMONTHDAY表示每月那几天执行;

手动执行计划

SQL> EXEC DBMS_SCHEDULER.RUN_JOB('DB_BACKUP');

注意:默认情况下任务是不启用的,除非创建计划时设置了(enabled=>true),so 如果计划没有启用,首先启用它:

EXEC DBMS_SCHEDULER.enable('DB_BACKUP');

删除计划

SQL> exec dbms_scheduler.drop_job('DB_BACKUP');

--Then end(2015-05-18)

使用DBMS_SCHEDULER包管理计划任务的更多相关文章

  1. Linux centosVMware 自动化运维Ansible介绍、Ansible安装、远程执行命令、拷贝文件或者目录、远程执行脚本、管理任务计划、安装rpm包/管理服务、 playbook的使用、 playbook中的循环、 playbook中的条件判断、 playbook中的handlers、playbook实战-nginx安装、管理配置文件

    一.Ansible介绍 不需要安装客户端,通过sshd去通信 基于模块工作,模块可以由任何语言开发 不仅支持命令行使用模块,也支持编写yaml格式的playbook,易于编写和阅读 安装十分简单,ce ...

  2. 你需要知道的包管理器(Package Manager)

    最近我花了一点时间关注了在不同系统之中所用到的包管理器(Package Manager) .最开始的时候,我是在使用Linux操作系统时,对这种工具以及它背后的想法深深迷恋住了:这真是自由的软件世界. ...

  3. pycharm快捷键、常用设置、包管理

    pycharm快捷键.常用设置.包管理 在PyCharm安装目录 /opt/pycharm-3.4.1/help目录下可以找到ReferenceCard.pdf快捷键英文版说明 or 打开pychar ...

  4. Python 包管理工具解惑

    Python 包管理工具解惑 本文链接:http://zengrong.net/post/2169.htm python packaging 一.困惑 作为一个 Python 初学者,我在包管理上感到 ...

  5. NPM 与前端包管理

    我们很清楚,前端资源及其依赖管理一直是 npm 的重度使用场景,同时这也一直是 Node.js 普及的重要推动力.但这类应用场景到底有多重度?这是一个很难回答的问题.这份 “npm 最常下载的包的清单 ...

  6. 转载:Python 包管理工具解惑

    Python 包管理工具解惑 本站文章除注明转载外,均为本站原创或者翻译. 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商: 本站部分原创和翻译文章提供m ...

  7. python包管理(distutils、easy_install、pip、setup.py/requirements.txt、wheel)

    distutils.distutils2 distutils是 python 标准库的一部分,2000年发布.使用它能够进行 python 模块的 安装 和 发布. distutils2 被设计为 d ...

  8. Linux 程序包管理-RPM

    程序简介:  POSIX(Portable Openratin System)跨平台系统:不同操作系统平台的标准C库(glibc)都是遵循POSIX规范的,这样基于标准库开发程序的源代码可以夸平台编译 ...

  9. 打包一沓开源的 C/C++ 包管理工具送给你!

    本文作者:HelloGitHub-ChungZH 博客地址:https://chungzh.cn/ 包管理器可以帮助你更方便地安装依赖关系,并决定所安装的版本,提高你的开发幸福感.许多语言都有自己的包 ...

随机推荐

  1. elasticSearch Java Spring Data Api

    1. BoolQueryBuilder qb=QueryBuilders. boolQuery(); qb.should(QueryBuilders.matchQuery("keyWord& ...

  2. FC 协议

    FC 协议简介 开发于1988年,最早是用来提高硬盘协议的传输带宽,侧重于数据的快速.高效.可靠传输.到上世纪90年代末, FC SAN 开始得到大规模的广泛应用. FC 协议其实并不能翻译成光纤协议 ...

  3. 数据结构与算法JavaScript描述——栈

    栈就是和列表类似的一种数据结构,它可用来解决计算机世界里的很多问题. 栈是一种高效的数据结构,因为数据只能在栈顶添加或删除,所以这样的操作很快,而且容易实现. 栈的使用遍布程序语言实现的方方面面,从表 ...

  4. java web 程序---注册页面密码验证

    <%@ page language="java" import="java.util.*" pageEncoding="gb2312" ...

  5. 汇编_指令_CS与DS的区别

    cs是值cpu执行的当前指令的段地址,ds是数据开始的段地址. CS是告诉CPU,去哪个位置找内容当成指令去执行:DS是告诉CPU,去哪个位置找内容当成数据被使用. datastring =ds co ...

  6. SQL 只取重复记录一条记录并且是最小值

    and not exists( and a.StateValue>StateValue ) '

  7. PyQt 5菜单和工具栏

    QMainWindow类提供主要应用程序的窗口,有添加状态栏.工具栏.菜单栏等功能 状态栏 self.statusBar().showMessage('Ready') # 创建一个状态栏 # 状态栏显 ...

  8. 为什么多线程读写 shared_ptr 要加锁?

    https://www.cnblogs.com/Solstice/archive/2013/01/28/2879366.html 为什么多线程读写 shared_ptr 要加锁? 陈硕(giantch ...

  9. SQLserver2008全文检索使用方法

    一.开启SQL Full-text服务: 保证 SQL Full-text Filter Daemon Launcher服务处于开启状态,不同版本SQLServer全文检索服务名称可能稍有不同,如果服 ...

  10. 热门数据挖掘模型应用入门(一): LASSO回归

    热门数据挖掘模型应用入门(一): LASSO回归 2016-10-10 20:46 作者简介: 侯澄钧,毕业于俄亥俄州立大学运筹学博士项目, 目前在美国从事个人保险产品(Personal Line)相 ...