由于主库NOLOGGING操作引起的备库ORA-01578和ORA-26040错误

在文章开头本人说下结吧:

本文实验环境:11.2 。为了避免 备库ORA-01578和ORA-26040错误,主备 一定要开启 force logging

针对这些 nonlogged 的块,在 12c 以前的版本中,在 v$datafile 中的 FIRST_NONLOGGED_SCN (备库)  字段记录了相关信息,

从12c 开始,使用 v$nonlogged_block (备库)记录相关信息

实验 一:数据库开启 force_logging ,这种情况即使语句中指定了 nologging 的参数,也不会生效 ,会被 database 级别 force logging 覆盖

SQL> select force_logging from v$database;

FORCE_
------
YES

主库执行 :

SQL>  create table bin nologging as select * from hlb;

Table created.

备库查询:

SQL> select * from bin;

        ID
----------
         1
         1
         2
         3

 

实验 二:数据库关闭 force_logging,这种情况假如语句中指定了 nologging 参数,将导致备库 ORA-01578和ORA-26040错误,该错误具体如何处理 ,在本文中暂时不讨论了(这种方法在19c中不能造成备库逻辑坏块)

SQL> select FORCE_LOGGING   from v$database;

FORCE_
------
NO

主库执行:

SQL> create table liang nologging as select * from hlb;

Table created.

备库查询:

SQL> select * from liang; 
select * from liang
              *
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 1, block # 86281)
ORA-01110: data file 1: '/export/11g/oradata/orcl/system01.dbf'
ORA-26040: Data block was loaded using the NOLOGGING option

实验三:19C 中制造备库 nologging 逻辑坏块, 使用:

impdp \'/ as sysdba\' full=y dumpfile=liang.dmp TRANSFORM=DISABLE_ARCHIVE_LOGGING:Y

从12.2 以后,修复这种备库的坏块非常简便:

DBA可以从备库的V$NONLOGGED_BLOCK这个视图查看到相关信息。不需要发送主库的整个数据文件,而是在RMAN执行一个简单的命令来恢复它们:

首先,在备库停止实时日志应用:

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

备库登陆RMAN执行:

RECOVER DATABASE NONLOGGED BLOCK;

RMAN> recover database nonlogged block;

Starting recover at 06-JUN-21
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=32 device type=DISK

starting recovery of nonlogged blocks
List of Datafiles
=================
File Status Nonlogged Blocks Blocks Examined Blocks Skipped
---- ------ ---------------- --------------- --------------
1    OK     0                0               136959        
2    OK     0                0               84479         
3    OK     0                0               111999        
4    OK     0                1               31358         

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

recovery of nonlogged blocks complete, elapsed time: 00:02:12

Finished recover at 06-JUN-21

RMAN> select count(*) from V$NONLOGGED_BLOCK;

  COUNT(*)
----------
         0

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

huangliang0703

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值