oracle 10g使用物理备库恢复主库损坏/丢失的数据文件
0 症状
oracle 10g dataguard主库某一数据文件发现有损坏,使用dbv检测数据文件:
1 | cmd> dbv file=E:\\oracle\\product\\10.2.0\\db_1\\database\\afsts.dbf feedback=100 |
操作系统中拷贝数据文件会出现错误”无法复制 AFSTS: 数据错误(循环冗余检查)。”,事件查看器中发现错误“设备 \Device\Harddisk1\DR1 有一个不正确的区块。”,数据文件有物理损坏。
此时数据文件无法拷贝和删除,需要将数据文件离线,然后用chkdsk系统工具修复,或者使用“分区”右键属性里的”工具”->”查错”->“开始检查”,选中“自动修复文件系统错误”
1 | cmd> chkdsk e: /F /I /C |
/I和/C用于跳过部分检查,减少扫描时间。
修复错误后,数据文件的内容可能已经不正确了,需要使用standby数据库数据文件恢复。
注:使用rman restore数据文件可以直接恢复,无需提前修复文件系统错误。
1 修复
1.1 首先确保用于恢复的数据文件是没有损坏的
备库端:
a. dbv检查
1 | cmd> dbv file=E:\\oracle\\product\\10.2.0\\db_1\\database\\afsts.dbf feedback=100 |
确保Total Pages Failing (Data),Total Pages Failing (Index),Total Pages Failing (Seg) 和Total Pages Marked Corrupt皆为0
b. rman检查
找出数据文件的编号
1 | sql> select FILE#,NAME,STATUS from v$datafile where name like '%AFSTS.DBF%'; |
数据文件检查
1 | $ rman target sys/password@db_feich; |
因为物理standby是mounted状态,是不可写的。所以此检查对于正在进行日志恢复的standby是无法实施的。
1.2 备库端操作
备份数据文件
1 | $ rman target sys/password@db_standby; |
1.3 主库端操作
a. 将备库备份的数据文件拷贝到主库相同的目录结构下
b. 将备份加入恢复目录catalog
1 | $ rman target sys/password@db_primary; |
c. 数据文件离线
1 | $ sqlplus sys/password@db_primary as sysdba; |
d. restore/recover数据文件
1 | $ rman target sys/password@db_primary; |
e. 数据文件上线
1 | RMAN> sql 'alter database datafile 20 online'; |
f. 检查数据文件完整性
1 | RMAN> backup validate check logical datafile 20; |
也可以再用dbv检查一下
完毕,也可以用主库数据文件恢复备库丢失或损坏的数据文件,只不过操作方向不同而已。
References:
[1]Recovering the primary database’s datafile using the physical standby, and vice versa (Doc ID 453153.1)
[2]Recover the Primary Database’s datafile using a copy of a Physical Standby Database’s Datafile
[3]Recovering a corrupted/lost datafile on Primary database from the Standby database
[4]Steps to recover the standby database’s datafile using a backup of the primary database’s data file