发表于: 2005.11.30 15:06
分类: ORACLE , Bug
出处: http://yangtingkun.itpub.net/post/468/47256
---------------------------------------------------------------
在检查数据库的alert文件时,发现了一个ORA-600错误,错误信息如下:ORA-00600: internal error code, arguments: [kgskdecrstat1], [], [], [], [], [], [], []。
用kgskdecrstat1信息查询METALINK上面的ora-600错误,发现这种类型的600错误没有公布,通过查询网上资料发现和资源计划有关。
下面是我对这个bug的一些简单测试。
SQL> SELECT * FROM TEST;
ID
----------
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
已选择27行。
SQL> DELETE TEST WHERE ID = 27;
已删除 1 行。
SQL> ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = SYSTEM_PLAN;
系统已更改。
SQL> COMMIT;
提交完成。
事务仅跨越资源计划的设置是不会报错的。
SQL> DELETE TEST WHERE ID = 26;
已删除 1 行。
SQL> ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = '';
系统已更改。
SQL> ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = SYSTEM_PLAN;
系统已更改。
SQL> COMMIT;
COMMIT
*
ERROR 位于第 1 行:
ORA-00603: ORACLE 服务器会话因致命错误而终止
SQL> SELECT * FROM TEST;
SELECT * FROM TEST
*
ERROR 位于第 1 行:
ORA-03114: 未连接到 ORALCE
一个事务如果跨越了资源计划的一次切换(一次取消,一次设置),提交时则会报错。前台报的错误是ORA-603而alert文件中则会报ORA-600错误:
ksedmp: internal or fatal error
ORA-00600: 内部错误代码,参数: [kgskdecrstat1], [], [], [], [], [], [], []
SQL> CONN YANGTK/YANGTK@TEST已连接。
SQL> DELETE TEST WHERE ID = 26;
已删除0行。
SQL> DELETE TEST WHERE ID = 25;
已删除 1 行。
SQL> ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = '';
系统已更改。
SQL> ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = SYSTEM_PLAN;
系统已更改。
SQL> ROLLBACK;
ROLLBACK
*
ERROR 位于第 1 行:
ORA-00603: ORACLE 服务器会话因致命错误而终止
SQL> SELECT * FROM TEST;
SELECT * FROM TEST
*
ERROR 位于第 1 行:
ORA-03114: 未连接到 ORALCE
我们发现COMMIT的时候虽然报错,但是提交的工作却已经完成了。这和我们以往看到的报错时自动回滚是不同的。
而且事务只要跨越了资源计划的切换,不管事务是提交还是回滚,都会报错。
SQL> CONN YANGTK/YANGTK@TEST已连接。
SQL> DELETE TEST WHERE ID = 25;
已删除 1 行。
同样,我们发现虽然回滚操作报错,但是回滚工作也完成了。不过这里就不好判断是ROLLBACK语句的作用,还是系统报错自动进行的回滚。
下面用其他SESSION来切换资源计划。
SQL> ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = '';
系统已更改。
SQL> ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = SYSTEM_PLAN;
系统已更改。
然后返回到原来的SESSION,去进行提交。
SQL> COMMIT;
COMMIT
*
ERROR 位于第 1 行:
ORA-00603: ORACLE 服务器会话因致命错误而终止
可以看到,只有是跨越了执行计划的切换,且不管是否是当前SESSION执行的切换,事务在提交和回滚时都会报错。
SQL> CONN YANGTK/YANGTK@TEST已连接。
SQL> DELETE TEST WHERE ID = 24;
已删除 1 行。
SQL> ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = '';
系统已更改。
SQL> COMMIT;
提交完成。
SQL> DELETE TEST WHERE ID = 23;
已删除 1 行。
SQL> ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = SYSTEM_PLAN;
系统已更改。
SQL> COMMIT;
提交完成。
单独执行资源计划的设置和撤销都不会造成错误的发生。
SQL> DELETE TEST WHERE ID = 23;
已删除0行。
SQL> ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = '';
系统已更改。
SQL> ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = SYSTEM_PLAN;
系统已更改。
SQL> CONN YANGTK/YANGTK@TEST已连接。
SQL> DELETE TEST WHERE ID = 22;
已删除 1 行。
SQL> ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = '';
系统已更改。
SQL> ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = SYSTEM_PLAN;
系统已更改。
SQL> CONN YANGTK/YANGTK@TEST
ERROR:
ORA-00603: ORACLE 服务器会话因致命错误而终止
ERROR:
ORA-24315: 非法的属性类型
警告: 您不再连接到 ORACLE。
不明确发出COMMIT命令而是通过系统隐含提交也会报错,但是如果当删除0行时,ORACLE并没有报错,也就是说没有实际修改的事务对系统没有影响。
SQL> CONN YANGTK/YANGTK@TEST已连接。
SQL> DELETE TEST WHERE ID = 22;
已删除0行。
SQL> ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = '';
系统已更改。
SQL> ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = SYSTEM_PLAN;
系统已更改。
SQL> COMMIT;
提交完成。
SQL> SELECT COUNT(*) FROM TEST;
COUNT(*)
----------
21
SQL> ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = '';
系统已更改。
SQL> ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = SYSTEM_PLAN;
系统已更改。
SQL> ROLLBACK;
回退已完成。
果然,似乎只有对数据库有真实的写操作才会导致bug的发生,而SELECT不受影响。
测试版本9201 for windows。确认受影响版本还包括9204 for solaris。











