Corrupt block 常见处理方法--之NOLOGGING 操作引起的坏块解决方法

来源:互联网 发布:淘宝多久自动收货 编辑:程序博客网 时间:2024/05/21 10:50

本文目的

介绍当将某些数据段设置成NOLOGGING模式后,常见的坏块发生后的处理方法及相关解释


适用版本

适用于 Oracle Database - Enterprise Edition - 版本 7.1.6.0 到 12.1.0.1 [发行版 7.1.6 到 12.1]

如果数据段定义为NOLOGGING属性,当NOLOGGING / UNRECOVERABLE操作修改该数据段时,联机重做日志只记录很少的日志信息,

如果之后执行RECOVERY 操作的话,会导致这些块无效。如果这些联机重做日志/归档日志被用来恢复数据文件,那么 Oracle 会将对应的数

据块标志为无效,而且下一次访问这些数据块时,会报 ORA-1578 和 ORA-26040错误。

例如:

SQL> select * from test_nologging;

ORA-01578: ORACLE data block corrupted (file # 11, block # 84)
ORA-01110: data file 4: '/oradata/users.dbf'
ORA-26040: Data block was loaded using the NOLOGGING option

从以下数据字典视图中的 LOGGING 列记录了 NOLOGGING 属性:

DBA_TABLES,

DBA_INDEXES,

DBA_LOBS,

DBA_TAB_PARTITIONS,

DBA_LOB_PARTITIONS,

DBA_TAB_SUBPARTITIONS,等等。

其中,LOGGING='NO' 表示 NOLOGGING。

简而言之,recover了定义NOLOGGING的数据段后,这些数据块会被标志为 Soft Corrupt,当下一次访问该数据块时,会报 ORA-1578 

和 ORA-26040错误。


【常用坏块的检测方法】

利用RMAN / DBV(dbverify) 检测NOLOGGING 导致的坏块

DBV 检测坏块时,如果 RDBMS 版本小于 10.2.0.4,那么 DBV 打印错误 DBV-200,如果 RDBMS 版本大于或等于 10.2.0.4,那么 DBV 

打印错误 DBV-201,Reference [Note  5031712.8 ]

DBV-00200: Block, dba 46137428, already marked corrupted
DBV-00201: Block, DBA 46137428, marked corrupt for invalid redo application

RMAN 检测坏块时,如果 RDBMS 版本小于 10.2.0.5 和 11.1.0.7,RMAN 打印如下错误:

From 10.2.0.4 and lower,  to 11.1.0.6, 11.1.0.7:

RMAN reports it in v$database_block_corruption with CORRUPTION_TYPE=LOGICAL

如果 RDBMS 版本大于或等于 10.2.0.5 和 11.2.0.1

RMAN 报告:查看视图 v$database_block_corruption 中 CORRUPTION_TYPE=NOLOGGING 的记录。参考 [Note 7396077.8]:

RMAN reports it in v$database_block_corruption with CORRUPTION_TYPE=NOLOGGING

【NOLOGGING 对备份的影响】

NOLOGGING 导致的坏块不会导致 RMAN 备份失败,同样被标记为soft corrupt的block不会导致Rman 备份失败,但是恢复出来的依然

有soft corrupt block,这会影响后面的DML 操作,出现 ORA-26040和其他报错信息。


【监控 NOLOGGING 操作】

当执行 NOLOGGING 操作时,V$DATAFILE 中以下列会被更新,了解更多这些列的信息,请参考 Oracle 数据库在线文档:

UNRECOVERABLE_CHANGE#     
UNRECOVERABLE_TIME    
FIRST_NONLOGGED_SCN
FIRST_NONLOGGED_TIME

【注意】

在 NOARCHIVELOG 模式下 FORCE LOGGING 是不生效的,这个变化是在 11.1.0.6 和 11.1.0.7 引 入的,这个限制从 11.2.0.2 开 始被取消。

详细参考[Note 1071869.1]


如何修复nologging 引起的坏块

NOLOGGING 操作引起的坏块是不能修复的,比如"Media Recovery" 或 "RMAN blockrecover"都无法修复这种坏块。可行的方法是在 

NOLOGGING 操作之后立刻备份对应的数据文件。对于除了索引以外的其他类型的段,为了修复这个问题,可以通过导出文件(exp/expdp)

或者其他数据源来进行恢复。如果没有备份,可以采用下面的方法重建对象:参考[ Note 819533.1] 找到坏块所在的对象:


如果是索引,重新创建(drop/create)索引。
如果是表,使用 procedure DBMS_REPAIR.SKIP_CORRUPT_BLOCKS 跳过坏块,然后重建表。请参考[ Note 556733.1] 获取包 DBMS_REPAIR 的使用例。
如果是表中的 LOB 列对应的 LOB 段,请参考 [Note 293515.1]
如果错误出现在物理 STANDBY 数据库, 从主库恢复被影响的数据文件 (只有当主库没有这个问题的情况下)。

运行 [Note 472231.1] 中的脚本识别其他坏块。








0 0