【報錯處理】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.