我們有時候會遇見這樣的煩惱,在特定的時候總有某個大查詢導致臨時表空間出錯。但我們總不能守侯著捕獲相關sql以優化或者處理。可以通過events來診斷
[email protected]>alter session set events
2 '1652 trace name errorstack level 1';
session altered.
[email protected]>select count(*) from (select * from alibaba.member order by member_level);
select count(*) from (select * from alibaba.member order by member_level)
*
error at line 1:
ora-01652: unable to extend temp segment by 128 in tablespace fcptest
[email protected]>[email protected]>
于是轉到 udump 目錄下找到剛才產生的trace,我們發現
[[email protected] udump]$ more ocndev_ora_15452.trc
/opt/oracle/admin/ocn/udump/ocndev_ora_15452.trc
oracle9i enterprise edition release 9.2.0.3.0 - production
jserver release 9.2.0.3.0 - production
oracle_home = /opt/oracle/products/9.2.0
system name: linux
node name: oradev
release: 2.4.9-e.3
version: #1 fri may 3 17:02:43 edt 2002
machine: i686
instance name: ocndev
redo thread mounted by this instance: 1
oracle process number: 15
unix process pid: 15452, image: [email protected] (tns v1-v3)
*** session id:(85.639) 2004-08-24 17:50:19.030
*** 2004-08-24 17:50:19.030
ksedmp: internal or fatal error
ora-01652: unable to extend temp segment by 128 in tablespace fcptest
current sql statement for this session:
select count(*) from (select * from alibaba.member order by member_level)
----- call stack trace -----
calling call entry argument values in hex
location type point (? means dubious value)
-------------------- -------- -------------------- ----------------------------
ksedmp()+269 call ksedst()+0 0 ? 0 ? 0 ? 0 ? 71417550 ?
70ecf9b8 ?
ksddoa()+446 call ksedmp()+0 1 ? aa703a8 ? 40622470 ?
674 ? 1 ? 406224d4 ?
ksdpcg()+521 call ksddoa()+0 40622470 ? aa703a8 ?
ksdpec()+220 call ksdpcg()+0 674 ? bffe8d88 ? 1 ?
ksfpec()+133 call ksdpec()+0 674 ? 674 ? aa6d304 ?
bffe8dbc ? 9812a41 ?
這里面記錄了產生temp不足錯誤的sql。
打開跟蹤
alter system set events '1652 trace name context forever, level 1';
關閉跟蹤
alter system set events '1652 trace name context off';
或者
打開跟蹤
alter system set events '1652 trace name errorstack level 1';
關閉跟蹤
alter system set events '1652 trace name errorstack off';
也可在數據庫啟動前在初始化參數中設置
event = '1652 trace name errorstack level 1'
這樣對整個數據庫session都有效了。
實際上我們可以看出,event里面設定了 1652 正好是sql導致的錯誤號,也就是說實際上錯誤號是和某個event相關聯的。對某個特定錯誤進行捕獲就可以通過類似這樣的方式進行。
新聞熱點
疑難解答