利用errorstack event解決問題
2024-07-21 02:34:09
供稿:網(wǎng)友
摘要:在任何一種解決問題之前,必須要先知道問題的原因,才可以作到有的放矢。解決問題的方法并不是很難找,難能可貴的是能夠及時(shí)準(zhǔn)確地定位問題。本文介紹一種利用trace event來定位問題所在的方法。 某天現(xiàn)場(chǎng)人員報(bào)告說eXP的時(shí)候報(bào)權(quán)限不足的錯(cuò)誤。 是用當(dāng)前用戶作的用戶級(jí)別的exp,按理說應(yīng)該沒有什么權(quán)限的問題。 按照現(xiàn)場(chǎng)的情況作了測(cè)試,果然重現(xiàn)了問題。 d:/Temp>exp parfile=exp.parExport: Release 9.2.0.5.0 - PRodUCtion on Tue Dec 21 22:27:13 2004Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.EXP-00008: ORACLE error 1031 encounteredORA-01031: insufficient privilegesEXP-00000: Export terminated unsuccessfully 其中exp.par的內(nèi)容如下:
userid=scott/tigerfile=./scott.dmpindexes=ygrants=yrows=yconstraints=yowner=scottdirect=ncompress=nfeedback=10000resumable=yresumable_timeout=7200log=./export.log 沒有發(fā)現(xiàn)什么問題,那么作一個(gè)trace吧,于是決定使用errorstack event,由于exp是在命令行中直接執(zhí)行的,所以只能對(duì)整個(gè)數(shù)據(jù)庫系統(tǒng)作trace,由于只是想知道ORA-01031錯(cuò)誤的發(fā)生原因,所以用以下語句: alter system set events '1031 trace name errorstack level 3'; 假如想捕捉什么錯(cuò)誤,就直接用錯(cuò)誤號(hào)作trace,此處我們想獲知ORA-01031的錯(cuò)誤原因,所以使用了’1031 trace name errorstack level 3’。 然后重新運(yùn)行exp,仍然報(bào)錯(cuò),這時(shí)候在udump目錄中生成了trace文件,檢查文件內(nèi)容,發(fā)現(xiàn):
*** session ID:(15.210) 2004-12-21 22:22:36.704*** 2004-12-21 22:22:36.704ksedmp: internal or fatal errorORA-01031: insufficient privilegesCurrent SQL statement for this session:ALTER SESSION ENABLE RESUMABLE TIMEOUT 7200 原來問題出在ENABLE RESUMABLE部分,這是9i的新特性,用于在出現(xiàn)空間不足的問題時(shí),掛起整個(gè)操作以等待操作人員解決空間問題。 只要確認(rèn)了問題所在,就很好解決了,其實(shí)假如具體地看過adminitrator文檔,也就不會(huì)犯這個(gè)錯(cuò)誤,文檔里面Enabling and Disabling Resumable Space Allocation部分很清楚地寫著:假如要使用resumbale特性,那么必須有resumable系統(tǒng)權(quán)限。 檢查現(xiàn)場(chǎng)用戶的權(quán)限,發(fā)現(xiàn)只有connect和resource權(quán)限。于是: grant resumable to username; 當(dāng)然假如象一些應(yīng)用里面那樣,用戶始終是具有DBA角色的話,那么永遠(yuǎn)也不會(huì)發(fā)生這個(gè)錯(cuò)誤,因?yàn)镈BA角色本來就具有esumable系統(tǒng)權(quán)限。不過為了安全起見,我們的應(yīng)用中用戶都不會(huì)具有DBA權(quán)限。 解決問題的方法很簡單,沒什么好說的,本文想介紹的也是發(fā)現(xiàn)問題的手段,也就是利用set events的方法。這個(gè)方法在我們對(duì)一個(gè)錯(cuò)誤感到莫名其妙的時(shí)候往往會(huì)成為指路明燈。
作為本文的補(bǔ)充,提供幾個(gè)常見的用于Troubleshooting或者Tuning或者Interal研究的Oracle Events。 10032事件:用于dump排序操作的統(tǒng)計(jì)值,Level 10是最具體的級(jí)別。 ALTER SESSION SET EVENTS '10032 trace name context forever, level 10'; 10046事件:用于跟蹤SQL執(zhí)行過程,這是我們?cè)谡{(diào)整一個(gè)SQL時(shí)比較常見的方法。Level 12是最具體的級(jí)別。 ALTER SESSION SET EVENTS '10046 trace name context forever, level 12'; 其中各個(gè)Level的含義: 1:顯示SQL語句,執(zhí)行計(jì)劃和執(zhí)行統(tǒng)計(jì)值 4:顯示級(jí)別1的內(nèi)容和綁定變量 8:顯示級(jí)別1的那同和等待事件統(tǒng)計(jì) 12:顯示級(jí)別1的內(nèi)容和綁定變量、等待事件統(tǒng)計(jì) 10053事件:當(dāng)Oracle使用CBO進(jìn)行執(zhí)行計(jì)劃的生成時(shí),可以使用這個(gè)事件對(duì)于執(zhí)行計(jì)劃的生成過程進(jìn)行跟蹤。 ALTER SESSION SET EVENTS '10053 trace name context forever, level 1';
10081事件:用于跟蹤HWM(高水位標(biāo)志)的變更 ALTER SESSION SET EVENTS '10081 trace name context forever, level 1';