免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1514 | 回复: 3
打印 上一主题 下一主题

一次控制文件出错的经历,与大家共享! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-09-10 11:31 |只看该作者 |倒序浏览
环境: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;
提示成功!

经过这次经历我总结了一条经验,必须首先找正确产生错误的原因,才能对症下药,药到病除,缩短排除故障的时间。

论坛徽章:
0
2 [报告]
发表于 2004-09-10 13:00 |只看该作者

一次控制文件出错的经历,与大家共享!

谢谢楼主,真详细

论坛徽章:
0
3 [报告]
发表于 2004-09-10 14:18 |只看该作者

一次控制文件出错的经历,与大家共享!

abort使用的时候一定要慎之又慎
不到万不得已最好别用
我就栽过一次,就是关闭数据库时用的abort

论坛徽章:
0
4 [报告]
发表于 2004-09-10 15:50 |只看该作者

一次控制文件出错的经历,与大家共享!

楼主的思路清晰,不错
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP