zoukankan      html  css  js  c++  java
  • 转 How To Stop A Running Job Using DBMS_JOB

    There is no procedure within the dbms_job package to stop a running job.
    You will need to determine which Oracle session and process is associated with this running job and then kill it.

    You can run the following query to see job processes:

    Find the session id for the running job from dba_jobs_running:
    select sid, job, instance from dba_jobs_running where job=&job_id;

    Find the OS process id for the session id under which job is running :

    set linesize 120
    set pagesize 120
    column spid heading 'OSpid' format a8
    column pid heading 'Orapid' format 999999
    column sid heading 'Sess id' format 99999
    column serial# heading 'Serial#' format 999999
    column status heading 'Status' format a8
    column pga_alloc_mem heading 'PGA alloc'
    column username heading 'oracleuser' format a12
    column osuser heading 'OS user' format a12
    column program heading 'Program' format a28
    SELECT
    p.spid,
    p.pid,
    s.sid,
    s.serial#,
    s.status,
    p.pga_alloc_mem,
    s.username,
    s.osuser,
    s.program
    FROM
    v$process p,
    v$session s
    WHERE s.paddr(+) = p.addr
    AND s.sid=&session_id
    Order by p.pga_alloc_mem desc;


    Then issue the following with the appropriate sid and serial# for that process to kill the job:

    ALTER SYSTEM KILL SESSION 'sid,serial#';
     

    OSpid Orapid Sess id Serial# Status PGA alloc oracleuser OS user Program
    -------- ------- ------- ------- -------- ---------- ------------ ------------ ----------------------------
    23528122 76 4192 23693 ACTIVE 248614872 db     opcore oracle@pb02 (J002

    ALTER SYSTEM KILL SESSION '4192 ,23693 ';

    Bringing Down a DBMS_JOB Job

    1. Find the job you want to bring down
    In order to do anything you first need to find the job that is giving you a headache. Go ahead and run the above query. This will give you the basic information, job, sid, serial#, and spid, for the following actions to bring down the job.

    2. Mark the DBMS_JOB job as broken
    Use the following command for the job that you have to deal with.

    EXEC DBMS_JOB.BROKEN(job#,TRUE);


    All this command does is mark the job so that if we get it to stop, it won't start again. Let's make one thing perfectly clear, after executing this command the job is still running.

    As a side note, if you are trying to shut down a database with jobs that run throughout the day, they may hinder your attempts to bring down the database cleanly. This is a wonderful command to make sure no jobs are executing during the shutdown process. Just be aware that you will need to mark the jobs as unbroken when the database comes back up, more on that later.

    3. Kill the Oracle session
    Since the job is still running and it isn't going to end soon, you will need to kill the Oracle session that is executing the job. Use the following command for to kill the job.

    ALTER SYSTEM KILL SESSION 'sid,serial#';


    4. Kill the O/S process
    More often than not the previous step will still leave the job attached to the database and still running. When this happens you will need to go out to the operating system level and get rid of the process that has spawned from the running job. In order to do this you must login to the database box and issue the following command, depending on the type of operating system you have.

    For Windows, at the command prompt:

    C:> orakill <sid> <spid>


    For UNIX at the command line:

    $ kill -9 spid


    Note that 'orakill' is an Oracle command, while 'kill' is a Unix command.

    5. Remove the BROKEN status of the DBMS_JOB job:

    EXEC DBMS_JOB.BROKEN(job#,FALSE);

     

    It should be noted that DBMS_JOB has been retained in later versions of Oracle mainly for backward compatibility. It is highly recommended to migrate from DBMS_JOB to DBMS_SCHEDULER which is more powerful and flexible. To convert the jobs from DBMS_JOB to DBMS_SCHEDULER, the document IF: An Example to Convert from DBMS_JOB Jobs to DBMS_SCHEDULER Jobs (Doc ID 2117140.1) may be used.
     
     
    ####################################

    How to disable an entry from DBMS_SCHEDULER?

    SOLUTION

    Use the DISABLE procedure to disable a job from the scheduler queue.

    DBMS_SCHEDULER.DISABLE ( name IN VARCHAR2, force IN BOOLEAN DEFAULT FALSE);

    Parameter Description:

    name -  the name of the object being disabled; can be a comma-delimited list

    force - whether to ignore dependencies

    Examples:

    SQL> execute dbms_scheduler.disable('AUTO_SPACE_ADVISOR_JOB');
    SQL> execute dbms_scheduler.disable('job1, job2, sys.jobclass1');
     
    ########sample 3:
    转到底部转到底部

    2018-8-4 HOWTO
    为此文档评级 通过电子邮件发送此文档的链接 在新窗口中打开文档 可打印页

    In this Document

      Goal
      Solution
      References

    APPLIES TO:

    Oracle Database - Enterprise Edition - Version 11.2.0.4 and later
    Information in this document applies to any platform.
    *** checked for relevance on 24-Nov-2015 *** 

    GOAL

    How to disable database jobs ( DBMS_SCHEDULER , AUTOTASKS and DBMS_JOBS)before upgrade from 11.2.0.3 to 11.2.0.4?
     

    SOLUTION

    Since you are on a version 11gR2 then by setting the parameter job_queue_processes to 0 all job processes are stopped, 
    which means that DBMS_SCHEDULER jobs, autotask jobs and DBMS_JOB jobs cannot run. When using previous versions only DBMS_JOB jobs were disabled after changing job_queue_processes to 0.

    SQL> show parameter job_queue_processes
    SQL> alter system set job_queue_processes=0 scope=both;


    For more information please check the following :-


    http://docs.oracle.com/cd/E11882_01/server.112/e40402/initparams112.htm#REFRN10077


    However in the case of upgrade , since this violates the utlu112i.sql, then we should use another workaround

    1) to disable each job using dbms_scheduler.disable procedure 

    example :-

    SQL>exec DBMS_SCHEDULER.DISABLE('');


    And to enable , please do :-

    SQL>exec DBMS_SCHEDULER.ENABLE('');



    2) to disable all the automated tasks , please do

    SQL> EXECUTE DBMS_AUTO_TASK_ADMIN.DISABLE;


    And to enable them

    SQL> EXECUTE DBMS_AUTO_TASK_ADMIN.ENABLE;


    Note: to disable or enable a specific auto task , please use :

    SQL>exec DBMS_AUTO_TASK_ADMIN.DISABLE('<client name>' , null, null);
    SQL>exec DBMS_AUTO_TASK_ADMIN.ENABLE('<client name>' , null, null);

    Where the <client name> can be obtained from the output of

    select client_name from DBA_AUTOTASK_CLIENT;


    Note: Most important , if you will use these workaround , please test it first on a test server and test enabling them again

    3) To disable jobs created via DBMS_JOBS , please run:-

    SQL> EXEC DBMS_JOB.BROKEN (<job_id> , TRUE,SYSDATE);
  • 相关阅读:
    wsl安装torch-0.4.0 cpu版本
    基于TimeLine编辑角色动画(三)
    unity在Game窗口绘制网格Capsule
    unityGame窗口绘制Box
    unity在Game窗口绘制网格球
    读取Excal数据通过反射赋值
    根据Excal表生成代码
    状态模式设计动画状态机
    第三人称相机
    Nhibernate配置MySQL踩坑记录
  • 原文地址:https://www.cnblogs.com/feiyun8616/p/10637596.html
Copyright © 2011-2022 走看看