坏块类型-NOLOGGING模拟及恢复
corruption_type: 坏块类型
■ ALL ZERO - 磁盘上的块头只包含0字节,在ORACLE 7,若它没有被修复,该块可能是有效的,在Oracle 8将会被格式话成标准空块.
■ FRACTURED - 数据块头看起来合理,但块头跟块后tailchk属于不同版本(值不同).
■ CHECKSUM - 数据块的检查值不一致,不确定为什么检查值失败,但可能是数据块中间的扇区版本值不同
■ CORRUPT - 数据块被错误标识或者不是一个数据块(比如数据块地址丢失)
■ LOGICAL - 逻辑坏块
■ NOLOGGING - 数据块中没有重做日志存在(比如,主库上NOLOGGING操作可能在物理备库上产生这种类型的坏块)
前期重新创建测试环境步骤省略,详情请看文章 >>> 坏块类型-ALL ZERO模拟与修复
前期准备
备份测试表所在数据文件29号
backup as compressed backupset pluggable database pdb001 datafile 29;
模拟 NOLOGGING
alter table jwt.marvin nologging;
insert /*+ append_values */ into jwt.marvin values(10001,'dd');
commit;
alter system flush buffer_cache;
SYS@tstdb1-SQL> select * from v$database_block_corruption;
no rows selected
SYS@tstdb1-SQL> select count(*) from jwt.marvin;
COUNT(*)
----------
10001
设置数据文件offline
alter database datafile 29 offline;
--用之前备份的数据文件进行恢复
run
{
restore pluggable database pdb001 datafile 29
recover pluggable database pdb001;
}
设置数据文件在线online
alter database datafile 29 online;
JWT@PDB> select count(*) from jwt.marvin;
select count(*) from jwt.marvin;
*
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 29, block # 245)
ORA-01110: data file 29: '/data/datafile/ORCL/5A5847E139AF054EE05375B029ACCC94/datafile/jwt.dbf'
ORA-26040: Data block was loaded using the NOLOGGING option
JWT@PDB> select * from v$database_block_corruption;
no rows selected
RMAN> validate datafile 29;
Starting validate at 2018-03-19 20:01:30
using channel ORA_DISK_1
channel ORA_DISK_1: starting validation of datafile
channel ORA_DISK_1: specifying datafile(s) for validation
input datafile file number=00029 name=/data/datafile/ORCL/5A5847E139AF054EE05375B029ACCC94/datafile/jwt.dbf
channel ORA_DISK_1: validation complete, elapsed time: 00:00:01
List of Datafiles
=================
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
29 OK 1 6 1281 545450262
File Name: /data/datafile/ORCL/5A5847E139AF054EE05375B029ACCC94/datafile/jwt.dbf
Block Type Blocks Failing Blocks Processed
---------- -------------- ----------------
Data 0 183
Index 0 26
Other 0 1065
Finished validate at 2018-03-19 20:05:30
JWT@PDB> select * from v$database_block_corruption;
FILE# BLOCK# BLOCKS CORRUPTION_CHANGE# CORRUPTIO
--------------- --------------- --------------- ------------------ ---------
29 245 1 545450262 NOLOGGING
恢复方法
NOLOGGING 操作引起的坏块是不能修复的,比如"Media Recovery" 或 "RMAN blockrecover"都无法修复这种坏块
可行的方法是在NOLOGGING 操作之后立刻备份对应的数据文件,对于除了索引以外的其他类型的段,为了修复这个问题,可以通过导出文件(exp/expdp)或者其他数据源来进行恢复。
如果没有备份,可以采用下面的方法重建对象,找到坏块所在的对象:
如果是索引,重新创建(drop/create)索引
如果是表,使用DBMS_REPAIR包或者CTAS复制方式跳过坏块 (丢数据)
如果是表中的 LOB 列对应的 LOB 段,请参考 [Note 293515.1]
如果错误出现在物理 STANDBY 数据库, 从主库恢复被影响的数据文件 (只有当主库没有这个问题的情况下)
版权声明:本文为博主原创文章,未经博主允许不得转载。
- 上一篇:坏块类型-LOGICAL模拟及恢复
- 下一篇:Mysql各存储引擎简概初识



