合 恢复DG环境中由于主库nologging操作导致的坏块
简介
众所周知我们的Data Guard数据同步是基于日志流的。所以在主库执行nologging操作是不被允许的。这也就是为什么我们需要在配置Data Guard阶段需要使用Force Logging。但是这也会带来很多问题(SQL执行效率),例如:当我们使用数据泵进行迁移时我们希望最少停机时间完成,这时候我们就可能会考虑到以最小日志导入的方式以加快导入速度,然后重新同步备库。
在一些场景中,我们会去使用nologging操作去节省大量数据插入的时间,而这种操作所带来的问题就是,如果该库在有备库的情况下,因为主库的nologging插入操作不会生成redo,所以不会在备库上传输和应用,这会导致备库的数据出现问题。
11g恢复
在Oracle 11g,如果遇到这样的问题,可以通过在备库恢复有问题的数据文件来解决问题,示例如下:
在一个具有主备关系的主库上将force_logging设置为nologging模式,随后创建一张表,设置为nologging模式
1 2 3 | SQL> alter database no force logging; SQL> create table DEMO tablespace users pctfree 99 as select rownum n from xmltable('1 to 1000'); SQL> alter table DEMO nologging; |
之后使用/ +append/插入数据并提交
1 2 | SQL> insert /*+ append */ into DEMO select rownum n from xmltable('1 to 100000'); SQL> commit |
这时候在备库对该表进行查询会看到如下报错信息
1 2 3 4 5 6 7 | SQL>select count(1) from demo; select count(1) from demo * ERROR at line 1: ORA-01578: ORACLE data block corrupted (file # 4, block # 819) ORA-01110: data file 4: '/data/data1/ORCL2/datafile/o1_mf_users_3ft1e9qb_.dbf' ORA-26040: Data block was loaded using the NOLOGGING option |
而要修复这个问题,需要将包含缺少的数据的数据文件从主库复制到物理备库。
步骤一
1、查询主库