ITPub博客

首页 > Linux操作系统 > Linux操作系统 > ORACLE 817控制、日志文件损坏恢复总结

ORACLE 817控制、日志文件损坏恢复总结

原创 Linux操作系统 作者:wgj860215 时间:2010-03-31 12:53:31 0 删除 编辑
周末晚上接到电话,公司有一台817的数据库出问题了。软件公司那边搞不定了。让去看下。。(哎。。下班了还得跑过去。。我的周末啊~~~~)
这台服务器我们这边一直都不知道它的存在。一直都是软件公司那边维护的。我们一直都不知道上面还有个ORACLE在跑。。晕。。。

到现场看下情况。服务器用的2000SRV,数据库817。非归档。不能mount。
问应用人员,他们说这几个月来他们系统总是出问题。每次一出问题都直接重启系统。
我倒。。。这也太。。。


看下alert日志:
****************************
starting up 1 shared server(s) ...
starting up 1 dispatcher(s) for network address '(ADDRESS=(PARTIAL=YES)(PROTOCOL=TCP))'...
Fri Aug 03 16:39:45 2007
alter database mount exclusive
Fri Aug 03 16:39:48 2007
ORA-214 signalled during: alter database mount exclusive...
Dump file d:\oracle\admin\oraclect\bdump\oraclectALRT.LOG
****************************

怀疑是控制文件出问题。。找到alert中关于控制文件的记录:
control_files = d:\oracle\oradata\oraclect\control01.ctl, d:\oracle\oradata\oraclect\control02.ctl, d:\oracle\oradata\oraclect\control03.ctl

三个控制文件。看下三个控制文件的修改时间发现
control01.ctl,control02.ctl这两个控制文件的最后修改时间是一致的。control03.ctl的最后修改时间比前两个控制文件要早。

决定使用control03.ctl复制得到control01.ctl,control02.ctl看能不能把数据库启动。

复制后数据库可以mount,但不能打开。错误信息是乱码。。。

本来这里看下alert日志就可以定位是控制文件出错了。。可我第一次碰到灾难恢复,经验不足。。而是做了数据库的关闭,再启动。。绕了一大圈。。。


看alert日志错误:
****************************
alter database mount exclusive
Fri Aug 03 17:35:27 2007
ORA-214 signalled during: alter database mount exclusive...
Fri Aug 03 17:47:54 2007
/* OracleOEM */ ALTER DATABASE MOUNT
Fri Aug 03 17:47:57 2007
ORA-214 signalled during: /* OracleOEM */ ALTER DATABASE MOUNT...
Fri Aug 03 17:52:22 2007
/* OracleOEM */ ALTER DATABASE MOUNT
Fri Aug 03 17:52:25 2007
ORA-214 signalled during: /* OracleOEM */ ALTER DATABASE MOUNT...
****************************
关闭库,重启动windows服务。。数据库随服务启动而启动。。。
sys用户不能登到数据库 。。。
****************************
以SYS登陆数据库:
conn / as sysdba

ora-01092 oracle instance termnated.disconnection forced.
****************************
这时的alert日志错误:

****************************
Corrupt block relative dba: 0x00000019 (file 0, block 25)
Fractured block found during controlfile block read
Data in bad block -
type: 21 format: 2 rdba: 0x00000019
last change scn: 0xffff.00006e15 seq: 0x1 flg: 0x04
consistency value in tail: 0x6d981501
check value in block header: 0x958a, computed block checksum: 0x38d
spare1: 0x0, spare2: 0x0, spare3: 0x0
***
DBW0: terminating instance due to error 227
Fri Aug 03 21:08:55 2007
ORA-449 signalled during: alter database open...
Fri Aug 03 21:08:55 2007
Instance terminated by DBW0, pid = 1168
Dump file d:\oracle\admin\oraclect\bdump\oraclectALRT.LOG
****************************

晕。没有维护过windows下的ORACLE,注册表项不太清楚。。维护现场还不能上网。。郁闷啊~~~
在外面总算找到一个能上网的网段。在网上查一下“windows 启动服务不启动数据库”找到如下方法,在此记录一下:
****************************
win2k环境下设置oracle,服务启动,但数据库不要打开。
1.修改注册表项,HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME\下设置。
    ORA_SID_AUTOSTART = true,服务启动,数据库随服务启动而打开;
    ORA_SID_AUTOSTART = false,服务启动时不打开数据库,仅仅启动windows服务。

2.使用oradim修改windows服务
   
    -EDIT -SID sid [ -STARTMODE auto|manual ] 这里指定的是windows服务的启动是自动,还是手动。
    设置成a,则注册表ORA_SID_AUTOSTART = true,
    设置成m时,注册表的ORA_SID_AUTOSTART = false。
    这里设置的startmode与注册表中设置true与false是一样的效果。
****************************
完成后启动oracle服务。以SYS用户登陆数据库,启动。

sqlplus "/as sysdba"
startup nomount

alter database mount;

alter database open;
这时报错。错误乱码

alter session set nls_lang=american;
再做alter database open;

报错信息提示控制文件出错。。我这里是维护完成后总结。那个错误信息没有记录。。

做controlfile 的backup
SQL> alter database backup controlfile to trace;

Database altered.

查看trace文件:
这里这个trace文件没有copy过来。。现在又连不上那台机器。没办法显示出来了。
trace文件里报的都是错。。关于数据文件,日志文件的记录全都没有了。。



到此,彻底定位是控制文件出错了。准备重建控制文件。停掉数据库后备份一下现有的所有数据文件,日志文件。

这个库以前是买软件的时候软件公司给建的。看了下oradata\ 目录下的文件情况,晕。。。发现日志文件只有1M。。奶奶的。。虽然这个系统用的人不是很多,也就几十个,但日志文件只这么一点也太。。。。

sqlplus "/ as sysdba"
statrtup nomout;

create controlfile reuse database oraclect noresetlogs noarchivelog
maxlogfiles 32
maxlogmembers 3
maxdatafiles 100
maxinstances 8
maxloghistory 800
logfile
group 1 'd:\oracle\oradata\oraclect\redo01.log' size 1m,
group 2 'd:\oracle\oradata\oraclect\redo02.log' size 1m,
group 3 'd:\oracle\oradata\oraclect\redo03.log' size 1m
datafile
'd:\oracle\oradata\oraclect\system01.dbf',
'd:\oracle\oradata\oraclect\tools01.dbf',
'd:\oracle\oradata\oraclect\dr01.dbf',
'd:\oracle\oradata\oraclect\indx01.dbf',
'd:\oracle\oradata\oraclect\rbs01.dbf',
'd:\oracle\oradata\oraclect\tbs_att.ora',
'd:\oracle\oradata\oraclect\users01.dbf'
character set ZHS16GBK;

NORESETLOGS创建控制文件报错:
*
ERROR 位于第 1 行:
ORA-01503: CREATE CONTROLFILE failed
ORA-01192: must have at least one enabled thread

倒。~~~网上查也没什么建设性意见。。
决定备份三个日志文件后以resetlogs方式重建控制文件:




====================================================================
ORACLE 例程已经关闭。
SQL> startup nomount
ORACLE 例程已经启动。

Total System Global Area 160401436 bytes
Fixed Size                    75804 bytes
Variable Size              60256256 bytes
Database Buffers           99991552 bytes
Redo Buffers                  77824 bytes
SQL> create controlfile reuse database oraclect resetlogs noarchivelog
2 maxlogfiles 32
3 maxlogmembers 3
4 maxdatafiles 100
5 maxinstances 8
6 maxloghistory 800
7 logfile
8 group 1 'd:\oracle\oradata\oraclect\redo03.log' size 1m,
9 group 2 'd:\oracle\oradata\oraclect\redo02.log' size 1m,
10 group 3 'd:\oracle\oradata\oraclect\redo01.log' size 1m
11 datafile
12 'd:\oracle\oradata\oraclect\system01.dbf',
13 'd:\oracle\oradata\oraclect\tools01.dbf',
14 'd:\oracle\oradata\oraclect\dr01.dbf',
15 'd:\oracle\oradata\oraclect\indx01.dbf',
16 'd:\oracle\oradata\oraclect\rbs01.dbf',
17 'd:\oracle\oradata\oraclect\tbs_att.ora',
18 'd:\oracle\oradata\oraclect\users01.dbf'
19 character set ZHS16GBK
20 /

控制文件已创建
SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open


SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR 位于第 1 行:
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: 'D:\ORACLE\ORADATA\ORACLECT\SYSTEM01.DBF'


SQL> recover database;
ORA-00283: recovery session canceled due to errors
ORA-01610: recovery using the BACKUP CONTROLFILE option must be done

SQL> recover database using backup controlfile until cancel;
ORA-00279: change 17948482 generated at 08/03/2007 16:08:45 needed for thread 1
ORA-00289: suggestion : D:\ORACLE\ORA81\RDBMS\ARC07749.001
ORA-00280: change 17948482 for thread 1 is in sequence #7749


Specify log: {=suggested | filename | AUTO | CANCEL}
'd:\oracle\oradata\redo02.log'
ORA-00310: archived log contains sequence 7748; sequence 7749 required
ORA-00334: archived log: 'D:\ORACLE\ORADATA\REDO02.LOG'


ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: 'D:\ORACLE\ORADATA\ORACLECT\SYSTEM01.DBF'


SQL> recover database using backup controlfile until cancel;
ORA-00279: change 17948482 generated at 08/03/2007 16:08:45 needed for thread 1
ORA-00289: suggestion : D:\ORACLE\ORA81\RDBMS\ARC07749.001
ORA-00280: change 17948482 for thread 1 is in sequence #7749


Specify log: {=suggested | filename | AUTO | CANCEL}
'd:\oracle\oradata\redo03.log'
ORA-00310: archived log contains sequence 7747; sequence 7749 required
ORA-00334: archived log: 'D:\ORACLE\ORADATA\REDO03.LOG'


ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: 'D:\ORACLE\ORADATA\ORACLECT\SYSTEM01.DBF'


SQL> recover database using backup controlfile until cancel;
ORA-00279: change 17948482 generated at 08/03/2007 16:08:45 needed for thread 1
ORA-00289: suggestion : D:\ORACLE\ORA81\RDBMS\ARC07749.001
ORA-00280: change 17948482 for thread 1 is in sequence #7749


Specify log: {=suggested | filename | AUTO | CANCEL}
'd:\oracle\oradata\redo01.log'
ORA-00310: archived log contains sequence 7746; sequence 7749 required
ORA-00334: archived log: 'D:\ORACLE\ORADATA\REDO01.LOG'


ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: 'D:\ORACLE\ORADATA\ORACLECT\SYSTEM01.DBF'


SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: 'D:\ORACLE\ORADATA\ORACLECT\SYSTEM01.DBF'


郁闷了。~~~使用备份出来的日志文件恢复不成功。。

总是提示sequence 7749,我这只有这三个日志文件,最大sequence#就是7748,没有7749这个sequence#,而且不是归档模式。
晕。。到哪去找去。。。

没有办法,最后决定强制打开数据库。把数据导出来先。
停掉数据库。在参数文件中加入
_allow_resetlogs_corruption= TRUE

启动数据库。。这次能打开数据库了。。
抓紧时间导出数据数据。。还好,exp过程中没有出现错误。
在网上看到一位兄弟,比我的还厉害。。按owner导出不成功。。。只能一个一个表的导。。。

数据导出来就成功一大半了。。

最后再创建一个库。把用户数据导进去完工。



总结一下:
这次问题还不是很严重。只是控制文件和日志文件损坏。。数据文件都没有问题。重建控制文件。加上隐含参数强制打开数据库后把用户数据导出来。再导入新库。

在碰到问题时关键不能急。多关注一下alert日志。有很多问题都可以在alert里面找到。。比如数据库字符集,日志文件组对应的日志文件等等。。有什 么问题多google一下。。刚开始的时候我就犯了急进主义。。。一定要稳住。。错误已经发生。现在最主要的是如何挽救数据。


第一次碰到灾难恢复。。没有经验。。上面的操作是和网上朋友一块讨论中完成的。
在此多谢给予我支持的“小熊”。
谢谢~~

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/23033727/viewspace-630904/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: Oracle exception
请登录后发表评论 登录
全部评论

注册时间:2010-03-16

  • 博文量
    40
  • 访问量
    33790