Thursday, March 4, 2010

Errorstackダンプで問題のSQLを突き止めること

オラクルでエラーが発生したとき、どのSQL文が問題なのかを突き止める必要があります。例えば、alert.logファイルに次のようなエラーメッセージが記録されています。

Fri Mar 05 09:47:53 2010
ORA-1652: unable to extend temp segment by 128 in tablespace VERY_SMALL_TBS

どんなSQL文が犯人なのかを知らなければ、解決は難しいでしょ。


このような場合でやってみれるのがErrorStackダンプです。ErrorStackダンプを診断イベントと一緒に使えばエラーを起こしたSQL文がトレースファイルに記録されるようにすることができます。


簡単な例で説明します。まず小さなサイズ(10m)のテーブルスペースを作ります。


UKJA@ukja1021> create tablespace very_small_tbs
2 datafile size 10m;

Tablespace created.

ORA-01652エラーが発生したら、ErrorStackダンプを実行するように診断イベントを掛けます。

UKJA@ukja1021> alter system set events '1652 trace name errorstack level 1, forever';

Session altered.

10mより大きいテーブルを作ればORA-01652エラーが発生します。

UKJA@ukja1021> create table tbig(c1)
2 tablespace very_small_tbs
3 as
4 select rpad('x',1000) from dual
5 connect by level <= 10000
6 ;
select rpad('x',1000) from dual
*
ERROR at line 4:
ORA-01652: unable to extend temp segment by 128 in tablespace VERY_SMALL_TBS

UKJA@ukja1021> alter system set events '1652 trace name context off';

Session altered.

Alert.logファイルには次のようなエラーメッセージが残ります。

Fri Mar 05 09:47:53 2010
ORA-1652: unable to extend temp segment by 128 in tablespace VERY_SMALL_TBS

プロセスのダンプファイルにはエラー発生時のSQL文とCallStackトレースが記録してあります。

ORA-01652: unable to extend temp segment by 128 in tablespace VERY_SMALL_TBS
Current SQL statement for this session:
create table tbig(c1)
tablespace very_small_tbs
as
select rpad('x',1000) from dual
connect by level <= 10000
----- Call Stack Trace -----
calling call entry argument values in hex
location type point (? means dubious value)
-------------------- -------- -------------------- ----------------------------
_ksedst+38 CALLrel _ksedst1+0 0 1
_ksedmp+898 CALLrel _ksedst+0 0
_ksddoa+2088 CALLreg 00000000 1
_ksdpcg+238 CALLrel _ksddoa+0 A9615C0 93C78C0
_ksdpec+230 CALLrel _ksdpcg+0 674 C04A478 1
__PGOSF89__ksfpec+1 CALLrel _ksdpec+0 674
18
_kgesev+88 CALLreg 00000000 A0C6760 674
_ksesec2+39 CALLrel _kgesev+0 A0C6760 93C0020 674 2 C04A4E4
_ktsxterr+316 CALLrel _ksesec2+0 674 0 80 0 1 E C04A55E
_ktfbtgex1+969 CALLrel _ktsxterr+0 792DE5C 80 0
_ktsxs_add+1766 CALLrel _ktfbtgex1+0 C04AD8C 3D C04AA50 80 18 A 3
0 0 C04AD50 37B3EE88
_ktsxssr_sadd+1409 CALLrel _ktsxs_add+0 C04B048 C04AD8C 80 A 3 0 18 1
C04B11C C04AE08 C04ADC0 0
C04AD50
_ktrsexec+372 CALL??? 00000000 C04B0D8
_ktelwbl+770 CALLrel _ktrsexec+0 C04B0D8
_kdblba+168 CALLrel _ktelwbl+0 792DE5C 1
_kdblGetBlockDba+58 CALLrel _kdblba+0
_kdblgb+26 CALLrel _kdblGetBlockDba+0 C04B3C8 792DD9C
_kdblailb+2101 CALLrel _kdblgb+0
_kdblai+1560 CALLrel _kdblailb+0 C04B3C8 792DC9C 792DD9C 0 1 1
_klclil1r+187 CALLrel _kdblai+0
_qerltRop+514 CALLrel _klclil1r+0 792DBEC
_qercbiFetch+935 CALLreg 00000000 34C4F034 7FFF
_rwsfcd+95 CALL??? 00000000 34C4F384 1C72EB4 34C4F034
7FFF
_qerltFetch+368 CALL??? 00000000 34C4F148 1C72EB4 34C4F034
7FFF
_ctcdrv+7674 CALL??? 00000000 34C4F034 1D28394 C04CE30 1
_opiexe+12257 CALLrel _ctcdrv+0 34EE5F50 C04D548 C04D510
_opiosq0+6088 CALLrel _opiexe+0 4 0 C04D8C0
_kpooprx+232 CALLrel _opiosq0+0 3 E C04D9D8 A4
_kpoal8+775 CALLrel _kpooprx+0 C04F6F8 C04E224 6D 1 0 A4
_opiodr+1099 CALLreg 00000000 5E 17 C04F6F4
_ttcpip+1273 CALLreg 00000000 5E 17 C04F6F4 0
_opitsk+1017 CALL??? 00000000
_opiino+1087 CALLrel _opitsk+0 0 0
_opiodr+1099 CALLreg 00000000 3C 4 C04FC8C
_opidrv+819 CALLrel _opiodr+0 3C 4 C04FC8C 0
_sou2o+45 CALLrel _opidrv+0 3C 4 C04FC8C
_opimai_real+112 CALLrel _sou2o+0 C04FC80 3C 4 C04FC8C
_opimai+92 CALLrel _opimai_real+0 2 C04FCB8
_OracleThreadStart@ CALLrel _opimai+0
4+708
7C80B710 CALLreg 00000000

ErrorStackダンプはそのレベルによっていろいろな有効な情報を提供してくれます。次のアーティクルで詳細な情報を得られます。

No comments:

Post a Comment