暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ORA-01578和ORA-26040块错误的原因有哪些?

DB宝 2018-10-29
1219


Q
题目 


ORA-01578和ORA-26040块错误的原因有哪些?


     

A
答案



(一)NOLOGGING操作引起的坏块(ORA-01578ORA-26040)简介

如果只是错误ORA-01578,而没有伴随ORA-26040,那么这个坏块是由其它的原因引起的坏块,可以尝试使用RMANBMRBlock Media Recovery)修复。

如果数据段(表段、索引段)被定义为NOLOGGING属性,那么当NOLOGGINGAPPENDUNRECOVERABLE操作修改该数据段或者使用数据泵(DATAPUMPimpdp参数DISABLE_ARCHIVE_LOGGING:Y时,联机重做日志只会记录很少的日志信息。如果这些联机重做日志或归档日志被用来恢复数据文件,那么Oracle会将对应的数据块标志为无效(Soft Corrupt),而且下一次访问这些数据块时,会报ORA-01578ORA-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

数据字典视图DBA_TABLESDBA_INDEXESDBA_LOBSDBA_TAB_PARTITIONSDBA_LOB_PARTITIONSDBA_TAB_SUBPARTITIONS中的LOGGING列记录了NOLOGGING属性。若LOGGING='NO'则表示NOLOGGING

数据泵DATAPUMPimpdp参数DISABLE_ARCHIVE_LOGGING:Y在执行导入时会禁止LOGGING定义,而产生NOLOGGING操作。如果相应的datafilerestoredrecovered,那么接下来的涉及到目标表的查询会报错ORA-1578ORA-26040。如果数据库是FORCE LOGGING模式,那么DISABLE_ARCHIVE_LOGGING选项不会关闭LOGGING

impdp使用参数“DISABLE_ARCHIVE_LOGGING:Y”的一个例子:

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

NOLOGGING导致的坏块不会导致RMAN备份失败。一般来说soft corrupt block不会导致RMAN备份失败,不需要设置MAXCORRUPT。数据库备份中就会含有soft corrupt block,如果使用这些备份恢复数据,那么恢复的数据也含有soft corrupt block

ORA-26040错误之外,当还有一些其他通用信息出现时,block dump可能会被产生。如果数据块的block dump内有byte 0xff信息或者属于某个段,ORA-1578ORA-26040会因为介质恢复了NOLOGGING的部分导致了corruption而出现。

(二)利用RMANDBV检测NOLOGGING导致的坏块

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

DBV-00200: Block, dba 46137428, already marked corrupted

DBV-00201: Block, DBA 46137428, marked corrupt for invalid redo application

RMANVALIDATE命令可以用来检测NOLOGGING数据块,检查结果记录在视图V$DATABASE_BLOCK_CORRUPTION(小于12c的版本)和V$NONLOGGED_BLOCK12c及其以上)。

下面的例子中检查出DATAFILE 4933坏块,查询V$DATABASE_BLOCK_CORRUPTION或者V$NONLOGGED_BLOCK

RMAN> VALIDATE DATABASE;

...

.....

File Status Marked Corrupt Empty Blocks Blocks Examined High SCN

---- ------ -------------- ------------ --------------- ----------

4    OK     933            1            6401            2275124  

  File Name: oracle/dbs/users.dbf

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

10.2.0.4 and lower, 11.1.0.6, 11.1.0.7:

RMAN validate reports it in v$database_block_corruption with CORRUPTION_TYPE=LOGICAL

如果RDBMS版本大于或等于10.2.0.511.2.0.1RMAN报告,查看视图v$database_block_corruptionCORRUPTION_TYPE=NOLOGGING的记录。

10.2.0.5 and 11.2.0.1+:

RMAN validate reports it in v$database_block_corruption with CORRUPTION_TYPE=NOLOGGING

12c及以后版本中,RMAN validate的结果不在视图v$database_block_corruption中,而是在视图v$nonlogged_block。从12.2 版本开始,可以使用新的命令:“validate .. nonlogged block”去验证nologgingblock

在以下的例子中,数据文件56nologgedblock

RMAN> validate database nonlogged block;

 

Starting validate at ...

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: SID=133 device type=DISK

channel ORA_DISK_1: starting validation of datafile

channel ORA_DISK_1: validation complete, elapsed time: 00:00:35

 

List of Datafiles

=================

File Status Nonlogged Blocks Blocks Examined Blocks Skipped

---- ------ ---------------- --------------- --------------

1        OK 0                         106363 0

2        OK 0                          78919 0

3        OK 0                          96639 0

4        OK 0                           4991 0

5        OK 400                         2559 0

6        OK 569                         2559 0

 

Details of nonlogged blocks can be queried from v$nonlogged_block view

在告警日志中会更新以下信息:

Started Nonlogged Block Replacement recovery(validate) on file 5 (ospid 26351 rcvid 10616970560844821494)

Finished Nonlogged Block Replacement recovery(validate) on file 5. 400 blocks found

 

Started Nonlogged Block Replacement recovery(validate) on file 6 (ospid 26351 rcvid 10616970560844821494)

Finished Nonlogged Block Replacement recovery(validate) on file 6. 569 blocks found

 

(三)监控NOLOGGING操作

若执行了NOLOGGING操作,并且之后在没有备份的情况下,RMAN命令“REPORT UNRECOVERABLE”可以查询出被影响的datafile

RMAN> report unrecoverable;

 

using target database control file instead of recovery catalog

Report of files that need backup due to unrecoverable operations

File Type of Backup Required Name

---- ----------------------- -----------------------------------

4    full or incremental     oracle/dbs/users.dbf

当初始化参数db_unrecoverable_scn_tracking设置为true(默认值,该参数在10g中是不可用的),那么V$DATAFILE中以下列会被更新;

SYS@lhr121> select UNRECOVERABLE_CHANGE# ,   

  2  UNRECOVERABLE_TIME    ,

  3  FIRST_NONLOGGED_SCN ,

  4  FIRST_NONLOGGED_TIME from v$datafile where file#=6;

 

UNRECOVERABLE_CHANGE# UNRECOVERABLE_TIME  FIRST_NONLOGGED_SCN FIRST_NONLOGGED_TIM

--------------------- ------------------- ------------------- -------------------

              2878238 2018-04-10 10:53:47             2878238 2018-04-10 10:53:47

11.2.0.4 12.1.0.2+版本中,设置event 16490的情况下,物理备库的MRP进程会检查出NOLOGGING变化,并记录在alert log

ORA-16490 "logging invalidated blocks on standby due to invalidation redo"

 

"INVD_BLKS: Invalidating (file <file number>, bno <block number>)"   

"fname: 'Datafile name'. rdba: ..."

(四)识别数据块什么时候被标志为NOLOGGING

识别数据块什么时候被标志为NOLOGGING,可以将trace文件中数据块SCN或者v$database_block_coruption视图中CORRUPTION_CHANGE#值转换为时间:

① 使用trace文件中数据块SCN,例如:

  Start dump data blocks tsn: 60 file#: 4 minblk 84 maxblk 84

  buffer tsn: 3 rdba: 0x02c00054 (11/84)

  scn: 0x0771.4fa24eb5 seq: 0xff flg: 0x04 tail: 0x4eb500ff

提取SCN0x0771.4fa24eb5,删除'.',然后转换0x07714fa24eb到十进制511453045995

② 使用v$database_block_coruption视图中CORRUPTION_CHANGE#

如果运行RMAN validate命令后,v$database_block_coruption视图中corruption_type='NOLOGGING' (10.2.0.5  11.2.0.1+),那么CORRUPTION_CHANGE#列的值就是十进制的SCN值。可以使用下面的方法获得SCN Timestamp时间:

select scn_to_timestamp(&&decimal_scn) from dual;

如果运行RMAN validate:

select file#, block#, scn_to_timestamp(CORRUPTION_CHANGE#)

from v$database_block_corruption

where CORRUPTION_TYPE='NOLOGGING';

12c中:

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

如果查询gv$archived_log  gv$log_history遇到错误ORA-08181:

alter session set nls_date_format = 'DD-MON-YY HH24:MI:SS';

select first_time, next_time

from gv$archived_log

where &decimal_scn between first_change# and next_change#;

select first_time

from gv$log_history

where &decimal_scn between first_change# and next_change#;

 

 

如果运行RMAN validate:

 

alter session set nls_date_format = 'DD-MON-YY HH24:MI:SS';

 

select file#, block#, first_time, next_time

from v$archived_log, v$database_block_corruption

where CORRUPTION_CHANGE# between first_change# and next_change#

and CORRUPTION_TYPE='NOLOGGING';

 

 

select file#,block#,first_time

from   v$log_history, v$database_block_corruption

where  CORRUPTION_CHANGE# between first_change# and next_change#

  and CORRUPTION_TYPE='NOLOGGING';

 

12c:

 

alter session set nls_date_format = 'DD-MON-YY HH24:MI:SS';

 

select file#, block#, first_time, next_time

from v$nonlogged_block, v$archived_log

where NONLOGGED_START_CHANGE# between first_change# and next_change#;

 

 

select file#, block#, first_time

from v$nonlogged_block, v$log_history

where NONLOGGED_START_CHANGE# between first_change# and next_change#;

 

(五)SYSAUX表空间、AWREM等出现NOARCHIVELOGNOLOGGING问题

如果数据库版本是11.1.0.6  11.1.0.7  11.2.0.1,对NOLOGGING对象执行过DIRECT PATH操作,并且后续执行了RECOVER DATABASE命令,即使数据库FORCE LOGGING是打开的情况下,会出现ORA-1578ORA-26040错误。这种问题经常发生在SYSAUX表空间中的AWREM对象。请参考Note 1071869.1。注意数据库当前版本可能已经大于11.1 或者 11.2.0.1但是问题可能是在升级之前产生的。这个约束在11.2.0.2以上版本中取消,这个问题在10g不会发生。

RDBMS版本变化:

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不会发生。

12c

RMAN validate的结果不在视图v$database_block_corruption中,而是在视图v$nonlogged_block

12.2

以下RMAN命令被引入:

RMAN> validate [database datafile] nonlogged block;

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

 

(六)解决方法

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

如果错误是执行RMAN DUPLICATE  RESTORE之后产生的,那么在源库打开FORCE LOGGING,然后再重新运行RMAN DUPLICATE  RESTORE

alter database force logging;

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

RMAN> RECOVER DATABASE NONLOGGED BLOCK;

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

alter database force logging;

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

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

如果是索引,那么可以重新创建(drop/create)索引。如果是表,那么可以使用存储过程DBMS_REPAIR.SKIP_CORRUPT_BLOCKS跳过坏块,然后考虑是否重建表。

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

如果是LOB,那么请参考Note 293515.1


DB笔试面试历史连接

http://mp.weixin.qq.com/s/Vm5PqNcDcITkOr9cQg6T7w


小麦苗课堂培训认证

OCP培训说明连接:https://mp.weixin.qq.com/s/2cymJ4xiBPtTaHu16HkiuA

OCM培训说明连接:https://mp.weixin.qq.com/s/7-R6Cz8RcJKduVv6YlAxJA

高可用(RAC+DG+OGG)培训说明连接:https://mp.weixin.qq.com/s/4vf042CnOdAD8zDyjUueiw


DBA宝典小程序

  DBA宝典小程序

About Me:小麦苗

 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用

● 作者博客地址:http://blog.itpub.net/26736162/abstract/1/

 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

 版权所有,欢迎分享本文,转载请保留出处

 QQ:646634621  QQ群:618766405

● 题目解答若有不当之处,还望各位朋友批评指正,共同进步

1  现有课程

 

课程名称

课时

上课时间

简介

价格

OCP认证

35课时/期

20:00-22:00

从入门到专家,OCP报名后可以免费学习11g OCP、12c OCP、18c OCP、19c OCP等内容,即涉及所有版本OCP内容均可免费学习。

1588

OCM认证

9课时/期

20:00-22:00

OCM实时答疑,提供和考试一样的练习模拟环境,只要按照老师讲的方式来练习,可以保证100%通过

23000

高可用课程(rac+dg+ogg)

25课时/期

20:00-22:00

包括RAC、DG和OGG最实用的数据库操作实战内容。

1888

Oracle健康检查脚本

可微信或微店购买。

88

OCP+高可用(rac+dg+ogg)

报名OCP+高可用课程,可以优惠300元,优惠后的价格为3188

3188

注意:

1、每次上课前30分钟答疑。

2、授课方式:腾讯课堂网络直播讲课(非视频) + QQ互动答疑 + 视频复习

3、OCP内容有包过班,这个可以找麦老师私聊。

4、以上所有课程均可循环听课。

5、以上价格已包含直播、讲课视频和讲课文档,即报名后,讲课视频和文档都会共享给大家。

 

 

2  网络连接说明

培训项目

连接地址

DB笔试面试历史连接

http://mp.weixin.qq.com/s/Vm5PqNcDcITkOr9cQg6T7w

OCP培训说明连接

https://mp.weixin.qq.com/s/2cymJ4xiBPtTaHu16HkiuA

OCM培训说明连接

https://mp.weixin.qq.com/s/7-R6Cz8RcJKduVv6YlAxJA

高可用(RAC+DG+OGG)培训说明连接

https://mp.weixin.qq.com/s/4vf042CnOdAD8zDyjUueiw

OCP最新题库解析历史连接(052)

http://mp.weixin.qq.com/s/bUgn4-uciSndji_pUbLZfA

微店地址

https://weidian.com/s/793741433?wfr=c&ifr=shopdetail

我的信息

QQ:646634621  微信号:lhrbestxh

小麦苗课堂试听内容

https://share.weiyun.com/5HnQEuL

小麦苗课堂腾讯视频内容

http://v.qq.com/vplus/71f69a319a24c6808cd6e6189ae90664

 

 

1  小麦苗课堂优势及优惠

1.1  小麦苗课堂有如下优势

1、OCP、高可用课堂可以循环永久听课。

2、课程实用,偏向实战,只讲实用的,不讲没用的。

3、网络班不占用周末时间。课后可以随时反复学习。

4、报名多多,优惠多多。老学员优惠更多。

5、升级式学习。例如,11g OCP在后边会加入12C、18c的新特性讲解。即OCP报名一次,涉及所有版本OCP内容均可免费学习。

 

1.2  小麦苗课堂现有的优惠

为了感谢广大朋友一直以来对小麦苗课堂的支持,现给出以下优惠:

优惠一、【高可用课程可以免费听课啦】

① 凡是给麦老师成功推荐2名OCP、OCM或高可用学员的朋友,均可获赠高可用听课名额一个。终身有效!并且,麦老师所有课程支持八折优惠。

② 凡是咨询过麦老师并且从麦老师这里报了OCM课程的学员,均可获赠高可用听课名额一个。终身有效!并且,麦老师所有课程支持八折优惠。

优惠二、【OCP课程可以免费听课啦】凡是报了麦老师的OCM课程,均可获赠OCP听课名额一个。终身有效!并且,麦老师所有课程支持八折优惠。

优惠三、【健康检查脚本赠送】凡是报名麦老师OCP、OCM或高可用课程之中的任意2门课的学员,均可获赠Oracle数据库健康检查脚本一套。

优惠四、凡是每月的第一天报名麦老师的OCP高可用课程均可优惠200元。仅限前3名学员。

优惠五、凡是购买了麦老师的OCP和高可用的课程,则均可获赠由麦老师出版的《Oracle数据库面试笔试宝典》、《数据库程序员面试笔试宝典》、《数据库程序员面试笔试真题库》和《数据库面试笔试真题与解析》中的任意一本书。若只报名一门课程,则可以报销书籍的50%费用。

 

另外,每逢法定节假日,麦老师的课程都会优惠多多的。详情请加麦老师QQ(646634621)或微信(lhrbestxh)私聊。


长按下图识别二维码或微信扫描下图二维码来关注小麦苗的微信公众号:xiaomaimiaolhr,学习最实用的数据库技术。


最后修改时间:2020-01-10 20:39:47
文章转载自DB宝,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论