最近客户在恢复数据库时遇到了ORA-600 kclchkblk_4错误,这个错误在MOS上有官方的解释和解决方案。
在以下错误提示下:
代码如下 | 复制代码 |
Errors in file /u01/app/oracle/admin/orcl/bdump/orcl_smon_7493.trc: Starting background process QMNC Errors in file /u01/app/oracle/admin/orcl/bdump/orcl_smon_7493.trc: Errors in file /u01/app/oracle/admin/orcl/bdump/orcl_smon_7493.trc: |
其问题,可能是由于临时表空间的SCN问题导致的,可以尝试删除所有的临时文件,启动数据库,通常可能正常启动。
可能的采取步骤是,在Mount状态下确定并删除临时文件:
代码如下 | 复制代码 |
SQL>select file_name, file_id from dba_temp_files; |
如果数据库能够成功启动,可以重建临时文件。
问题描述:
服务器突然故障死机,导致数据库无法驱动,redo的CURRENT组的损坏。oracle 10g rac环境,asm磁盘组,redhat linux系统。每个组一个成员这个是组被破坏无法修复的关键。
没有归档,没有备份。使用ASM无法将数据文件冷备份出来。
代码如下 | 复制代码 |
|
查看日志组文件信息,报错的日志组为CURRENT模式。
代码如下 | 复制代码 |
SQL> select group#,sequence#,archived,status from v$log; GROUP# SEQUENCE# ARC STATUS
|
组成员只有一个。
代码如下 | 复制代码 |
SQL>
2 1 +DG1/police/onlinelog/group_2. CURRENT 500 3 2 +DG1/police/onlinelog/group_3. INACTIVE 500 4 2 +DG1/police/onlinelog/group_4. CURRENT 500
|
无法使用clear命令清楚redo的信息
代码如下 | 复制代码 |
SQL> alter database clear unarchived logfile group 2 SQL> alter database clear logfile group 2; |
处理步骤
把数据库down掉
代码如下 | 复制代码 |
SQL>shutdown immediate
|
5、在init
代码如下 | 复制代码 |
_allow_resetlogs_corruption=TRUE |
6、重新启动数据库,利用until cancel恢复
SQL>recover database until cancel;
Cancel
如果出错,不再理会,发出
代码如下 | 复制代码 |
SQL>alter database open resetlogs; |
如果运气好的话可以正常启动数据库,就可以导出数据了。但是这里有点意外不知道是点背还是rac环境的恢复比较特殊。在alert.log中有如下报错:
代码如下 | 复制代码 |
|
能后速度将temp删除,能后发现问题依旧。当时我就很失望了,情绪低落。这个报错在网上的解决办法只有这一个。也没有什么人有更好的建议。
代码如下 | 复制代码 |
ORA-00600: internal error code, arguments: [kclchkblk_4], [2824], [18446744071603238605], [2824], [18446744071593491338], [], [], [] Wed Mar 9 14:29:55 2011 Errors in file /u01/app/oracle/admin/police/udump/police1_ora_27660.trc: ORA-00600: internal error code, arguments: [kclchkblk_4], [2824], [18446744071603238605], [2824], [18446744071593491338], [], [], [] Wed Mar 9 14:29:55 2011 Error 600 happened during db open, shutting down database USER: terminating instance due to error 600 |
但是仔细观察后我发现18446744071593491338这个数据有问题,它在我每次重新启动数据库的时候会和前面的数值有所改变18446744071593491338,我的目标就是将
这个数值尽量的缩小和18446744071603238605的值,重复几遍后发现使用srvctl start database -d sid数据库会自动重启多次,我就不停地启动关闭。有希望了两个者还是相差太大,
这一步我们在这里卡了很久。这里有一个scn的问题,我这里碰到的是后面的比前面的低,所以adjust_scn没有效果。
无赖我将_allow_resetlogs_corruption=TRUE增加到spfile中让数据库同时启动。结果发现错误改变了,后来想想估计是要将参数添加到spfile中同时启动数据库才有效果,因为我单独启动数据库的时候效果不大。
代码如下 | 复制代码 |
Errors in file /u01/app/oracle/admin/police/bdump/police2_smon_11322.trc: |
出现了这些报错,现在好了,4137,4138 ,4139不都是undo的报错吧,
新建立两个undo,修改spfile使用新的undo启动,删除旧的undo。
添加spfile参数
代码如下 | 复制代码 |
_allow_resetlogs_corruption"=true " |
如果不能确定多少个,但是我在删除UNDO的时候提示_SYSSMU2无法删除,我还是坚持加到了20个,后来我查了一下一共有400多个还好没有每个都坏掉。
修改undo_management 这个参数
把参数文件中的undo_management 改为MANUAL
代码如下 | 复制代码 |
SQL> create undo tablespace undotbs3 datafile '/opt/oracle/oradata/conner/undotbs3.dbf' size 10M; |
将两个节点的undo都替换后发现数据库可以起来了,但还是有报错,
代码如下 | 复制代码 |
Errors in file /u01/app/oracle/admin/police/bdump/police2_j000_7977.trc: |
但还好可以exp数据了。
导出数据后,删除数据库,删除asm,
关闭第二台的asm实例,
登入第一台asm
代码如下 | 复制代码 |
SQL> select name from v$asm_diskgroup; |
最后
crs_unregister ora.node1.ASM1.asm
crs_unregister ora.node1.ASM1.asm(后来极度后悔,应该在unregister前备份一下就好了)
在dbs和admin下删除asm相关文档
修改/etc/oratab文件将asm的注释。
dbca重新建立asm磁盘发现asm实例无法启动晕倒。好像是出现prks-1011,和ora-0210的报错
使用srvctl add asm -n node1 -i +ASM1 -o $ORACLE_HOME -p init+ASM1.ora
提示ora.node1.ASM1.asm服务已经存在了,但是crs_stat -t查看又没有ora.node1.ASM1.asm服务。
于是我使用crs_register ora.node1.ASM1.asm的时候提示找不到 ora.node1.ASM1.asm.cap的文件(这里折腾了一段时间)
没法我从别的rac上使用crs_stat -p ora.node1.ASM1.asm > ora.node1.ASM1.asm.cap导出了一份拷贝到提示的目录下,并且修改了文件中的主机信息等。
在使用crs_register ora.node1.ASM1.asm就注册成功了。其实 ora.node1.ASM1.asm.cap这个文件的东西和 ora.node1.lsnr的文件内容一样。就是有些东西自己动手修改一下就可以替代了。
重新建库导入文件
艰苦的数据恢复终于完成了。