- 论坛徽章:
- 0
|
环境:windows xp oracle 8.1.7
数据库名oratest
主目录:d:\oracle
在一次服务器非正常关机重起后,使用PL/SQL Developer连接数据库提示ORA-01092: Oracle instance terminated. Disconnection forced,查看控制面板-〉服务里的oracle服务正常。
以internal/oracle 进入svrmgrl尝试重起数据库,看是否可以正常启动:
但使用startup命令时提示数据库已启动,使用shutdown normal和shutdown immediate都不能关闭,于是使用shutdown abort关闭数据库。
重起startup nomount例程正常启动
alter database mount后提示ORA-03113: end-of-file on communication channel
查看D:\oracle\admin\oratest\bdump目录下的警告日志文件oratestALRT.LOG显示如下信息:
***
Corrupt block relative dba: 0x00000003 (file 0, block 3)
Bad header found during controlfile block read
Data in bad block -
type: 0 format: 0 rdba: 0x00000000
last change scn: 0x0215.11ea1501 seq: 0x0 flg: 0x00
consistency value in tail: 0x00000000
check value in block header: 0x3, block checksum disabled
spare1: 0x0, spare2: 0x0, spare3: 0x0
***
LGWR: terminating instance due to error 227
用SELECT tablespace_name, segment_type, owner, segment_name FROM dba_extents WHERE file_id = 0 AND 3 between block_id AND block_id+blocks-1语句在其他服务器上类似的数据库中查找是哪个数据文件损坏,选出纪录为空。
因为是在启动后台进程LGWR(log writer)时提示错误,开始时以为是回滚段出错, 在init.ora文件里添加如下语句重建回滚段
rollback_segments=(system)
_corrupted_rollback_segments=(r01,r02,r03,r04)
_allow_resetlogs_corruption=ture
但在alter database mount这一步时仍提示同样错误,这样反复试了好几遍,耽误了很长时间。在多次尝试无效后,仔细分析警告日志文件中的错误提示认为可能是控制文件出错,但我想不会三个控制文件都出错吧,每次以一个控制文件启动(在init.ora文件里每次只设置一个文件),但都出现同样错误,于是计划重建控制文件,但我没有重建控制文件的语句,以前没做过备份,于是按照数据文件目录下的文件大概写了:
CREATE CONTROLFILE REUSE DATABASE "oratest" NORESETLOGS ARCHIVELOG
MAXLOGFILES 32
MAXLOGMEMBERS 2
MAXDATAFILES 254
MAXINSTANCES 8
MAXLOGHISTORY 907
LOGFILE GROUP 1 'D:\oracle\oradata\oratest\REDO01.LOG' SIZE 500K,
GROUP 2 'D:\oracle\oradata\oratest\REDO02.LOG' SIZE 500K,
GROUP 3 'D:\oracle\oradata\oratest\REDO03.LOG' SIZE 500K
DATAFILE 'D:\oracle\oradata\oratest\system01.dbf',
'D:\oracle\oradata\oratest\dr01.dbf',
'D:\oracle\oradata\oratest\indx01.dbf',
'D:\oracle\oradata\oratest\rbs01.dbf',
'D:\oracle\oradata\oratest\temp01.dbf',
'D:\oracle\oradata\oratest\users01.dbf',
'D:\oracle\oradata\oratest\tools01.dbf';
但提示错误,大概意思是语句书写不对。
于是我在这台服务器上按照以前建oratest的方式新建了数据库oratestt,在sqlplus 中运行alter database backup controlfile to trace 产生一个控制文件的本文备份,在
D:\oracle\admin\oratestt\udump下,打开将语句拷出,修改目录为oratest数据库的目录,修改后如下:
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORATEST" NORESETLOGS NOARCHIVELOG
MAXLOGFILES 32
MAXLOGMEMBERS 2
MAXDATAFILES 32
MAXINSTANCES 16
MAXLOGHISTORY 1815
LOGFILE
GROUP 1 'D:\ORACLE\ORADATA\ORATEST\REDO03.LOG' SIZE 1M,
GROUP 2 'D:\ORACLE\ORADATA\ORATEST\REDO02.LOG' SIZE 1M,
GROUP 3 'D:\ORACLE\ORADATA\ORATEST\REDO01.LOG' SIZE 1M
DATAFILE
'D:\ORACLE\ORADATA\ORATEST\SYSTEM01.DBF',
'D:\ORACLE\ORADATA\ORATEST\RBS01.DBF',
'D:\ORACLE\ORADATA\ORATEST\USERS01.DBF',
'D:\ORACLE\ORADATA\ORATEST\TEMP01.DBF',
'D:\ORACLE\ORADATA\ORATEST\TOOLS01.DBF',
'D:\ORACLE\ORADATA\ORATEST\INDX01.DBF',
'D:\ORACLE\ORADATA\ORATEST\DR01.DBF'
CHARACTER SET ZHS16GBK;
RECOVER DATABASE
ALTER DATABASE OPEN;
在使用shutdown abort(慎用,最好用shutdown immediate,但我的数据库使用immediate无法关闭)关闭后,重新尝试。
d:\svrmgrl>;connect internal/oracle@oratest
d:\svrmgrl>;startup nomount
运行上述的CREATE CONTROLFILE命令,但提示我创建语句中标示的数据库“oratest”与但前数据库oratestt不符,但我在tnsnames.ora中设置的oratest别名指向的是oratest数据库,没办法,于是宕掉数据库在dos下设置环境变量set oracle_sid=oratest
后重新尝试
d:\>;sqlplus internal/oracle@oratest
d:\sqlplus>;startup nomount
d:\sqlplus>; CREATE CONTROLFILE REUSE DATABASE "ORATEST" NORESETLOGS NOARCHIVELOG
MAXLOGFILES 32
MAXLOGMEMBERS 2
MAXDATAFILES 32
MAXINSTANCES 16
MAXLOGHISTORY 1815
LOGFILE
GROUP 1 'D:\ORACLE\ORADATA\ORATEST\REDO03.LOG' SIZE 1M,
GROUP 2 'D:\ORACLE\ORADATA\ORATEST\REDO02.LOG' SIZE 1M,
GROUP 3 'D:\ORACLE\ORADATA\ORATEST\REDO01.LOG' SIZE 1M
DATAFILE
'D:\ORACLE\ORADATA\ORATEST\SYSTEM01.DBF',
'D:\ORACLE\ORADATA\ORATEST\RBS01.DBF',
'D:\ORACLE\ORADATA\ORATEST\USERS01.DBF',
'D:\ORACLE\ORADATA\ORATEST\TEMP01.DBF',
'D:\ORACLE\ORADATA\ORATEST\TOOLS01.DBF',
'D:\ORACLE\ORADATA\ORATEST\INDX01.DBF',
'D:\ORACLE\ORADATA\ORATEST\DR01.DBF'
CHARACTER SET ZHS16GBK;
RECOVER DATABASE
ALTER DATABASE OPEN;
提示成功!
经过这次经历我总结了一条经验,必须首先找正确产生错误的原因,才能对症下药,药到病除,缩短排除故障的时间。 |
|