前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Oracle诊断案例-Job任务停止执行

Oracle诊断案例-Job任务停止执行

作者头像
数据和云01
发布于 2018-09-10 03:28:31
发布于 2018-09-10 03:28:31
95600
代码可运行
举报
文章被收录于专栏:数据库新发现数据库新发现
运行总次数:0
代码可运行

Oracle诊断案例-Job任务停止执行

Last Updated: Saturday, 2004-11-20 12:47 Eygle

昨天接到研发人员报告,数据库定时任务未正常执行,导致某些操作失败。

开始介入处理该事故. 系统环境: SunOS DB 5.8 Generic_108528-21 sun4u sparc SUNW,Ultra-4 Oracle9i Enterprise Edition Release 9.2.0.3.0 - Production

1.首先介入检查数据库任务

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ sqlplus "/ as sysdba"

SQL*Plus: Release 9.2.0.3.0 - Production on Wed Nov 17 20:23:53 2004

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.


Connected to:
Oracle9i Enterprise Edition Release 9.2.0.3.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.3.0 - Production

SQL> select job,last_date,last_sec,next_date,next_sec,broken,failures from dba_jobs;

       JOB LAST_DATE LAST_SEC         NEXT_DATE NEXT_SEC         B   FAILURES	INTERVAL
---------- --------- ---------------- --------- ---------------- - ----------   ----------------------------
        31 16-NOV-04 01:00:02         17-NOV-04 01:00:00         N          0	trunc(sysdate+1)+1/24
        27 16-NOV-04 00:00:04         17-NOV-04 00:00:00         N          0	TRUNC(SYSDATE) + 1
        35 16-NOV-04 01:00:02         17-NOV-04 01:00:00         N          0	trunc(sysdate+1)+1/24
        29 16-NOV-04 00:00:04         17-NOV-04 00:00:00         N          0	TRUNC(SYSDATE) + 1
        30 01-NOV-04 06:00:01         01-DEC-04 06:00:00         N          0	trunc(add_months(sysdate,1),'MM')+6/24
        65 16-NOV-04 04:00:03         17-NOV-04 04:00:00         N          0	trunc(sysdate+1)+4/24
        46 16-NOV-04 02:14:27         17-NOV-04 02:14:27         N          0	sysdate+1
        66 16-NOV-04 03:00:02         17-NOV-04 18:14:49         N          0	trunc(sysdate+1)+3/24

8 rows selected.     

发现JOB任务是都没有正常执行,最早一个应该在17-NOV-04 01:00:00执行。但是没有执行。

2.建立测试JOB

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create or replace PROCEDURE pining
  IS
BEGIN
         NULL;
 END;
/

variable jobno number;
variable instno number;
begin
  select instance_number into :instno from v$instance;
  dbms_job.submit(:jobno, 'pining;', trunc(sysdate+1/288,'MI'), 'trunc(SYSDATE+1/288,''MI'')', TRUE, :instno);
end;
/

发现同样的,不执行。 但是通过dbms_job.run(<job>)执行没有任何问题。

3.进行恢复尝试

怀疑是CJQ0进程失效,首先设置JOB_QUEUE_PROCESSES为0,Oracle会杀掉CJQ0及相应job进程 SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 0;

等2~3分钟,重新设置

SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 5;

此时PMON会重起CJQ0进程

在警报日志中可以看到以下信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Thu Nov 18 11:59:50 2004
ALTER SYSTEM SET job_queue_processes=0 SCOPE=MEMORY;
Thu Nov 18 12:01:30 2004
ALTER SYSTEM SET job_queue_processes=10 SCOPE=MEMORY;
Thu Nov 18 12:01:30 2004
Restarting dead background process CJQ0
CJQ0 started with pid=8		

但是Job仍然不执行,而且在再次修改的时候,CJQ0直接死掉了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

Thu Nov 18 13:52:05 2004
ALTER SYSTEM SET job_queue_processes=0 SCOPE=MEMORY;
Thu Nov 18 14:09:30 2004
ALTER SYSTEM SET job_queue_processes=10 SCOPE=MEMORY;
Thu Nov 18 14:10:27 2004
ALTER SYSTEM SET job_queue_processes=0 SCOPE=MEMORY;
Thu Nov 18 14:10:42 2004
ALTER SYSTEM SET job_queue_processes=10 SCOPE=MEMORY;
Thu Nov 18 14:31:07 2004
ALTER SYSTEM SET job_queue_processes=0 SCOPE=MEMORY;
Thu Nov 18 14:40:14 2004
ALTER SYSTEM SET job_queue_processes=10 SCOPE=MEMORY;
Thu Nov 18 14:40:28 2004
ALTER SYSTEM SET job_queue_processes=0 SCOPE=MEMORY;
Thu Nov 18 14:40:33 2004
ALTER SYSTEM SET job_queue_processes=1 SCOPE=MEMORY;
Thu Nov 18 14:40:40 2004
ALTER SYSTEM SET job_queue_processes=10 SCOPE=MEMORY;
Thu Nov 18 15:00:42 2004
ALTER SYSTEM SET job_queue_processes=0 SCOPE=MEMORY;
Thu Nov 18 15:01:36 2004
ALTER SYSTEM SET job_queue_processes=15 SCOPE=MEMORY;
                        

4.尝试重起数据库

这个必须在晚上进行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

PMON started with pid=2
DBW0 started with pid=3
LGWR started with pid=4
CKPT started with pid=5
SMON started with pid=6
RECO started with pid=7
CJQ0 started with pid=8
QMN0 started with pid=9
....

CJQ0正常启动,但是Job仍然不执行。

5.没办法了...

继续研究...居然发现Oralce有这样一个bug

1. Clear description of the problem encountered:

slgcsf() / slgcs() on Solaris will stop incrementing after

497 days 2 hrs 28 mins (approx) machine uptime.

2. Pertinent configuration information

No special configuration other than long machine uptime. .

3. Indication of the frequency and predictability of the problem

100% but only after 497 days.

4. Sequence of events leading to the problem

If the gethrtime() OS call returns a value > 42949672950000000

nanoseconds then slgcs() stays at 0xffffffff. This can

cause some problems in parts of the code which rely on

slgcs() to keep moving.

eg: In kkjssrh() does "now = slgcs(&se)" and compares that

to a previous timestamp. After 497 days uptime slgcs()

keeps returning 0xffffffff so "now - kkjlsrt" will

always return 0. .

5. Technical impact on the customer. Include persistent after effects.

In this case DBMS JOBS stopped running after 497 days uptime.

Other symptoms could occur in various places in the code.

好么,原来是计时器溢出了,一检查我的主机:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bash-2.03$ uptime
 10:00pm  up 500 day(s), 14:57,  1 user,  load average: 1.31, 1.09, 1.08
bash-2.03$ date
Fri Nov 19 22:00:14 CST 2004                        

刚好到事发时是497天多一点.ft.

6.安排重起主机系统..

这个问题够郁闷的,NND,谁曾想Oracle这都成...

Oracle最后声称:

fix made it into 9.2.0.6 patchset

在Solaris上的9206尚未发布...晕.

好了,就当是个经历吧,如果有问题非常不可思议的话,那么大胆怀疑Oracle吧,是Bug,可能就是Bug。

7.FAQ

一些朋友在Pub上问的问题

Q:对于不同平台,是否存在同样的问题?

A:对于不同平台,存在同样的问题

因为Oracle使用了标准C函数gethrtime

参考:

http://www.eygle.com/unix/Man.Page.Of.gethrtime.htm

使用了该函数的代码都会存在问题.

在Metalink Note:3427424.8 文档中,Oracle定义的平台影响为:Generic (all / most platforms affected)

Q.计数器溢出,看了看job 中基本都是1天左右执行一次,如果设置 3 天执行一次的 job , 是否出问题的uptime 应该是 497*3 之后呢 ?

A:不会

Oracle内部通过计时器来增进相对时间.

由于Oracle内部hrtime_t使用了32位计数

那么最大值也就是0xffffffff

0xffffffff = 4294967295

slgcs()是10亿分之一秒,溢出在42949672950000000这个点上.

注意,这里0xffffffff,达到这个值时,本来是无符号整型,现在变成了-1,那么这个值递增时,+1 = 0了。

时间就此停住了。

我写了一小段代码来验证这个内容,参考:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[oracle@jumper oracle]$ cat unsign.c
#include 
int main(void){
unsigned int num = 0xffffffff;

printf("num is %d bits long/n", sizeof(num) * 8);
printf("num = 0x%x/n", num);
printf("num + 1 = 0x%x/n", num + 1);

return 0;
}

[oracle@jumper oracle]$ gcc -o unsign.sh unsign.c
[oracle@jumper oracle]$ ./unsign.sh
num is 32 bits long
num = 0xffffffff
num + 1 = 0x0
[oracle@jumper oracle]$

本文作者:

eygle,Oracle技术关注者,来自中国最大的Oracle技术论坛itpub.

www.eygle.com是作者的个人站点.你可通过Guoqiang.Gai@gmail.com来联系作者.欢迎技术探讨交流以及链接交换.

原文出处:

http://www.eygle.com/case/Job.Can.Not.Execute.Auto.htm

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2004年11月22日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Oracle诊断案例-Job任务停止执行[最终版]
Last Updated: Friday, 2004-11-26 9:48 Eygle
数据和云01
2018/09/10
1.3K0
Oracle诊断案例-Spfile案例一则
情况说明: 系统:SUN Solaris8 数据库版本:9203 问题描述:工程人员报告,数据库在重新启动时无法正常启动.检查发现UNDO表空间丢失. 问题诊断及解决过程如下:
数据和云01
2018/09/05
4400
Oracle诊断案例-SGA与Swap之一
案例描述: 用户报告,服务器启动一段时间以后,无法建立数据库连接 重新启动几分钟以后,再次无法连接 系统无法正常使用.
数据和云01
2018/09/05
1.2K0
关于Oracle Job定时任务配置讲解
几天前,公司的job调度出现了问题,由于权限管的严,没有查看Oracle 一些重要的数据字典,后面联系DBA,是由于数据库切换到备机时,参数设置不对,导致db job没有正常调度。
星哥玩云
2022/08/17
2.1K0
关于Oracle Job定时任务配置讲解
Oracle Job创建及使用详解
Oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务。 一、查询系统中的job,可以查询视图 --相关视图 select * from dba_jobs; select * from all_jobs; select * fromuser_jobs; -- 查询字段描述 /* 字段(列) 类型 描述 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_LABELRAW MLSLABEL 该任务的信任Oracle会话符 CLEARANCE_HI RAW MLSLABEL 该任务可信任的Oracle最大间隙 CLEARANCE_LO RAW MLSLABEL 该任务可信任的Oracle最小间隙 NLS_ENV VARCHAR2(2000) 任务运行的NLS会话设置 MISC_ENV RAW(32) 任务运行的其他一些会话参数 */ -- 正在运行job select * fromdba_jobs_running; 其中最重要的字段就是job这个值就是我们操作job的id号,what 操作存储过程的名称,next_date 执行的时间,interval执行间隔 二、执行间隔interval运行频率
流浪的猫666
2018/06/26
1.7K0
从 Oracle 到 PostgreSQL :从 Uptime 到数据库实例运行时间
在接触操作系统时,我们常常习惯通过 uptime 来看看系统的启动运行时间,例如:
数据和云
2019/06/13
1.2K0
ORA-00439的解决(笔记93天)
今天用gc配置了stream后,重启数据库后发现有以下的问题 SQL> startup ORA-00439: feature not enabled: Real Application Clusters 我这个库PROD不是rac环境,单实例的。 开始以为是stream的什么参数有问题。 然后从参数文件里面全部删掉,重启数据库还是一样的问题。 查看alert日志 ALTER SYSTEM SET job_queue_processes=10 SCOPE=BOTH; Fri Oct 26 14:39:18 2
jeanron100
2018/03/14
3.2K0
[Oracle数据库日常操作]Oracle Job常用操作
1. 手动运行Job: 括号中为job号 1.1 使用sys用户运行 exec dbms_ijob.run(4) 1.2 使用本身用户运行 exec dbms_job.run(4) 2. 删除Job exec dbms_ijob.remove(862) commit; 3. 停止&开启job EXEC DBMS_IJOB.BROKEN(1591,TRUE); COMMIT; EXEC DBMS_IJOB.BROKEN(552,FALSE); COMMIT; 4. 设置Job可同时运行数量 设置为0表示禁止
bsbforever
2020/08/18
1.2K0
参数job_queue_processes与Oracle jobs
Oracle jobs为Oracle开发人员和数据库管理员提供了数据库层面维护的极大便利性。对于Oracle jobs在Oracle 9i之前,是由dbms_jobs来实现,而到了10g之后,多出了dbms_scheduler方式。两者同样可以添加Oracle job,只不过dbms_scheduler的功能更为强大。在使用Oracle jobs时,我们不得不关注job_queue_processes参数,用于设定job队列可以启动的进程数。本文即是围绕此展开。
Leshami
2018/08/14
7840
Oracle 11.2.0.4 RAC重建EM案例
环境:Oracle 11.2.0.4 RAC 重建EM 背景:客户之前的EM已经被损坏,需要重建EM
Alfred Zhao
2019/02/15
1.2K0
案例:Oracle 11g RAC 数据库连接数过高处理办法
墨墨导读:近期有一套数据库总是出现如下告警“严重告警:XXX Oracle 服务器:10.10.X.X 数据库的侦听器 LISTENER 状态为 Inactive ”,本文详述处理的整个过程。
数据和云
2020/11/16
9220
案例:Oracle 11g RAC 数据库连接数过高处理办法
完全停止Oracle中正在运行的JOB
源地址:http://www.quest-pipelines.com/newsletter-v4/0403_C.htm
用户1148526
2019/05/25
1.6K0
又一例SPFILE设置错误导致数据库无法启动
--========================================
Leshami
2018/08/07
7010
案例分享|Oracle 11g RAC 数据库连接数过高处理办法
近期有一套数据库总是出现如下告警 “严重告警:XXX Oracle 服务器:10.10.X.X 数据库的侦听器 LISTENER 状态为 Inactive ”.这样的告警我们已经屡见不鲜,要么就是数据库宕机,要么就是监听异常关闭,因为是 RAC 环境,又不是什么很大问题,便不慌不忙的去处理此问题。
JiekeXu之路
2020/10/30
1.4K0
案例分享|Oracle 11g RAC 数据库连接数过高处理办法
oracle: job使用
oracle的job,实际上就是数据库内置的定时任务,类似代码中的Timer功能。下面是使用过程: 这里我们模拟一个场景:定时调用存储过程P_TEST_JOB 向表TEST_JOB_LOG中插入数据 表结构: 1 create table TEST_JOB_LOG 2 ( 3 rec_id NUMBER not null, 4 occr_time DATE 5 ); 6 alter table TEST_JOB_LOG 7 add constraint PK_TEST_JOB primary k
菩提树下的杨过
2018/01/19
7840
Oracle 10gR2 Dataguard搭建(非duplicate方式)
我的实验环境: 源生产库(主库): IP地址:192.168.1.30 Oracle 10.2.0.5 单实例
Alfred Zhao
2019/05/24
6980
监控主库传输日志链路的状态
实验证明: 11g snapshot standby的确可以很方便的实现读写测试;之后也可以方便的切换回测试前的状态继续做为physical standby使用。
Alfred Zhao
2019/05/24
6770
极限优化:从75到2000,由技能到性能提升岂止20倍
崔华,网名 dbsnake Oracle ACE Director,ACOUG 核心专家 编辑手记:感谢崔华授权我们独家转载其精品文章,也欢迎大家向“Oracle”社区投稿。 崔华手记:这篇文章的标题颇有些标题党的味道,但这不是我的初衷。其实我想表达的是,基于RDBMS的应用系统的性能问题绝大多数都是和SQL直接相关,而基于Oracle数据库的SQL优化能否奏效、效果的好与坏归根结底比拼的还是对CBO和执行计划的理解程度,这也正是我在《基于Oracle的SQL优化》一书中提出来的SQL优化方法论的第一点
数据和云
2018/03/06
7050
极限优化:从75到2000,由技能到性能提升岂止20倍
Oracle的参数文件:pfile和spfile
Oracle中的参数文件是一个包含一系列参数以及参数对应值的操作系统文件。它们是在数据库实例启动时候加载的,决定了数据库的物理 结构、内存、数据库的限制及系统大量的默认值、数据库的各种物理属性、指定数据库控制文件名和路径等信息,是进行数据库设计和性能调优的重要文件。可以分为两种类型:
星哥玩云
2022/08/18
1.1K0
Oracle的参数文件:pfile和spfile
在Mac上通过Docker部署Oracle Database 12.2版本
Oracle 已经宣布支持了Docker部署,这也让我们在Mac上部署 Oracle 数据库有了多一个选择,这是我的第一个Docker应用,非常简便快速的就完成了部署,简捷是最直接的体验。在 云和恩墨 和 恩墨学院 的培训中,我们使用Docker为环境部署实现了极大的便利和简化。
数据和云01
2018/09/05
2.3K1
在Mac上通过Docker部署Oracle Database 12.2版本
相关推荐
Oracle诊断案例-Job任务停止执行[最终版]
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文