您的位置:首页 > 数据库 > Oracle

day13_oracle定时任务

2016-03-21 21:29 471 查看
基本格式 :
*  *  *  *  *  command
分 时  日  月  周  命令

第1列表示分钟1~59 每分钟用*或者 */1表示第2列表示小时1~23(0表示0点)第3列表示日期1~31第4列表示月份1~12第5列标识号星期0~6(0表示星期天)第6列要运行的命令

crontab -l //列出自己的所有cron任务crontab -r //删除自己的所有cron任务crontab -e //编辑自己的cron任务

除了数字还有几个特殊的符号就是:
*代表所有的取值范围内的数字,”/”代表每的意思,”*/5″表示每5个单位,”-”代表从某个数字到某个数字,”,”分开几个离散的数字。以下举几个例子说明问题:
每天早上6点0 6 * * * echo "Good morning." >> /tmp/test.txt //注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了。
每2分钟执行1次*/2 * * * * echo "Have a break now." >> /tmp/test.txt
晚上11点到早上7点之间每两个小时,早上八点0 23-7/2,8 * * * echo "Have a good dream:)" >> /tmp/test.txt
每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点0 11 4 * 1-3 echo "Have a good dream:)" >> /tmp/test.txt
1月1日早上4点0 4 1 1 * echo "Have a good dream:)" >> /tmp/test.txt

30 21 * * * 表示每晚的21:30 做什么
45 4 1,10,22 * * 表示每月1、10、22日的4:45 做什么
10 1 * * 6,0 表示每周六、周日的1:10 做什么
0,30 18-23 * * * 表示在每天18:00至23:00之间每隔30分钟 做什么
0 23 * * 6 表示每星期六的23:00 做什么
* */1 * * * 表示每一小时 做什么
* 23-7/1 * * * 晚上11点到早上7点之间,每隔一小时 做什么
0 11 4 * mon-wed 每月的4号与每周一到周三的11点 做什么
0 4 1 jan * 一月一号的4点 做什么
0 7 * * * 每天早上7点执行一次
0 6-12/3 * 12 * 在12月内, 每天的早上6点到12点中,每隔3个小时执行一次
0 17 * * 1-5 周一到周五每天下午 5:00
20 0-23/2 * * * 每月每天的午夜 0点20分,2点20分,4点20 分....执行
10 6 * * * 每天早上6点10分
0 */2 * * * 每两个小时
0 23-7/2,8 * * * 晚上11点到早上8点之间每两个小时,早上8点

0 11 4 * mon-wed 每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 4 1 jan * 一月一号的4点重启apache
0 */2 * * * 每两个小时
50 7 * * * 每天7:50
50 22 * * * 每天22:50
0 0 1,15 * * 每月1号和15号
1 * * * * 每小时的第1分钟
00 03 * * 1-5 每周一至周五3点钟
30 6 */10 * * 每月的1、11、21、31日是的6:30

【调用oracle存储过程例子】

grant create procedure to scott;
1、创建表create table test(current_time date);
2、创建存储过程CREATE OR REPLACE PROCEDURE p_insert_test as begin begin insert into test values (sysdate); commit; end; end p_insert_test;/

3、编写shell脚本调用存储过程
vi /home/oracle/p_insert_test.sh
#!/bin/sh
export ORACLE_HOME=/oracle/app/oracle/product/10.2.0/db_1
export NLS_LANG=american_america.ZHS16GBK
PATH=$ORACLE_HOME/bin:$PATH export PATH
ORACLE_SID=ecom
export ORACLE_SID
source /home/oracle/.bash_profile
DATE="`date +%Y-%m-%d`"
ORA_BIN="/oracle/app/oracle/product/10.2.0/db_1/bin"
${ORA_BIN}/sqlplus scott/lipengfei << EOF >/home/oracle/p_insert_test_${DATE}.log
set timing on;
set serveroutput on size 100000;
prompt "call p_insert_test"
call p_insert_test();
commit;
EXIT
EOF

4、给脚本执行权限chmod +x /home/oracle/p_insert_test.sh

5、加入定时任务crontab -e
*/1 * * * * sh /home/oracle/p_insert_test.sh【每1分钟执行一次】
【检测结果】
select to_char(current_time,'yyyy-mm-dd hh24:mi:ss') from test;
----------------------------------------------------一、创建dbms_job (1)DECLAREX NUMBER;BEGINSYS.DBMS_JOB.SUBMIT( job => X,what => 'p_insert_test;',next_date => to_date( '03-03-2016 11:09:00 ', 'dd-mm-yyyy hh24:mi:ss '),interval => 'trunc(sysdate,''mi'')+1/(60*24)' ,no_parse => FALSE);COMMIT;END;/

(2)variable v_job number;begin dbms_job.submit(:v_job,'p_insert_test;',sysdate,'SYSDATE + 1/(60*24)');end;/commit;

二、查看dbms_job
select job,SCHEMA_USER,LOG_USER,THIS_DATE,WHAT,LAST_DATE,NEXT_DATE from user_jobs;【查看当前用户自己的dbms_job】

select JOB, LOG_USER, PRIV_USER, SCHEMA_USER, LAST_DATE, LAST_SEC, THIS_DATE, THIS_SEC, NEXT_DATE, NEXT_SEC, TOTAL_TIME, INTERVAL, WHAT INSTANCE from dba_jobs; 【查看所有的dbms_job】

字段(列) 类型 描述JOB NUMBER 任务的唯一标示号LOG_USER VARCHAR2(30) 提交任务的用户PRIV_USER VARCHAR2(30) 赋予任务权限的用户SCHEMA_USER VARCHAR2(30) 对任务作语法分析的用户模式LAST_DATE DATE 最后一次成功运行任务的时间LAST_SEC VARCHAR2(8) 如HH24:MM:SS格式的last_date日期的小时,分钟和秒THIS_DATE DATE 正在运行任务的开始时间,如果没有运行任务则为nullTHIS_SEC VARCHAR2(8) 如HH24:MM:SS格式的this_date日期的小时,分钟和秒NEXT_DATE DATE 下一次定时运行任务的时间NEXT_SEC VARCHAR2(8) 如HH24:MM:SS格式的next_date日期的小时,分钟和秒TOTAL_TIME NUMBER 该任务运行所需要的总时间,单位为秒BROKEN VARCHAR2(1) 标志参数,Y标示任务中断,以后不会运行INTERVAL VARCHAR2(200) 用于计算下一运行时间的表达式FAILURES NUMBER 任务运行连续没有成功的次数WHAT VARCHAR2(2000) 执行任务的PL/SQL块CURRENT_SESSION_LABEL RAW MLSLABEL 该任务的信任Oracle会话符CLEARANCE_HI RAW MLSLABEL 该任务可信任的Oracle最大间隙CLEARANCE_LO RAW MLSLABEL 该任务可信任的Oracle最小间隙NLS_ENV VARCHAR2(2000) 任务运行的NLS会话设置MISC_ENV RAW(32) 任务运行的其他一些会话参数 */

三、删除dbms_job【只有创建的dbms_job的owner能删除自己的dbms_job,其它不可以,DBA用色也不行】
begin dbms_job.remove(dbms_job号);end; /

begin dbms_job.remove(1);end; /
四、杀掉正运行的dbms_job

1、使用创建dbms_job的用户,标识Job被破坏了begin EXEC DBMS_JOB.BROKEN(dbms_job号,TRUE);end; /
注意:当执行完该命令你选择的这个JOB还是在运行着的。

2、上面的Job虽然被标识破坏了,但是正在执行的job还会正常跑完select sid from dba_jobs_running where job=第1号的job号;select sid,serial# from v$session where sid=sid;

3. Kill 对应的Oracle Session 应为BROKEN后该JOB还在运行,如果要求该JOB立刻停止,然后执行以下命令: ALTER SYSTEM KILL SESSION 'sid,serial#';

五、执行频率【INTERVAL参数值】

每天午夜12点 TRUNC(SYSDATE + 1)每天早上8点30分 TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)每星期二中午12点 NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24每个月第一天的午夜12点 TRUNC(LAST_DAY(SYSDATE ) + 1)每个季度最后一天的晚上11点 TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24每星期六和日早上6点10分 TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6×60+10)/(24×60)每秒钟执行次 sysdate + 1/(24 * 60 * 60)每10秒钟执行次 sysdate + 10/(24 * 60 * 60) 每分钟执行 TRUNC(sysdate,'mi') + 1/ (24*60)每10分钟执行次 TRUNC(sysdate,'mi') + 10/ (24*60) 每天的凌晨1点执行 TRUNC(sysdate) + 1 +1/ (24)每周一凌晨1点执行 TRUNC(next_day(sysdate,'星期一'))+1/24每月1日凌晨1点执行 TRUNC(LAST_DAY(SYSDATE))+1+1/24每季度的第一天凌晨1点执行 TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24每年7月1日和1月1日凌晨1点 ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24每年1月1日凌晨1点执行 (trunc(sysdate,'yyyy'),12)+1/24每隔一星期运行一次 sysdate+7每天运行一次 sysdate+1 每小时运行一次 sysdate+1/24每10分钟运行一次 sysdate+10/(60*24)每30秒运行一次 sysdate+30/(60*24*60)每天午夜12点 trunc(sysdate+1)每天早上8点30分 trunc(sysdate+1) +(8*60+30)/(24*60) 每个月第一天的午夜12点 trunc(last_day(sysdate)+1) 每个季度最后一天的晚上11点 trunc(add_months(sysdate+2/24,3),′Q′)-1/24 每个月最后一天运行一次 TRUNC(LAST_DAY(ADD_MONTHS(SYSDATE,1))) + 23/24每年1月1号零时 TRUNC(LAST_DAY(TO_DATE(EXTRACT(YEAR from SYSDATE)||'12'||'01','YYYY-MM-DD'))+1)每天午夜12点 TRUNC(SYSDATE + 1)每天早上8点30分 TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)每个月第一天的午夜12点 TRUNC(LAST_DAY(SYSDATE ) + 1)每个月最后一天的23点 TRUNC (LAST_DAY (SYSDATE)) + 23 / 24每个季度最后一天的晚上11点 TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24当前月初1号 trunc(sysdate,'mm') 下个月月初1号 add_months(trunc(sysdate,'mm'),1) 下个月20号3点 trunc(add_months(sysdate,1),'mm')+19 + 3/24 下下个月20号3点 trunc(add_months(sysdate,2),'mm')+19 + 3/24

来自为知笔记(Wiz)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: