|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
列举选择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了。
工夫就此愣住了。
我写了一小段代码来考证这个内容,参考:
[oracle@jumperoracle]$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;}[oracle@jumperoracle]$gcc-ounsign.shunsign.c[oracle@jumperoracle]$./unsign.shnumis32bitslongnum=0xffffffffnum+1=0x0[oracle@jumperoracle]$
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语言只是完整版的一部分。另外,因为解决方案提供商不能控制物理资源,所以他们不能将数据文件和索引分配给特定的硬件。 |
|