一次有归档日志无基线备份的数据库恢复

一、现场情况:

      用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状态,查看数据文件状态

        一次有归档日志无基线备份的数据库恢复_第1张图片
   可以看到有三个数据文件出了问题。到操作系统上查看这三个文件:

     

    三个文件都出了问题,全是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完全损坏,考虑重建数据库。

  导出时,尝试了数据库级、用户级、表空间集、表级的expdpexp。发现只有表空间级别和表级别的exp可用。其他都会提示因为无法访问SYSAUX,报错中止。

 没办法,只好用exp表空间级别的导出。

7、新建数据库()

8、导入数据

   将第6步的exp数据导入新库后,发现少了很多对象。可能由于源库OBJ$损坏,表也只迁移了不到50%

9、换pl/sql developer导出 

    exp没法用,只好用pl/sql developerexport user objects(导出用户对象)。该工具可以自动调用dbms_metadata.get_ddl来生成用户对象的创建语句。

   一次有归档日志无基线备份的数据库恢复_第2张图片

10、导入数据

    将第9步生成的脚本,放到数据库上执行。

    数据通过dblink,批量导入。insert into table select * fromtable@orcl_old;

11、完成后续工作

         数据库恢复基本就完成了,剩下的工作就是修改下参数文件,改下数据库名称,调试下RoseHa。

你可能感兴趣的:(一次有归档日志无基线备份的数据库恢复)