OCP读书笔记(17) - 计划任务
轻量级作业:
也称为持久性轻量级作业,如果当我们的数据库每秒钟需要创建、删除或修改数十个或数百个作业时,使用轻量级作业是降低开销的最佳方法
常规作业:
是由oracle 11g Scheduler 所支持的作业,常规作业需要很多的系统开销,因为他们必须由Scheduler创建且每次执行完由Scheduler删除,常规作业提供了使用诸如其它用户程序的优点,并且提供了对运行此作业的权限细粒度控制
轻量级作业有别于常规作业的特征如下:
1.轻量级作业不是数据库对象,不会产生创建或删除轻量级作业时多引起的开销
2.与普通作业相比,创建和删除轻量级作业的时间少的很多;
3.轻量级作业的作业元数据和运行时数据占用的磁盘空间很少;
4.由于占用的磁盘空间少,可以再RAC环境中平衡轻量级作业的负载;
轻量级作业有几个缺点:
1.无法设置轻量级作业的权限,作业的权限从模板的计划继承而来
2.由于轻量级作业使用模板,无法创建完全独立的轻量级作业,我们必须使用PL/SQL命令创建轻量级作业,而无法用过EM创建
创建轻量级作业:
我们可以使用DBMS_SCHEDULER.CREATE_PROGRAM创建与轻量级作业一起使用的模板,供轻量级作业的模板存储为PLSQL_BLOCK或STORED_PROCEDURE类型的计划,创建轻量级作业时,指定LIGHEWERGHT的JOB_STYLE。JOB_STYLE的默认值是REGULAR
例:
grant execute on dbms_scheduler to scott;
create table d as select * from dept;
创建一个调度MY_SCHED:
BEGIN
dbms_scheduler.create_schedule(
repeat_interval => 'FREQ=MINUTELY',
start_date => systimestamp at time zone 'Asia/Shanghai',
schedule_name => '"SCOTT"."MY_SCHED"'
);
END;
/
创建一个程序MY_PROG:
BEGIN
dbms_scheduler.create_program(
program_name=>'"SCOTT"."MY_PROG"',
program_action=>'begin
insert into d select * from d;
commit;
end;',
program_type=>'PLSQL_BLOCK',
number_of_arguments=>0,
comments=>'',
enabled=>TRUE
);
END;
/
创建一个轻量级作业my_lightweight_job2:
BEGIN
dbms_scheduler.create_job(
job_name => 'my_lightweight_job2',
program_name => 'MY_PROG',
schedule_name => 'MY_SCHED',
enabled=>true,
job_style => 'LIGHTWEIGHT'
);
END;
/
select * from d;
删除一个轻量级作业:
BEGIN
dbms_scheduler.drop_job(
job_name => 'my_lightweight_job2'
);
END;
/
基于时间的调度
conn hr/hr
create table job_test(sdate date);
创建程序
BEGIN
dbms_scheduler.create_program(
program_name=>'HR.insert_sysdate',
program_action=>'insert into job_test values(sysdate);',
program_type=>'PLSQL_BLOCK',
number_of_arguments=>0,
comments=>'',
enabled=>TRUE
);
END;
创建调度
BEGIN
dbms_scheduler.create_schedule(
repeat_interval => 'FREQ=SECONDLY',
start_date => systimestamp at time zone '+8:00',
schedule_name => '"HR"."INSERT_SCHE"'
);
END;
创建作业
BEGIN
dbms_scheduler.create_job(
job_name => '"HR"."INSERT_JOB"',
program_name => 'HR.INSERT_SYSDATE',
schedule_name => 'HR.INSERT_SCHE',
job_class => 'DEFAULT_JOB_CLASS',
auto_drop => FALSE,
enabled => TRUE
);
END;
查看结果
conn hr/hr
select * from job_test;
监视作业
select job_name, status, error#, run_duration from user_scheduler_job_run_details
删除作业
begin
dbms_scheduler.drop_job(job_name => '"HR"."INSERT_JOB"', force => true);
end;
基于事件的调度
创建测试用表
conn hr/hr
create table event_job_test(id number, createdatae date);
alter table event_job_test add constraint pk_event_job_test primary key(id);
create sequence seq_event_job_test;
创建一个类型:
create or replace type t_event_queue as object(object_owner varchar2(50), event_name varchar2(50));
创建一个队列表,该队列包含的字段就是我们刚才创建的类型t_event_queue所包含的属性。
conn /as sysdba
grant execute on dbms_aqadm to hr;
conn hr/hr
begin
dbms_aqadm.create_queue_table(
queue_table=>'event_queue_tab',
queue_payload_type=>'t_event_queue',
multiple_consumers=>true
);
end;
/
创建一个队列,并将该队列与前面创建的队列表关联
begin
dbms_aqadm.create_queue(
queue_name=>'event_queue',
queue_table=>'event_queue_tab'
);
end;
/
启动队列
begin
dbms_aqadm.start_queue(queue_name=>'event_queue');
end;
/
创建一个基于事件的任务
conn /as sysdba
BEGIN
dbms_scheduler.create_job(
job_name => '"HR"."EVENT_BASE_JOB"',
job_type => 'PLSQL_BLOCK',
job_action => 'begin
insert into hr.event_job_test values(seq_event_job_test.nextval, sysdate);
commit;
end;',
event_condition => 'tab.user_data.object_owner=''HR'' and tab.user_data.event_name=''give_me_an_event''',
queue_spec => 'HR.EVENT_QUEUE',
start_date => systimestamp at time zone '+8:00',
job_class => 'DEFAULT_JOB_CLASS',
auto_drop => FALSE,
enabled => TRUE
);
END;
向队列中插入消息
没插入之前,查询表,发现没数据。
conn hr/hr
select * from event_job_test;
向队列里插入消息
conn /as sysdba
grant execute on dbms_aq to hr;
conn hr/hr
declare
l_enqueue_options dbms_aq.enqueue_options_t;
l_message_properties dbms_aq.message_properties_t;
l_message_handle raw(16);
l_queue_msg t_event_queue;
begin
l_queue_msg := t_event_queue('HR','give_me_an_event');
dbms_aq.enqueue(
queue_name=>'event_queue',
enqueue_options=>l_enqueue_options,
message_properties=>l_message_properties,
payload=>l_queue_msg,
msgid=>l_message_handle
);
commit;
end;
select * from event_job_test;
删除作业:
begin
dbms_scheduler.drop_job(job_name => '"HR"."EVENT_BASE_JOB"', force => true);
end;
---------------------------------------------------------------------------------------------------------------------------------------------
创建基于事件的调度加载数据
创建测试用表
conn scott/tiger
create table t as select * from emp where 1=2;
vi /u01/load.ctl
load data
infile '/u01/data.txt'
badfile '/u01/bad.emp'
discardfile '/u01/discadr.emp'
truncate
into table t
fields terminated by ','
trailing nullcols
(EMPNO,
ENAME,
JOB,
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO)
vi /u01/load.sh
#!/bin/bash
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2/db_1
export ORACLE_SID=orcl
$ORACLE_HOME/bin/sqlldr scott/tiger control=/u01/load.ctl log=/u01/load.log
保存退出
chmod +x /u01/load.sh
将emp中的数据转储到/u01/data.txt中:
set trims on
spool /u01/data.txt
select
EMPNO||','||
ENAME||','||
JOB||','||
MGR||','||
HIREDATE||','||
SAL||','||
COMM||','||
DEPTNO from emp;
spool off
创建一个类型:
sqlplus scott/tiger
create or replace type t_event_queue as object
(
object_owner varchar2(10),
object_name varchar2(20),
event_type varchar2(20),
event_timestamp number(2)
);
/
创建一个队列表,该队列包含的字段就是我们刚才创建的类型t_event_queue所包含的属性。
conn /as sysdba
grant execute on dbms_aqadm to scott;
conn scott/tiger
begin
dbms_aqadm.create_queue_table(
queue_table=>'event_queue_tab',
queue_payload_type=>'t_event_queue',
multiple_consumers=>true);
end;
/
创建一个队列,并将该队列与前面创建的队列表关联
begin
dbms_aqadm.create_queue(
queue_name=>'event_queue',
queue_table=>'event_queue_tab');
end;
/
启动队列
begin
dbms_aqadm.start_queue(queue_name=>'event_queue');
end;
/
创建一个基于事件的任务
conn /as sysdba
BEGIN
sys.dbms_scheduler.create_job(job_name => '"SYS"."PERFORM_DATA_LOAD"', --属主必须是sys
job_type => 'EXECUTABLE',
job_action => '/u01/load.sh',
event_condition => 'tab.user_data.object_owner = ''SCOTT''
and tab.user_data.object_name = ''DATA.TXT''
and tab.user_data.event_type = ''FILE_ARRIVAL''
and tab.user_data.event_timestamp < 9',--创建一个作业,如果成批装入的数据文件在上午 9:00 之前到达文件系统,则运行此作业
queue_spec => 'SCOTT.EVENT_QUEUE',
start_date => systimestamp at time zone
'+8:00',
job_class => 'DEFAULT_JOB_CLASS',
auto_drop => FALSE,
enabled => TRUE);
END;
/
向队列中插入消息
conn scott/tiger
select * from t;
向队列里插入消息
conn /as sysdba
grant execute on dbms_aq to scott;
conn scott/tiger
declare
l_enqueue_options dbms_aq.enqueue_options_t;
l_message_properties dbms_aq.message_properties_t;
l_message_handle raw(16);
l_queue_msg t_event_queue;
begin
l_queue_msg := t_event_queue('SCOTT', 'DATA.TXT', 'FILE_ARRIVAL',8);
dbms_aq.enqueue(queue_name => 'event_queue',
enqueue_options => l_enqueue_options,
message_properties => l_message_properties,
payload => l_queue_msg,
msgid => l_message_handle);
commit;
end;
/
select * from t;
删除作业:
conn /as sysdba
begin
dbms_scheduler.drop_job(job_name => '"SYS"."PERFORM_DATA_LOAD"', force => true);
end;
/
总结一下oracle db里用job调度shell的注意点:
1、shell脚本里开头要加#!/bin/bash等指定使用的shell类型
2、所有相关环境变量都得在shell里明确指定
3、如果要写入文件必需使用绝对路径
4、使用sys用户建立job
OCP读书笔记(17) - 计划任务的更多相关文章
- 进入保护模式(三)——《x86汇编语言:从实模式到保护模式》读书笔记17
(十)保护模式下的栈 ;以下用简单的示例来帮助阐述32位保护模式下的堆栈操作 mov cx,00000000000_11_000B ;加载堆栈段选择子 mov ss,cx mov esp,0x7c00 ...
- OCP读书笔记(13) - 管理内存
SGA 1. 什么是LRULRU表示Least Recently Used,也就是指最近最少使用的buffer header链表LRU链表串联起来的buffer header都指向可用数据块 2. 什 ...
- RH033读书笔记(17) - Summary
End of Unit 1 • Questions and Answers • Summary • Open source and the right to modify • The GNU Proj ...
- OCP读书笔记(16) - 管理资源
使用者组 创建资源用户组OLTP_GRP,将用户HR,OE加入此组: BEGIN dbms_resource_manager.clear_pending_area(); dbms_resource_m ...
- OCP读书笔记(14) - 管理数据库性能
搜集统计信息 1. dbms_stats gather_schema_stats 1)option:有四个选项: a.gather empty:只分析目前还没有搜集过统计信息的表 SQL> co ...
- OCP读书笔记(10) - 使用闪回技术I
使用闪回技术查询数据 闪回查询:就是查询表在过去某个时间点的数据,所用到的技术就是undo数据 SQL> conn scott/tiger 创建测试表 SQL> create table ...
- OCP读书笔记(9) - 诊断数据库
数据库恢复顾问 Data Recovery Advisor的命令行选项 1. 启动 RMAN 进程并连接到目标$ rman target=/ 2. 假设发生了某个错误,希望找出原因,使用 list f ...
- OCP读书笔记(7) - 使用RMAN执行恢复
7.Using RMAN to Perform Recovery 使用RMAN进行完全恢复system表空间文件丢失的恢复 模拟损坏: SQL> conn /as sysdba; SQL> ...
- OCP读书笔记(5) - 使用RMAN创建备份
5.Creating Backups with RMAN 创建备份集 RMAN> backup as backupset format '/u01/app/oracle/backup/rmanb ...
随机推荐
- [概念] js的函数节流和throttle和debounce详解
js的函数节流和throttle和debounce详解:同样是实现了一个功能,可能有的效率高,有的效率低,这种现象在高耗能的执行过程中区分就比较明显.本章节一个比较常用的提高性能的方式,通常叫做&qu ...
- 测试kestrel的队列
一.依赖环境的安装 1.sbt wget http://typesafe.artifactoryonline.com/typesafe/ivy-releases/org.scala-tools.s ...
- IT行业,需要经常锻炼,开篇从本钱开始
今天下完班,和部门兄弟一起去打了两小时乒乓球,大汗淋漓,很痛快. 败给了两个高手,感觉年龄大了些,灵活性没有以前那么好了. 想想以前读书时,在整个学校都叱诧风云,如今即败给了几个老手,唉. 看来以后要 ...
- ASIHTTPRequest开源类项目导入问题及解决方法
在静态库project中加入ASIHTTPRequest导出lib.a.放到project里编译出一下错: Undefined symbols for architecture armv7: &quo ...
- Android:自定义滚动边缘(EdgeEffect)效果
Android可滚动控件(GridView.ListView.ScrollView等)当用户滚动到头的时候会有个边缘反馈效果,在4.0上默认为Holo蓝色效果. 如果您的App自定义了主题颜色,比如 ...
- Swift调用Objective-C编写的代码(颜色选择器KKColorListPicker调用)
在Swift项目中,我们可以导入任意用Objective-C写的框架,代码库等.下面以Swift调用Objective-C编写的颜色选择器KKColorListPicker为例. 效果图如下: ...
- HealthKit教程 Swift版:锻炼信息
原文:HealthKit Tutorial with Swift: Workouts 作者:Ernesto García 译者:Mr_cyz ) 欢迎回到我们的HealthKit系列教程! 在我们系列 ...
- 浅谈Base64编码
浅谈Base64编码 我打赌当你见到Base64这个词的时候你会觉得在哪里见过,因为在你能够上网看到这篇文章的时候你已经在后台使用它了.如果您对二进制数有所了解,你就可以开始读它了. 打开一封Emai ...
- 验证码 Captcha 之大插件
验证码 Captcha 之大插件小用 不知何年何月才能完成OADemo啊,总之还是一步一步来吧,这段时间开始着手了,先做登陆. 前段时间研究了一下在CentOS7下安装Mysql和Memcached ...
- [Android学习笔记]LinearLayout布局,剩余空间的使用
转自:http://segmentfault.com/q/1010000000095725 如果使得一个View占用其父View的剩余空间? 答案是使用:android:layout_weight = ...