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;
浙公网安备 33010602011771号