day13_oracle定时任务

基本格式 :

*  *  *  *  *  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)
DECLARE
X NUMBER;
BEGIN
SYS.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                正在运行任务的开始时间,如果没有运行任务则为null
THIS_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      




posted @ 2016-03-21 21:29  暗夜小精灵~~  阅读(347)  评论(0编辑  收藏  举报