Oracle数据库NOLOGGING 坏块识别和处理办法

 

一、产生坏块的原因:
主库进行了nologging操作,主库没有开启force logging功能, redo不完整, 备库应用redo后会产生nologging坏块。



二、检查方法

使用rman validate命令

validate database check logical;

validate datafile 5 check logical;

或者

dbv 命令检查数据文件

 

从 12.2开始:可以使用rman命令:validate database nonlogged block;来校验nologging坏块

rman target /

validate database nonlogged block;

 

查看坏块信息:


Before 12c:

select file#, block#, scn_to_timestamp(CORRUPTION_CHANGE#) from v$database_block_corruption where CORRUPTION_TYPE='NOLOGGING';

 

In 12c:

select file#, block#, scn_to_timestamp(NONLOGGED_START_CHANGE#) from v$nonlogged_block;

 


三、修复方法


12C之前:


基于SCN备份:

执行以下步骤序列以恢复备库损坏的数据块。


1.运行以下查询以识别受NOLOGGING更改影响的数据文件:


SELECT FILE#, FIRST_NONLOGGED_SCN FROM V$DATAFILE WHERE FIRST_NONLOGGED_SCN > 0;

FILE#    FIRST_NONLOGGED_SCN
---------- -------------------
4      20606544


2.首先,我们需要在备用数据库中将受影响的数据文件置于离线状态。
为此,请停止备用数据库中的Redo Apply,执行ALTER DATABASE DATAFILE ... OFFLINE语句,然后再次启动Redo Apply:


SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

SQL> ALTER DATABASE DATAFILE 4 OFFLINE FOR DROP;

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;

 

3.现在,我们将使用FROM SCN关键字对相关数据文件进行增量备份。
SCN值将是第一步中查询执行的输出结果。以RMAN目标身份连接到主数据库,并执行以下RMAN BACKUP语句:


RMAN> BACKUP INCREMENTAL FROM SCN 20606544 DATAFILE 4 FORMAT '/backup/Dbf_inc_%U' TAG 'FOR STANDBY';


4.使用FTP或SCP将备份文件从主站点复制到备用站点:

scp /backup/dbf_inc_* standbyhost:/backup/

 

5.以RMAN目标身份连接到物理备用数据库,并使用RMAN CATALOG命令将复制的备份文件注册到控制文件中:


RMAN> CATALOG START WITH '/backup/dbf_inc_';


6.为了将受影响的数据文件置于online状态,请停止备用数据库上的重做应用,并运行ALTER DATABASE DATAFILE ... ONLINE语句:

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

SQL> ALTER DATABASE DATAFILE 4 ONLINE;


7.通过将备用数据库作为RMAN目标进行连接来恢复数据文件。由于这些文件之前已在控制文件中注册,RMAN将自动使用增量备份:

RMAN> RECOVER DATAFILE 4 NOREDO;


8.现在再次运行第一步中的查询,以确保没有更多数据文件带有NOLOGGING更改:

SQL> SELECT FILE#, FIRST_NONLOGGED_SCN FROM V$DATAFILE WHERE FIRST_NONLOGGED_SCN > 0;

 

9.备库开启redo实时应用:

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;

 


12C之后:


RMAN> report unrecoverable;


1. 备库停止redo应用:

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;


2. 通过将RMAN连接到备用数据库,并执行以下命令来恢复未记录的块:

RMAN> RECOVER DATABASE NONLOGGED BLOCK;

或者如下命令:

RMAN> recover database nonlogged block using compressed backupset from service <tns service of primary>;


3. 备库开启redo实时应用:

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;

posted on 2026-04-30 17:05  颩~  阅读(38)  评论(0)    收藏  举报