利用errorstack event解決問題
2024-07-21 02:06:19
供稿:網友
 
今天現場人員報告說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=. cott.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';
然后重新運行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系統權限。
檢查現場用戶的權限,發現只有connect和resource權限。于是:
grant resumable to username;
當然如果象一些應用里面那樣,用戶始終是具有dba角色的話,那么永遠也不會發生這個錯誤,因為dba角色本來就具有esumable系統權限。不過為了安全起見,我們的應用中用戶都不會具有dba權限。
解決問題的方法很簡單,沒什么好說的,本文想介紹的也是發現問題的手段,也就是利用set events的方法。這個方法在我們對一個錯誤感到莫名其妙的時候往往會成為指路明燈。
作者簡介:
張樂奕,網名kamus 
曾任itpub oracle認證版版主,現任itpub oracle管理版版主。
現任職于北京某大型軟件公司,首席dba,主要負責證券行業的全國十數處核心交易系統數據庫管理及維護工作。
熱切關注oracle技術和其它相關技術,出沒于各大數據庫技術論壇,目前是中國最大的oracle技術論壇www.itpub.net的數據庫管理版版主。
閱讀更多技術文章和隨筆可以登錄我的個人blog。
http://blog.dbform.com。