怎么修复NOLOGGING操作引起的ORA

55次阅读
没有评论

共计 3657 个字符,预计需要花费 10 分钟才能阅读完成。

本篇内容介绍了“怎么修复 NOLOGGING 操作引起的 ORA-1578 的坏块问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让丸趣 TV 小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

适用于:

Oracle Database – Enterprise Edition – 版本 7.1.6.0 到 12.2.0.1 [发行版 7.1.6 到 12.2]本文档所含信息适用于所有平台

用途

重要:
如果只是错误 ORA-1578,而没有伴随 ORA-26040,那么这个坏块是其他的原因,可以通过 RMAN Block Media Recovery 修复。参考 1578.1

适用范围

本文适用于用户和 Oracle Support。

详细信息

如果数据段定义为
NOLOGGING 属性,当 NOLOGGING/UNRECOVERABLE 操作修改该数据段或者使用 datapump import 参数
disable_archive_logging:y,联机重做日志只记录很少的日志信息,如果之后执行 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。

接下来,这些数据块会被标志为 Soft Corrupt,当下一次访问该数据块时,会报 ORA-1578 和 ORA-26040 错误。

DATAPUMP 参数 DISABLE_ARCHIVE_LOGGING

DATAPUMP
impdp 参数 DISABLE_ARCHIVE_LOGGING:Y 在 import 时禁止 LOGGING
定义,会产生 NOLOGGING 操作; 如果相应的 datafile 被 restored 和 recovered, 那么接下来的语句会报错
ORA-1578 和 ORA-26040.

如果 database 是 FORCE LOGGING 模式, 那么 DISABLE_ARCHIVE_LOGGING 选项不会关闭 logging.

import 时使用这个参数的例子:

impdp scott/tiger directory=DATA_PUMP_DIR dumpfile=dp transform=disable_archive_logging:y

RDBMS 版本变化
10.2.0.4+DBverify 报告 NOLOGGING block 错误信息 DBV-00201: Block, DBA rdba , marked corrupt for invalid redo application 10.2.0.5, 10.2.0.1+RMAN validate 命令检查 NOLOGGING block,在 v$database_block_coruption 视图中记录 corruption_type= NOLOGGING 11g+ 引入 db_unrecoverable_scn_tracking  参数 11.1.0.6 or 11.1.0.7 or 11.2.0.1

NOARCHIVELOG 模式数据库,对 NOLOGGING 对象执行了 DIRECT PATH 操作,并且以后手动恢复数据库,即使打开了 FORCE LOGGING,
也会报 ORA-1578 和 ORA-26040。这个约束在 11.2.0.2 以上版本取消,这个问题在 10g 不会发生。

12cRMAN validate 的结果不在视图 v$database_block_corruption 中,而是在视图 v$nonlogged_block12.2

以下 RMAN 命令被引入:

RMAN validate [database / datafile] nonlogged block;

RMAN recover [database / datafile] nonlogged block; – 对于 Standby 数据库

 

 

解决方法

NOLOGGING 操作引起的坏块是不能修复的,比如 Media Recovery 或 RMAN blockrecover 都无法修复这种坏块。可行的方法是在 NOLOGGING 操作之后立刻备份对应的数据文件。

问题是在执行 RMAN DUPLICATE 或 RESTORE 之后产生?

      如果问题是执行 RMAN DUPLICATE 或 RESTORE 之后  ,那么在源库打开 FORCE LOGGING,然后再重新运行 RMAN DUPLICATE 或 RESTORE。

alter database force logging;

问题是发生在物理 standby 库?

如果错误出现在物理  STANDBY  数据库,
从主库恢复被影响的数据文件 (只有当主库没有这个问题的情况下)。参考文档 Doc ID
958181.1。  在 12c 中可以使用 RMAN 选项 RECOVER NONLOGGED BLOCK with
DATAFILE,TABLESPACE,DATABASE。例如:

 

RMAN RECOVER DATABASE NONLOGGED BLOCK;

 

为了避免这个问题发生,在主库强制生产日志:

alter database force logging;

如果同一个 datafile 的数据块在主库出现 nologging 坏块,但是备库没有,可以通过手动跳过 (dbms_repair) 坏块 或者设置 event 10231.
主库出现 nologging 坏块可能是由于主库执行过备份恢复或者之前是备库,执行了 switchover

识别被影响的 Segment

参考  
Note 819533.1
和  
Note 472231.1
找到坏块所在的对象:

如果 NOLOGGING 数据块位于空闲数据块 (dba_free_space 视图可以查询到),DBVerify 检查会发现这个问题, 报错 DBV-00201
或者在 v$database_block_corruption 视图中显示. 对于这种情况, 我们可以等待到这个数据块被重用时, 会自动格式化, 或者
手动强制格式化, 参考 Doc ID 336133.1

如果是索引,重新创建(drop/create)索引。

如果是表,使用 procedure DBMS_REPAIR.SKIP_CORRUPT_BLOCKS 跳过坏块,请参考
Note 556733.1
获取包 DBMS_REPAIR 的使用示例。然后考虑是否重建表:

移动 table: alter table table_name move;

或者

保存数据 (export, Create Table as Select, etc) 然后 truncate 或 drop/create

  例子:

 

标记表中需要 skip 的块:

BEGIN
DBMS_REPAIR.SKIP_CORRUPT_BLOCKS (
SCHEMA_NAME = schema_name ,
OBJECT_NAME = table_name ,
OBJECT_TYPE = dbms_repair.table_object,
FLAGS = dbms_repair.SKIP_FLAG);
END;
/

确认表的 skipping corrupt blocks 是 ENABLED:

select SKIP_CORRUPT
from dba_tables
where owner = schema_name
and table_name = table_name

Move 这个表:

alter table table_name move;

OR if decided to save the data:

export (datapump or conventional export)
or
Create Table newtable as Select * From nologging_corrupted_table;

 

如果是 LOB 参考 Note 293515.1。

            如果删除有坏块的段之后,这个坏块就处于空闲状态,后续可以被分配给其他对象 / 段,当这个坏块被分配给一个其他对象 / 段时,
            这个数据块被重新格式化。如果 v$database_block_corruption 或者是 v$nonlogged_block (12c+)视图中还是显示为坏块,那么手动运行 rman validate 来清除视图中的信息。

“怎么修复 NOLOGGING 操作引起的 ORA-1578 的坏块问题”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注丸趣 TV 网站,丸趣 TV 小编将为大家输出更多高质量的实用文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-20发表,共计3657字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)