深爱那片海 发表于 2015-1-16 22:32:57

MYSQL网页编程之Oracle诊断案例-Job义务中断实行[终极版...

列举选择MySQL的理由的最困难的地方在于,如何对这些理由进行排序。MySQL学习教程这就如同我们经常争论的故事:先有鸡还是先有蛋?oracle|实行
Oracle诊断案例-Job义务中断实行

LastUpdated:Friday,2004-11-269:48Eygle






今天接到研发职员呈报,数据库准时义务未一般实行,招致某些操纵失利。

入手下手参与处置该变乱.
体系情况:
SunOSDB5.8Generic_108528-21sun4usparcSUNW,Ultra-4
Oracle9iEnterpriseEditionRelease9.2.0.3.0-Production

1.起首参与反省数据库义务



$sqlplus"/assysdba"SQL*Plus:Release9.2.0.3.0-ProductiononWedNov1720:23:532004Copyright(c)1982,2002,OracleCorporation.Allrightsreserved.Connectedto:Oracle9iEnterpriseEditionRelease9.2.0.3.0-ProductionWiththePartitioning,OLAPandOracleDataMiningoptionsJServerRelease9.2.0.3.0-ProductionSQL>selectjob,last_date,last_sec,next_date,next_sec,broken,failuresfromdba_jobs;JOBLAST_DATELAST_SECNEXT_DATENEXT_SECBFAILURESINTERVAL---------------------------------------------------------------------------------------------------3116-NOV-0401:00:0217-NOV-0401:00:00N0trunc(sysdate+1)+1/242716-NOV-0400:00:0417-NOV-0400:00:00N0TRUNC(SYSDATE)+13516-NOV-0401:00:0217-NOV-0401:00:00N0trunc(sysdate+1)+1/242916-NOV-0400:00:0417-NOV-0400:00:00N0TRUNC(SYSDATE)+13001-NOV-0406:00:0101-DEC-0406:00:00N0trunc(add_months(sysdate,1),MM)+6/246516-NOV-0404:00:0317-NOV-0404:00:00N0trunc(sysdate+1)+4/244616-NOV-0402:14:2717-NOV-0402:14:27N0sysdate+16616-NOV-0403:00:0217-NOV-0418:14:49N0trunc(sysdate+1)+3/248rowsselected.

发明JOB义务是都没有一般实行,最早一个应当在17-NOV-0401:00:00实行。可是没有实行。

2.创建测试JOB



createorreplacePROCEDUREpiningISBEGINNULL;END;/variablejobnonumber;variableinstnonumber;beginselectinstance_numberinto:instnofromv$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>ALTERSYSTEMSETJOB_QUEUE_PROCESSES=0;

等2~3分钟,从头设置

SQL>ALTERSYSTEMSETJOB_QUEUE_PROCESSES=5;

此时PMON会重起CJQ0历程

在警报日记中能够看到以下信息:



ThuNov1811:59:502004ALTERSYSTEMSETjob_queue_processes=0SCOPE=MEMORY;ThuNov1812:01:302004ALTERSYSTEMSETjob_queue_processes=10SCOPE=MEMORY;ThuNov1812:01:302004RestartingdeadbackgroundprocessCJQ0CJQ0startedwithpid=8



可是Job仍旧不实行,并且在再次修正的时分,CJQ0间接逝世失落了。



ThuNov1813:52:052004ALTERSYSTEMSETjob_queue_processes=0SCOPE=MEMORY;ThuNov1814:09:302004ALTERSYSTEMSETjob_queue_processes=10SCOPE=MEMORY;ThuNov1814:10:272004ALTERSYSTEMSETjob_queue_processes=0SCOPE=MEMORY;ThuNov1814:10:422004ALTERSYSTEMSETjob_queue_processes=10SCOPE=MEMORY;ThuNov1814:31:072004ALTERSYSTEMSETjob_queue_processes=0SCOPE=MEMORY;ThuNov1814:40:142004ALTERSYSTEMSETjob_queue_processes=10SCOPE=MEMORY;ThuNov1814:40:282004ALTERSYSTEMSETjob_queue_processes=0SCOPE=MEMORY;ThuNov1814:40:332004ALTERSYSTEMSETjob_queue_processes=1SCOPE=MEMORY;ThuNov1814:40:402004ALTERSYSTEMSETjob_queue_processes=10SCOPE=MEMORY;ThuNov1815:00:422004ALTERSYSTEMSETjob_queue_processes=0SCOPE=MEMORY;ThuNov1815:01:362004ALTERSYSTEMSETjob_queue_processes=15SCOPE=MEMORY;

4.实验重起数据库
这个必需在早晨举行



PMONstartedwithpid=2DBW0startedwithpid=3LGWRstartedwithpid=4CKPTstartedwithpid=5SMONstartedwithpid=6RECOstartedwithpid=7CJQ0startedwithpid=8QMN0startedwithpid=9....

CJQ0一般启动,可是Job仍旧不实行。

5.没举措了...

持续研讨...竟然发明Oralce有如许一个bug

1.Cleardescriptionoftheproblemencountered:
slgcsf()/slgcs()onSolariswillstopincrementingafter
497days2hrs28mins(approx)machineuptime.


2.Pertinentconfigurationinformation
Nospecialconfigurationotherthanlongmachineuptime..

3.Indicationofthefrequencyandpredictabilityoftheproblem
100%butonlyafter497days.

4.Sequenceofeventsleadingtotheproblem
Ifthegethrtime()OScallreturnsavalue>42949672950000000
nanosecondsthenslgcs()staysat0xffffffff.Thiscan
causesomeproblemsinpartsofthecodewhichrelyon
slgcs()tokeepmoving.
eg:Inkkjssrh()does"now=slgcs(&se)"andcomparesthat
toaprevioustimestamp.After497daysuptimeslgcs()
keepsreturning0xffffffffso"now-kkjlsrt"will
alwaysreturn0..

5.Technicalimpactonthecustomer.Includepersistentaftereffects.
InthiscaseDBMSJOBSstoppedrunningafter497daysuptime.
Othersymptomscouldoccurinvariousplacesinthecode.

好么,本来是计时器溢出了,一反省我的主机:

bash-2.03$uptime10:00pmup500day(s),14:57,1user,loadaverage:1.31,1.09,1.08bash-2.03$dateFriNov1922:00:14CST2004



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

6.布置重起主机体系..

这个成绩够忧郁的,NND,谁曾想Oracle这都成...

Oracle最初宣称:

fixmadeitinto9.2.0.6patchset

在Solaris上的9206还没有公布...晕.

好了,就当是个履历吧,假如有成绩十分难以想象的话,那末勇敢嫌疑Oracle吧,是Bug,大概就是Bug。

重起今后成绩办理,形态以下:

$sqlplus"/assysdba"SQL*Plus:Release9.2.0.3.0-ProductiononFriNov2609:21:212004Copyright(c)1982,2002,OracleCorporation.Allrightsreserved.Connectedto:Oracle9iEnterpriseEditionRelease9.2.0.3.0-ProductionWiththePartitioning,OLAPandOracleDataMiningoptionsJServerRelease9.2.0.3.0-ProductionSQL>selectjob,last_date,last_sec,next_date,next_secfromuser_jobs;JOBLAST_DATELAST_SECNEXT_DATENEXT_SEC------------------------------------------------------------7026-NOV-0409:21:0426-NOV-0409:26:00SQL>/JOBLAST_DATELAST_SECNEXT_DATENEXT_SEC------------------------------------------------------------7026-NOV-0409:26:0126-NOV-0409:31:00SQL>SQL>select*fromv$timer;HSECS----------3388153SQL>select*fromv$timer;HSECS----------3388319SQL>



7.FAQ

一些伴侣在Pub上问的成绩
Q:关于分歧平台,是不是存在一样的成绩?

A:关于分歧平台,存在一样的成绩
由于Oracle利用了尺度C函数gethrtime
参考:
http://www.eygle.com/unix/Man.Page.Of.gethrtime.htm

利用了该函数的代码城市存在成绩.

在MetalinkNote:3427424.8文档中,Oracle界说的平台影响为:Generic(all/mostplatformsaffected)

Q.计数器溢出,看了看job中基础都是1天摆布实行一次,假如设置3天实行一次的job,是不是出成绩的uptime应当是497*3以后呢?

A:不会

Oracle外部经由过程计时器来促进绝对工夫.
因为Oracle外部hrtime_t利用了32位计数

那末最年夜值也就是0xffffffff
0xffffffff=4294967295

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

注重,这里0xffffffff,到达这个值时,原本是无标记整型,如今酿成了-1,那末这个值递增时,+1=0了。
工夫就此愣住了。

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

$catunsign.c#includeintmain(void){unsignedintnum=0xffffffff;printf("numis%dbitslong
",sizeof(num)*8);printf("num=0x%x
",num);printf("num+1=0x%x
",num+1);return0;}$gcc-ounsign.shunsign.c$./unsign.shnumis32bitslongnum=0xffffffffnum+1=0x0$




Q:外部时钟之一应当就是这个吧:v$timer准确到1/100秒的数据

没错!

注重后面说的:

4.Sequenceofeventsleadingtotheproblem
Ifthegethrtime()OScallreturnsavalue>42949672950000000
nanosecondsthenslgcs()staysat0xffffffff.Thiscan
causesomeproblemsinpartsofthecodewhichrelyon
slgcs()tokeepmoving.

也就是说假如gethrtime()操纵体系挪用前往值年夜于42949672950000000(单元10亿分之一秒)

也就是说Oracle将失掉一个cs值为4294967295的工夫值

而4294967295值就是0xffffffff

以是事先v$timer的计时也就是:

SQL>select*fromv$timer;HSECS----------4294967295SQL>/HSECS----------4294967295SQL>/HSECS----------4294967295SQL>







本文作者:
eygle,Oracle手艺存眷者,来自中国最年夜的Oracle手艺论坛itpub.
www.eygle.com是作者的团体站点.你可经由过程Guoqiang.Gai@gmail.com来接洽作者.接待手艺切磋交换和链接互换.

原文出处:

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


WindowsAzureSQLDatabase并不支持数据压缩和表分区之类的功能,而且SQLDatabase支持的Transact-SQL语言只是完整版的一部分。另外,因为解决方案提供商不能控制物理资源,所以他们不能将数据文件和索引分配给特定的硬件。

灵魂腐蚀 发表于 2015-1-19 16:25:09

可能有的朋友会抱怨集成的orderby,其实如果使用ranking函数,Orderby是少不了的。如果担心Orderby会影响效率,可以为orderby的字段建立聚集索引,查询计划会忽略orderby操作(因为本来就是排序的嘛)。

乐观 发表于 2015-1-25 18:10:47

如果是将来做数据库的开发设计,就应该详细学习T-SQL的各种细节,包括T-SQL的程序设计、存储过程、触发器以及具体使用某个开发语言来访问数据库。

仓酷云 发表于 2015-2-3 12:40:21

where子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。

小妖女 发表于 2015-2-9 00:46:33

其实可以做一下类比,Oracle等数据库产品老早就支持了java编程,而且提供了java池参数作为用户配置接口。但是现在有哪些系统大批使用了java存储过程?!连Oracle自己的应用都不用为什么?!

第二个灵魂 发表于 2015-2-26 15:55:11

groupby子句可以将查询结果分组,并返回行的汇总信息Oracle按照groupby子句中指定的表达式的值分组查询结果。

爱飞 发表于 2015-3-8 15:52:18

如果你是从“学习某一种数据库应用软件,从而获得应聘的资本和工作机会”的角度来问的话。

飘飘悠悠 发表于 2015-3-16 03:54:56

我个人认为就是孜孜不懈的学习

分手快乐 发表于 2015-3-22 19:55:57

是否碎片会引发效率问题?这都是需要进一步探讨的东西。varbinary(max)代替image也让SQLServer的字段类型更加简洁统一。
页: [1]
查看完整版本: MYSQL网页编程之Oracle诊断案例-Job义务中断实行[终极版...