• 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      




  • 相关阅读:
    得不到的永远在骚动
    这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧【转】
    Windows CMD命令大全【转】
    创业为什么选择北上广?
    为什么你还把时间浪费在无效人脉社交上?
    五步搞定Android开发环境部署——非常详细的Android开发环境搭建教程
    mysql分区操作
    程序员常用网站
    4种提升SQL查询性能的知识
    获得局域网内其他成员的信息
  • 原文地址:https://www.cnblogs.com/xiaoxiao5ya/p/7bd2527b625c1404daffd5e0ef998f6a.html
Copyright © 2020-2023  润新知