如何利用errorstack分析exp或imp問題

wisdomone1發表於2009-03-19

利用errorstack event解決問題

作者:網路 佚名  2005-12-16   
init_Nav();
  【IT168 伺服器學院摘要:在任何一種解決問題之前,必須要先知道問題的原因,才可以作到有的放矢。解決問題的方法並不是很難找,難能可貴的是能夠及時準確地定位問題。本文介紹一種利用trace event來定位問題所在的方法。

 

某天現場人員報告說exp的時候報許可權不足的錯誤。

 

是用當前使用者作的使用者級別的exp,按理說應該沒有什麼許可權的問題。

 

按照現場的情況作了測試,果然重現了問題。

 

d:\Temp>exp parfile=exp.par

Export: Release 9.2.0.5.0 - Production on Tue Dec 21 22:27:13 2004

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

EXP-00008: ORACLE error 1031 encountered

ORA-01031: insufficient privileges

EXP-00000: Export terminated unsuccessfully

 

其中exp.par的內容如下:

 

userid=scott/tiger

file=.\scott.dmp

indexes=y

grants=y

rows=y

constraints=y

owner=scott

direct=n

compress=n

feedback=10000

resumable=y

resumable_timeout=7200

log=.\export.log

 

沒有發現什麼問題,那麼作一個trace吧,於是決定使用errorstack event,由於exp是在命令列中直接執行的,所以只能對整個資料庫系統作trace,由於只是想知道ORA-01031錯誤的發生原因,所以用以下語句:

 

alter system set events '1031 trace name errorstack level 3';

 

如果想捕獲什麼錯誤,就直接用錯誤號作trace,此處我們想獲知ORA-01031的錯誤原因,所以使用了’1031 trace name errorstack level 3

 

然後重新執行exp,仍然報錯,這時候在udump目錄中生成了trace檔案,檢查檔案內容,發現:

 

*** SESSION ID:(15.210) 2004-12-21 22:22:36.704

*** 2004-12-21 22:22:36.704

ksedmp: internal or fatal error

ORA-01031: insufficient privileges

Current SQL statement for this session:

ALTER SESSION ENABLE RESUMABLE TIMEOUT 7200

 

原來問題出在ENABLE RESUMABLE部分,這是9i的新特性,用於在出現空間不足的問題時,掛起整個操作以等待操作人員解決空間問題。

 

只要確認了問題所在,就很好解決了,其實如果詳細地看過adminitrator文件,也就不會犯這個錯誤,文件裡面Enabling and Disabling Resumable Space Allocation部分很清楚地寫著:如果要使用resumbale特性,那麼必須有resumable系統許可權。

 

檢查現場使用者的許可權,發現只有connectresource許可權。於是:

 

grant resumable to username;

 

當然如果象一些應用裡面那樣,使用者始終是具有DBA角色的話,那麼永遠也不會發生這個錯誤,因為DBA角色本來就具有esumable系統許可權。不過為了安全起見,我們的應用中使用者都不會具有DBA許可權。

 

解決問題的方法很簡單,沒什麼好說的,本文想介紹的也是發現問題的手段,也就是利用set events的方法。這個方法在我們對一個錯誤感到莫名其妙的時候往往會成為指路明燈。

 

作為本文的補充,提供幾個常見的用於Troubleshooting或者Tuning或者Interal研究的Oracle Events

 

10032事件:用於dump排序操作的統計值,Level 10是最詳細的級別。

 

ALTER SESSION SET EVENTS '10032 trace name context forever, level 10';

 

10046事件:用於跟蹤SQL執行過程,這是我們在調整一個SQL時比較常見的方法。Level 12是最詳細的級別。

 

ALTER SESSION SET EVENTS '10046 trace name context forever, level 12';

 

其中各個Level的含義:

 

1:顯示SQL語句,執行計劃和執行統計值

 

4:顯示級別1的內容和繫結變數

 

8:顯示級別1的那同和等待事件統計

 

12:顯示級別1的內容和繫結變數、等待事件統計

 

10053事件:當Oracle使用CBO進行執行計劃的生成時,可以使用這個事件對於執行計劃的生成過程進行跟蹤。

 

ALTER SESSION SET EVENTS '10053 trace name context forever, level 1';

 

10081事件:用於跟蹤HWM(高水位標誌)的變更

 

ALTER SESSION SET EVENTS '10081 trace name context forever, level

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9240380/viewspace-573063/,如需轉載,請註明出處,否則將追究法律責任。