前一段时间碰到的问题.
环境:
DB:Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bi
OS SunOS 5.10 Generic_127111-11 sun4u sparc SUNW,Netra-T12
具体的错误:
ORA-00600: internal error code, arguments: [17059], [0x4468DA9C8], [], [], [], [], [], []
处理:
从alert 文件里找到相应的trace文件, trace文件的内容:
LIBRARY OBJECT HANDLE: handle=48af69c08 mtx=48af69d38(0) cdp=237
name=把错误时执行的SQL
hash=5a6bb2113c18cd8df5bb3c573f18f594 timestamp=02-14-2009 17:20:24
namespace=CRSR flags=RON/KGHP/TIM/OBS/PN0/DBN/[10410040]
kkkk-dddd-llll=0000-0001-0001 lock=N pin=0 latch#=13 hpc=0230 hlc=0230
lwt=48af69cb0[48af69cb0,48af69cb0] ltm=48af69cc0[48af69cc0,48af69cc0]
pwt=48af69c78[48af69c78,48af69c78] ptm=48af69c88[48af69c88,48af69c88]
ref=48af69ce0[48af69ce0,48af69ce0] lnd=48af69cf8[48af69cf8,48af69cf8]
LOCK OWNERS:
lock user session count mode flags
-------- -------- -------- ----- ---- ------------------------
4853f7498 44d7742f0 44d7742f0 28 N [00]
4851e9170 48c75ffd8 48c75ffd8 4 N [00]
4858bd740 48c762938 48c762938 9 N [00]
LIBRARY OBJECT: object=4468da9c8
type=CRSR flags=EXS[0001] pflags=[0000] status=VALD load=0
CHILDREN: size=32768
child# table reference handle
------ -------- --------- --------
0 446a07ac8 446a07738 405a31f18
1 446a07ac8 449e543b8 405a31d98
2 446a07ac8 4477d37a8 3d4835f18
3 446a07ac8 4491e8ef8 3d4835d98
…….
5787 3cd3b0a48 3cd994b68 48a7a9fd0
5788 3cd3b0a
*** DUMP FILE SIZE IS LIMITED TO 5242880 BYTES ***
把trace 文件塞满了. 根据文件metalink 138554.1, 查了一相应sql的version_count=8988, 这个基本上就确定child cursor过多造成的, 顺便查一下整个数据库version_count>1000的情况,返回的几条记录:
SQL> select sql_id,version_count,parse_calls,executions,loads,invalidations from v$sqlarea where version_count>1000;
6zbp51skh49f2 3916 32 32 64 0
gbftwawzjjxcn 8988 1057 1045 8227 0
2qx781fxmpz4t 1084 136 136 2600 5944
8jns7knftkk4m 13575 2876 2873 12809 0
4fjsujmk4m5s1 2449 24 24 37 0
295hw2vhbmsbv 13043 3479 3466 12278 0
上万呀, 为什么会有这么多的版本?查一下参数cursor_sharing=similar。
在文档364845.1里给出了cursor_sharing不能共享的情况:
1- Literal SQL is not shared in PL/SQL block. Have details about it in Note.285447.1
2- Oracle does not share cursors if literals are used in non equality predicates (eg >, <, >=, <=, LIKE).
3- Oracle does not share cursor neither, if literals are used in equality predicates with histograms on the column.
查一下,刚才出问题的那条SQL,确有非等到值操作。把cursor_sharing改回到EXACT, 第二天查看整个数据库的最高版本在30以下。
Cursor_sharing设置成force,similar,还是时不时的碰到一些问题。
[@more@]