yangtingkun
===========================================================
跨越资源计划切换的事务会报错
===========================================================

在检查数据库的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-603alert文件中则会报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

yangtingkun 发表于:2005.11.30 15:06 ::分类: ( ORACLE , Bug ) ::阅读:(2545次) :: 评论 (4)
re: 跨越资源计划切换的事务会报错 [回复]

请教:为什么我对一个大表进行统计的时候也会报603错误呢?

zhou 评论于: 2006.10.30 09:49
re: 跨越资源计划切换的事务会报错 [回复]

导致603错误的原因很多,如果你没有设置资源计划,那么你碰到的问题应该不是这篇文章所描述的

yangtingkun 评论于: 2006.10.30 10:41
re: 跨越资源计划切换的事务会报错 [回复]

您好:

请问 resource_manager_plan 改初始化参数的值可以怎么设置?

在10g 官方文档中如下解释:

Enabling the Database Resource Manager
You enable the Database Resource Manager by setting the RESOURCE_MANAGER_PLAN initialization parameter. This parameter specifies the top plan, identifying the plan schema to be used for this instance. If no plan is specified with this parameter, the Database Resource Manager is not activated.

Note:

The Resource Manager automatically activates if a Scheduler window that specifies a resource plan opens.
The following example activates the Database Resource Manager and assigns the top plan as mydb_plan.

RESOURCE_MANAGER_PLAN = mydb_plan

以上为自定义的plan ,那么它是为当前的用户定义的资源计划还是sys or system?

在10g ocp 中有道题目如下:

84. From the V$SESSION_LONGOPS view, you find that some of the database users have longrunning
queries and are consuming a lot of CPU time. This causes problems for you when you try to log on as the
system user and perform small maintenance tasks. You would like to ensure that users SYS and
SYSTEM get priority over all other users. Which method would you use to achieve this objective?
A.create a plan directive in the SYS_GROUP
B.create the pending area for the consumer group
C.activate the provided SYSTEM_PLAN in Resource Manager
D.set the TIMED_STATISTICS parameter to TRUE in the parameter file
E.set the execution time limit for all users, except SYS and SYSTEM, in their profiles
Answer: C

设置resource_manager_plan=SYSTEM_PLAN 可以提高sys or system 用户的资源计划优先级。

这里比较疑惑:这个参数到底怎么设置?
请指教!

jjslove 评论于: 2012.01.30 00:12
re: 跨越资源计划切换的事务会报错 [回复]

资源管理器的内容很多,不是一两句就能说完的,建议你可以读一下管理员手册的相关章节。
简单的说,对于SYSTEM_PLAN计划,将SYS和SYSTEM用户组放在最高的优先级上,当CPU使用达到100%后,SYS和SYSTEM将不受限制的使用CPU资源,只有剩下的CPU资源才会被其他优先级的用户所使用。

yangtingkun 评论于: 2012.03.13 12:34

发表评论
标题

在此添加评论
表情符号: smile laughing tongue angry crying sad wassat wink

称呼

邮箱地址(可选)

个人主页(可选)

 authimage


切换风格
新闻聚合
博客日历
文章归档...
最新发表...
最新评论...
最多阅读文章...
最多评论文章...
博客统计...
Blog信息
网站链接...