当前位置:操作系统 > Unix/Linux >>

windows32位平台数据库宕机不能open怎么办

windows32位平台数据库宕机不能open怎么办
 
朋友那32位的windows 2003平台,跑了2年的oracle 10g数据库。
因为操作系统中毒,系统异常关闭后启动蓝屏。
没办法,重装操作系统,重装oracle软件,挂载数据文件后,启动
报错:SYSTEM01.DBF需要恢复。
查看数据库配置,非归档运行,也没有可用的数据库备份。
尝试了_allow_resetlogs_corruption,_offline_rollback_segments,
_corrupt_rollback_segments,set 10513 event等多种方法,始终不
能打开数据库。
设置了_allow_resetlogs_corruption后,数据库启动关键日志如下:
alert_tjserver.log
[plain]
Wed Mar 20 17:21:53 2013  
Errors in file d:\oracle\admin\tjserver\udump\tjserver_ora_1614.trc:  
ORA-00600: internal error code, arguments: [4000], [7], [], [], [], [], [], []  
 
常规恢复都没起作用,ORA-00600 [4000],[7]在没有可用备份的情况下,
一般考虑用BBED工具做修复。
整个恢复流程,基本思路如下:
1、将数据文件、控制文件、参数文件,复制到linux或Unix平台上,
我这顺手就用了64位的Solaris。
2、在Solaris平台上安装同版本的Oracle软件。
3、用RMAN做数据文件的跨平台转换。
4、修改参数文件,启动实例,重建控制文件。
5、在Solaris平台上编译BBED工具,并修改数据文件。
6、修正其他错误,尝试open数据库。
7、做全库的exp导出,然后恢复到新的数据库中。
 
需要用的工作技能主要包括:Solaris操作系统使用、Oracle在Solaris
上的安装、RMAN跨平台转换数据库、Oracle基本灾备技能、BBED
工具使用、exp工具使用
第一、二步网上有很多文档,就不介绍了。
这里直接从第三步RMAN跨平台转换开始
[plain]
RMAN> conn target /  
  
RMAN>run{  
     convert datafile '/opt/oracle/tjserver/SYSTEM01.DBF' to
platform='Solaris[tm] OE (64-bit)' format='/opt/oracle/tjserver/
SYSTEM01.DBF.NEW';  
     convert datafile '/opt/oracle/tjserver/UNDOTBS01.DBF' to
platform='Solaris[tm] OE (64-bit)' format='/opt/oracle/tjserver/
UNDOTBS01.DBF.NEW';  
     convert datafile '/opt/oracle/tjserver/SYSAUX01.DBF' to
platform='Solaris[tm] OE (64-bit)' format='/opt/oracle/tjserver/
SYSAUX01.DBF.NEW';  
     convert datafile '/opt/oracle/tjserver/USERS01.DBF' to
platform='Solaris[tm] OE (64-bit)' format='/opt/oracle/tjserver/
USERS01.DBF.NEW';  
     convert datafile '/opt/oracle/tjserver/INDEX01.DBF' to
platform='Solaris[tm] OE (64-bit)' format='/opt/oracle/tjserver/
INDEX01.DBF.NEW';  
}  
 
 
逐一转换所有文件。
 
第四步    修改参数文件,重建控制文件
1)修改参数文件中的*_dest路径,从原来的windows 指向
新的Solaris路径
[plain]
tjserver.__db_cache_size=75497472  
tjserver.__java_pool_size=4194304  
tjserver.__large_pool_size=4194304  
tjserver.__shared_pool_size=79691776  
tjserver.__streams_pool_size=0  
*.audit_file_dest='/opt/oracle/admin/tjserver/adump'  
*.background_dump_dest='/opt/oracle/admin/tjserver/bdump'  
*.compatible='10.2.0.1.0'  
*.control_files='/opt/oracle/oradata/tjserver/control01.ctl','/opt
/oracle/oradata/tjserver/control02.ctl','/opt/oracle/oradata/tjserver/
control03.ctl'  
*.core_dump_dest='/opt/oracle/admin/tjserver/cdump'  
*.db_block_size=8192  
*.db_domain=''  
*.db_file_multiblock_read_count=16  
*.db_name='tjserver'  
*.dispatchers='(PROTOCOL=TCP) (SERVICE=tjserverXDB)'  
*.job_queue_processes=10  
*.open_cursors=300  
*.pga_aggregate_target=52428800  
*.processes=150  
*.remote_login_passwordfile='EXCLUSIVE'  
*.sga_target=167772160  
*.undo_management='AUTO'  
*.undo_tablespace='UNDOTBS1'  
*.user_dump_dest='/opt/oracle/admin/tjserver/udump'  
 
重建控制文件:
sql>startup mount;
sql>alter database backup controlfile to trace;
到udump目录下,找到trace文件,根据文件脚本,重建控制文件:
[plain]
SQL> CREATE CONTROLFILE REUSE DATABASE "TJSERVER" RESETLOGS  
    MAXLOGFILES 16  
    MAXLOGMEMBERS 5  
    MAXDATAFILES 100  
    MAXINSTANCES 8  
    MAXLOGHISTORY 292  
LOGFILE  
  GROUP 1 (  
    '/opt/oracle/oradata/tjserver/REDO01.LOG'  
  ) SIZE 50M,  
GROUP 2     '/opt/oracle/oradata/tjserver/REDO02.LOG' SIZE 50M,  
GROUP 3     '/opt/oracle/oradata/tjserver/REDO03.LOG' SIZE 50M  
DATAFILE  
  '/opt/oracle/oradata/tjserver/SYSTEM01.DBF.NEW',  
  '/opt/oracle/oradata/tjserver/UNDOTBS01.DBF.NEW',  
  '/opt/oracle/oradata/tjserver/SYSAUX01.DBF.NEW',  
  '/opt/oracle/oradata/tjserver/USERS01.DBF.NEW',  
  '/opt/oracle/oradata/tjserver/INDEX01.DBF.NEW'  
CHARACTER SET US7ASCII;  
 
5、使用BBED工具修改数据块
这里就涉及到,要修改哪个文件?哪个数据块?多少偏移量?修改成多少?
我咋知道它是对的错的呢?
这些都需要详细看日志。
打开alerttjserver.log中提示的trace文件:
d:\oracle\admin\tjserver\udump\tjserver_ora_1614.trc
在跟踪文件中,可以发现以下信息:
[plain]
ksedmp: internal or fatal error  
ORA-00600: internal error code, arguments: [4000], [7], [], [], [], [], [], []  
Current SQL statement for this session:  
select ctime, mtime, stime from obj$ where obj# = :1  
----- Call Stack Trace -----  
calling              call     entry                argument values in hex        
location             type     point                (? means dubious value)       
-------------------- -------- -------------------- ----------------------------  
ksedst()+23          ?        0000000000000000     00142A73C
000000000 0FFDF5830  
                                                   0FFFFFD7F  
ksedmp()+796         ?        0000000000000000     001429231
000000000 005E1BF08  
                                                   000000000  
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,