一、现场情况:
用RoseHa做的oracle双机热备。数据库版本是11.2.0.1.0(64位),操作系统是64位windows2008。
公司的测试环境,用户保留了最近1个月的归档日志,没做基线备份。
数据库大约10天前提示SYSTEM表空间存在坏块。昨天重启电脑后,数据库就不能自己启动了。alert_orcl.log提示如下错误:
ORA-00376: file cannot be read at this time ORA-00376: file 2 cannot be read at this time ORA-01110: data file 2: 'E:\ORCL\SYSAUX01.DBF' ORA-27069: attempt to do I/O beyond the range of the file OSD-04026: 传递的参数无效。 O/S-Error: (OS 1) 函数不正确。 ORA-27069: attempt to do I/O beyond the range of the file OSD-04026: 传递的参数无效。 O/S-Error: (OS 1) 函数不正确。
二、处理过程
1、将数据库启动到mount状态,查看数据文件状态
可以看到有三个数据文件出了问题。到操作系统上查看这三个文件:
三个文件都出了问题,全是0 K,涉及到两个业务数据文件,及SYSAUX表空间。
只能做介质恢复了。
2、dbv检查有坏块的SYSTEM文件
DBV file=..... blocksize=8192
3、设置跳过不可用块,将不能访问的数据文件offline,启动数据库
SQL> STARTUP NOMOUNT; SQL> ALTER SYSTEM SET EVENT='10231 trace name context forever, level 10'; SQL> STARTUP MOUNT FORCE; SQL> ALTER DATABASE DATAFILE 2 OFFLINE; SQL> ALTER DATABASE DATAFILE 11 OFFLINE; SQL> ALTER DATABASE DATAFILE 14 OFFLINE; SQL> ALTER DATABASE OPEN;
数据库可以正常启动。
4、使用RMAN做全面检查
RMAN>backup validate check logical database;
SQL> select * from v$database_block_corruption; FILE# BLOCK# BLOCKS CORRUPTION_CHANGE# CORRUPTION_TYPE ---------- ---------- ---------- ------------------ ------------------ 1 111130 1 0 CORRUPT 1 111127 1 0 CORRUPT 1 100219 5 0 CORRUPT 1 100189 8 0 CORRUPT 1 100163 25 0 CORRUPT 1 100120 15 0 CORRUPT 1 100119 1 0 FRACTURED 1 100292 1 0 FRACTURED 1 100291 1 0 CHECKSUM 1 100290 1 0 CORRUPT 1 100289 1 0 FRACTURED 1 100286 1 0 CORRUPT 1 100285 1 0 FRACTURED 1 100278 5 0 CORRUPT 1 100247 8 0 CORRUPT 1 100225 8 0 CORRUPT 1 100234 4 0 CORRUPT 2 89460 2 0 CORRUPT 2 89320 24 0 CORRUPT 2 89433 22 0 CORRUPT 2 89385 16 0 CORRUPT 11 5283 15 0 CORRUPT 11 5282 1 0 FRACTURED 11 5769 1 0 CORRUPT 14 16057 31 0 CORRUPT 14 16038 18 0 CORRUPT 14 16037 1 0 FRACTURED 14 16036 1 0 CORRUPT 14 16035 1 0 FRACTURED 14 16034 1 0 CORRUPT 14 16011 20 0 CORRUPT 14 16010 1 0 FRACTURED 14 16000 6 0 CORRUPT 14 16376 7 0 CORRUPT 已选择34行。
5、恢复业务数据文件
SQL> ALTER DATABASE CREATE DATAFILE 11; SQL> ALTER DATABASE CREATE DATAFILE 14; SQL> ALTER DATABASE DATAFILE 11 ONLINE; SQL> ALTER DATABASE DATAFILE 14 ONLINE;
6、导出数据
因为SYSTEM表空间有坏块,在OBJ$表上也存在坏块。SYSAUX完全损坏,考虑重建数据库。
导出时,尝试了数据库级、用户级、表空间集、表级的expdp及exp。发现只有表空间级别和表级别的exp可用。其他都会提示因为无法访问SYSAUX,报错中止。
没办法,只好用exp表空间级别的导出。
7、新建数据库(略)
8、导入数据
将第6步的exp数据导入新库后,发现少了很多对象。可能由于源库OBJ$损坏,表也只迁移了不到50%。
9、换pl/sql developer导出
exp没法用,只好用pl/sql developer的export user objects(导出用户对象)。该工具可以自动调用dbms_metadata.get_ddl来生成用户对象的创建语句。
10、导入数据
将第9步生成的脚本,放到数据库上执行。
数据通过dblink,批量导入。insert into table select * fromtable@orcl_old;
11、完成后续工作
数据库恢复基本就完成了,剩下的工作就是修改下参数文件,改下数据库名称,调试下RoseHa。