Oracle 当从热备份中执行恢复时显示ORA-01237 或ORA-01200

 

如果自己搞不定可以找诗檀软件专业ORACLE数据库修复团队成员帮您恢复!

诗檀软件专业数据库修复团队

服务热线 : 13764045638 QQ号:47079569 邮箱:[email protected]

 

适用于:

Oracle Server – Enterprise Edition – 版本 10.1.0.2 11.2.0.3 – Release: 10.1 to 11.2
本文信息适用于任何平台。

症状

数据库从一个使用split mirror技术创建的热备份中被恢复。

当我们尝试执行RECOVER UNTIL TIME ,恢复过程失败显示:

SQL> RECOVER DATABASE UNTIL TIME ‘2011-12-31:10:00:00’ USING BACKUP CONTROLFILE;
ORA-00283: recovery session canceled due to errors
ORA-01110: data file 104: ‘/oradbs/oradata/ORCL/sysaux01.dbf’
ORA-01122: database file 104 failed verification check
ORA-01110: data file 104: ‘/oradbs/oradata/ORCL/sysaux01.dbf’
ORA-01200: actual file size of 293120 is smaller than correct size of 298240
blocks

SQL> RECOVER DATABASE UNTIL TIME ‘2011-12-31:10:00:00’ USING BACKUP CONTROLFILE;

ORA-00283: recovery session canceled due to errors
ORA-01237: cannot extend datafile 104
ORA-01110: data file 104: ‘/oradbs/oradata/pri14p/sysaux01.dbf’

原因

储存在控制文件中的数据文件大小与数据文件的物理大小不匹配。

查看在控制文件中的数据文件大小:   v$datafile.blocks
OS级别查看数据文件大小:           ls -lrt  /oradbs/oradata/ORCL/sysaux01.dbf

查看错误:
ORA-01200: actual file size of 293120 is smaller than correct size of 298240
(a)                                  (b)
控制文件中的数据文件大小是298240
OS的数据文件有293120

OS 级别的文件大小 –> (a) * db_block_size  + db_block_size
在示例中
293120 *db_block_size + One block–> 293120 * 8192 + 8192=2401247232 bytes

同时输出来自:
ls -lrt/oradbs/oradata/ORCL/sysaux01.dbf

DB预期的数据文件大小:(b) * db_block_size  + db_block_size

在示例中
298240 –> 298240* 8192 +8192=2443190272 bytes

解决方案

我们可以使用dd添加块的差异,给文件想要的大小

1. 在一切操作之前创建文件备份l

2. 查看块数的差异

blocks_in_controlfile –  actual_file_size_blocks 

  在示例中:  (b)   –  ( a)   =    298240 – 293120=5120 (blocks)

3.  在该步骤中,一些空/零块会被添加到现有的数据文件,以匹配控制文件中的值。

dd if=/dev/zero of=<location of datafile> bs=<db_block_size in bytes> seek=<Actual block number reported + 1 > count=<Difference in number of blocks>

在示例中:
在参数seek中指定在这里应当附加(append5120 块,因为文件包含 293120 (错误信息所表示),所以seek=293121 是附加会出现的下一个块。

dd if=/dev/zero of=/oradbs/oradata/ORCL/sysaux01.dbf bs=8192 seek=293121 count=5120 conv=notrunc

4. 现在使用ls -lrt <file_name>查看OS级别的文件大小

在示例中。应当为298240* 8192 +8192=2443190272字节

5. 一旦大小匹配,重试恢复:

sql>shutdown immediate;
sql>startup mount;
sql> RECOVER DATABASE UNTIL TIME ‘2011-12-31:10:00:00’ USING BACKUP CONTROLFILE;


Posted

in

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *