【报错处理】ORA-00600: internal error code, arguments: [ktstgdi2], [], []...
错误原因:
如果数据库中的参数文件或静态数据字典中产生了没有经过校验的错误数值,就会报出错误。
经验总结:
尽量不要直接修改数据库中的静态数据字典、尽量不要直接修改Oracle数据库相关文件,虽然Oracle也提供了诸如bbed等工具,对Oracle相关的物理文件进行直接修改,但这些工具都是救急修补用的。
问题分析:
以数据库配置信息的修改为例,可以通过直接修改database_properties中的列值来达到修改数据库配置信息的目的,也可以通过alter database句柄间接来修改数据库配置信息,区别是,直接修改静态数据字典是没有任何校验的,如果修改的数值不对,或修改后的数值可能会引起数据库出现宕库或部分功能无法使用,这些都不会提示。而使用alter database句柄,会在修改database_properties之前先校验要修改的值是否正确,评估修改后是否会引起数据库故障,还会做大写转换操作,确保安全正确的修改数据库配置
实验:
设计思路:修改数据库的一个配置属性,以修改数据库默认临时表空间组为例。分别使用alter database句柄和直接修改保存配置属性的静态数据字典两种方式进行修改,分别使用正确的配置属性值和错误的配置属性值进行修改,报出ORA-00600错误。
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SYS@PROD1>
SYS@PROD1>
SYS@PROD1>
SYS@PROD1>
SYS@PROD1>
创建两个临时表空间,并组成一个临时表空间组
SYS@PROD1> create temporary tablespace temp1
2 tempfile '/u01/app/oracle/oradata/PROD1/temp101.dbf'
3 size 50M
4 tablespace group temp_grp;
Tablespace created.
SYS@PROD1> create temporary tablespace temp2
2 tempfile '/u01/app/oracle/oradata/PROD1/temp201.dbf'
3 size 50M
4 tablespace group temp_grp;
Tablespace created.
查询静态数据字典,查看当前数据库默认的临时表空间组
SYS@PROD1> select * from database_properties where property_name= 'DEFAULT_TEMP_TABLESPACE';
PROPERTY_NAME PROPERTY_VALUE DESCRIPTION
---------------------------------------- ----------------------------------------
DEFAULT_TEMP_TABLESPACE TEMP Name of default temporary tablespace
1 rows selected.
使用alter database句柄修改数据库默认的临时表空间组
SYS@PROD1> alter database default temporary tablespace temp_grp;
Database altered.
查询静态数据字典,证明修改成功
SYS@PROD1> select * from database_properties where property_name='DEFAULT_TEMP_TABLESPACE';
PROPERTY_NAME PROPERTY_VALUE DESCRIPTION
---------------------------------------- ---------------------------------------- ----------------------------------------------------------------------------------------------------
DEFAULT_TEMP_TABLESPACE TEMP_GRP Name of default temporary tablespace
使用alter database句柄修改数据库默认的临时表空间组,并输入一个命名规范错误的临时表空间组的值
SYS@PROD1> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE 'temp_grp';
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE 'temp_grp'
报错,修改失败 *
ERROR at line 1:
ORA-02216: tablespace name expected
使用alter database句柄修改数据库默认的临时表空间组,并输入一个根本不存在的临时表空间组的组名
SYS@PROD1> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TETE;
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TETE
*
报错,修改失败
ERROR at line 1:
ORA-00959: tablespace 'TETE' does not exist
直接修改静态数据字典,来修改数据库默认的临时表空间组,并输入一个命名规范错误的临时表空间组的值
SYS@PROD1> UPDATE DATABASE_PROPERTIES SET PROPERTY_VALUE='temp_grp' where PROPERTY_NAME ='DEFAULT_TEMP_TABLESPACE';
没有报错,且修改成功,这就是说,直接修改静态数据字典,是没有任何校验的,这样操作非常不安全!
1 row updated.
再次修改数据库磨人的临时表空间组,发现无法修改,报错
SYS@PROD1> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP;
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP
*
ERROR at line 1:
ORA-00600: internal error code, arguments: [ktstgdi2], [], [], [], [], [], [], [], [], [], [], []
直接修改静态数据字典,并将错误的值修改回正确的值
SYS@PROD1> UPDATE DATABASE_PROPERTIES SET PROPERTY_VALUE='TEMP_GRP' where PROPERTY_NAME ='DEFAULT_TEMP_TABLESPACE';
1 row updated.
数据库恢复正常,又可以继续维护该配置属性
SYS@PROD1> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP;
Database altered.