dg的奇怪问题终结和分区问题答疑 (r7笔记第77天)

时间:2022-05-04
本文章向大家介绍dg的奇怪问题终结和分区问题答疑 (r7笔记第77天),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

今天来说几个问题,一个是对昨天《让我焦灼的四个问题》的升华,不能起博眼球的题目,技术分析给大家兜底了,你们看看有没有类似的问题。 还有几个小问题说说今天的感受和网友的问题解答。 首先是让我焦灼的dataguard问题,说起来惭愧,一个dataguard搞了很多天,不是搭建麻烦,是中间碰到了不少的坑和问题,当然自己能够说服 自己是第一步,虽然最后找到一个bug来对这个问题终结,但是还有一个疑点一直没让我释怀,就是主库redhat 6.3+ASM,备库redhat 5.3+FS,其实这个组合虽然看起来有些牵强,但是搭建备库从技术设计上看起来还是能够实现的,本来11g已经开始部分支持异构平台的dg了,跨操作系 统版本应该还是可以的,但是这套环境就是不行,当然最后又一个redhat 5和bmr相关的一个bug,但是说服不了自己的是这个环境之前也有一套灾备环境,从以前的历史日志来看,是没有问题的,所以一直没想明白到底了哪里出了 问题。当时临时把备库建在了一台备机上,这台机器就留下来琢磨了好几天,也是运气好,本来昨天就pxe格式化成6.3版本了,昨天的文章中亦远邦给了我私 信回复,当然他的分析真是一针见血,让我竖大拇指的地方就是我文章里没有提供的信息他也猜到了,他说可能和一个参数 filesystemmio_options可能有关,如果在ext4上,那么就是一个os级的kernel bug了。因为我的文章中从来没有提及这个参数,一直在从数据库层面进行分析,当他一提到这个参数,我是有种顿悟的感觉,所以一宿都在做梦忙着修复这个问 题,真是累啊。 当然我们早上也进行了进一步沟通,向他学了不少干货,首先这个问题在mos上可以搜到,不过搜索的关键字是zero ext4可以找到对应的bug,文章为: ORA-1578 ORA-353 ORA-19599 Corrupt blocks with zeros when filesystemio_options=SETALL on ext4 file system using Linux (Doc ID 1487957.1) 所以这样一来对于这个问题总算有了结论,我之前的疑虑终于消除了,对于异步IO的这个问题,在kernel版本中(目前我的是在 2.6.18-194.el5)开启会有一些问题,也不是说redhat 6就一定没有问题,而是需要在对应的基线内核版本范围之内,从oracle的建议来看,要不设置为none,要不开directIO,要不开 async_IO,不能setall 当然还聊了不少,理论的铺垫已经有了,自己还是实践一下,实践也略微有些曲折,是因为我竟然又碰到了好几个小问题,有些在mos上还查到是bug,如果在备库环境设置filesystemmio_optinos为none之后,重启数据库,会报出下面的错误。


alert_testbi.log
ORA-17629: Cannot connect to the remote database server
ORA-17627: ORA-01017: invalid username/password; logon denied
ORA-17629: Cannot connect to the remote database server
ORA-17627: ORA-01017: invalid username/password; logon denied
ORA-17629: Cannot connect to the remote database server
ORA-17627: ORA-01017: invalid username/password; logon denied
ORA-17629: Canno
Wed Jan 13 09:55:18 2016
Recovery interrupted!
Hex dump of (file 9, block 1048240) in trace file /home/U01/app/oracle/diag/rdbms/s2testbi/testbi/trace/testbi_pr00_15736.trc
Corrupt block relative dba: 0x024ffeb0 (file 9, block 1048240)
Completely zero block found during in-flux buffer recovery
Reading datafile  '/home/U01/app/oracle/oradata/testbi/datafile/mbi_data.274.899314747'  for corruption at rdba: 0x024ffeb0 (file 9, block 1048240)
Reread (file 9, block 1048240) found same corrupt data (no logical check)
Hex dump of (file 9, block 1048241) in trace file /home/U01/app/oracle/diag/rdbms/s2testbi/testbi/trace/testbi_pr00_15736.trc
。。。
Reading datafile  '/home/U01/app/oracle/oradata/testbi/datafile/mbi_data.274.899314747'  for corruption at rdba: 0x024ffe9f (file 9, block 1048223)
Reread (file 9, block 1048223) found same corrupt data (no logical check)
Incomplete read from log member  '/home/U01/app/oracle/fast_recovery_area/S2testBI/archivelog/2016_01_11/o1_mf_1_450_c96vv7d1_.arc'.  Trying next member.
Recovered data files to a consistent state at change 414943405
Wed Jan 13 09:55:18 2016
Recovery Slave PR0C previously exited with exception 17627
MRP0: Background Media Recovery process shutdown (testbi)
Wed Jan 13 10:08:32 2016

MRP会先启动,然后在一大堆错误之后默默down掉。
尝试了坏块修复,发现ASM归档格式的映射和文件系统的映射存在一些问题。
All non-current ORLs have been archived.
Media Recovery Log /home/U01/app/oracle/fast_recovery_area/S2TESTBI/archivelog/2016_01_11/o1_mf_1_450_c96vklfq_.arc
Error opening /home/U01/app/oracle/fast_recovery_area/S2TESTBI/archivelog/2016_01_11/o1_mf_1_450_c96vklfq_.arc
Attempting refetch
MRP0: Background Media Recovery terminated with error 308
Errors in file /home/U01/app/oracle/diag/rdbms/s2testbi/testbi/trace/cyoubi_pr00_16345.trc:
ORA-00308: cannot open archived log  '/home/U01/app/oracle/fast_recovery_area/S2TESTBI/archivelog/2016_01_11/o1_mf_1_450_c96vklfq_.arc'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
Recovery interrupted!
但是实际上归档在主库也是存在,在备库也有序列号为450的归档,但是归档格式不同。
主库为ASM,归档格式为:
ASMCMD> ls -lt
Type        Redund  Striped  Time             Sys  Name
ARCHIVELOG  UNPROT  COARSE   JAN 12 10:00:00  Y    thread_1_seq_463.2224.900889823
..
ARCHIVELOG  UNPROT  COARSE   JAN 11 17:00:00  Y    thread_1_seq_450.2844.900866813
备库为文件系统,归档格式为:
$ ll /home/U01/app/oracle/fast_recovery_area/S2CYOUBI/archivelog/2016_01_11
total 349724
-rw-r----- 1 oracle oinstall 117709312 Jan 11 16:56 o1_mf_1_449_c96vkfv9_.arc
-rw-r----- 1 oracle oinstall  57289728 Jan 11 17:01 o1_mf_1_450_c96vv7d1_.arc
-rw-r----- 1 oracle oinstall  19244544 Jan 11 16:56 o1_mf_1_451_c96vkgbj_.arc
这个格式映射出现问题,当然手工改归档名肯定是不可以的,因为头部校验就会出错。
而且更为关键的是其实备库的序列号已经很新了。已经远远超过了450
SQL> select sequence#,status from v$log;
 SEQUENCE# STATUS
---------- --------------------------------
       502 CLEARING
       501 CLEARING
       503 CURRENT
这个找到一篇文章  Oracle Alert Log Is Reporting Archive Log Status Is Not  Available For Logs That Have Long Been Backed Up (Doc ID 1161573.1)
实际上如果观察前面的日志仔细,会发现刚好删除了450的归档。
Deleted Oracle managed file /home/U01/app/oracle/fast_recovery_area/S2TESTBI/archivelog/2016_01_11/o1_mf_1_450_c96vklfq_.arc
其实闪回区的使用率也就20%左右,离80%还远。
最后果断重新duplicate,当然花了几十分钟搞定。然后就没有看到任何的错误。看到下面的信息终于踏实了。
Wed Jan 13 13:05:49 2016
Media Recovery Log /home/U01/app/oracle/fast_recovery_area/S2testBI/archivelog/2016_01_13/o1_mf_1_508_c9cprvo5_.arc
Media Recovery Waiting for thread 1 sequence 509 (in transit)
Recovery of Online Redo Log: Thread 1 Group 4 Seq 509 Reading mem 0
  Mem# 0: /home/U01/app/oracle/oradata/testbi/onlinelog/group_4.302.899840531
  Mem# 1: /home/U01/app/oracle/fast_recovery_area/testbi/onlinelog/group_4.799.899840531
当然稍后还是要把它pxe格式化掉,改为6.3以上的版本。发现问题不作为感觉是在作假。也算给自己一个验证的机会吧,最后再次感谢远邦,中亦科技的小y,给予的无私帮助。
终于让我从苦海中脱离出来了,当然后面还有其它的苦海。:)

问题答疑
还有个问题是最近还有几个网友在问我。
1)如果需要在非分区列上创建唯一索引呢?只能全局吧?
2)怎么在非分区建上建立通过约束建立本地唯一索引 并不是在分区键或者带着分区键 比如我的分区键是时间列range分 但我要按照ID列来建本地唯一索引 怎么办?
其实对于这个问题,可以做个小实验。创建一个分区表。为了日期格式简单,我用Number代替。
create table test (id number,name varchar2(30),rdate number)
partition by range( rdate)
(
partition p1 values less than(2014),
partition p2 values less than(2015),
partition p3 values less than(2016)
);

创建本地唯一索引
SQL> create unique index ind_test_id_uq on test(id) local;
create unique index ind_test_id_uq on test(id) local
                                      *
ERROR at line 1:
ORA-14039: partitioning columns must form a subset of key columns of a UNIQUE index
这个时候这个错误也是合理的,如果已经做了唯一性判断,那还要分区的rdate有什么用呢。
可以根据你的需要创建prefix local index或者组合索引都可以。
比如。
SQL> create unique index ind_test_id_uq on test(rdate,id) local;
Index created.
再次基础上创建约束即可。
SQL> alter table test add constraint con_test_id_uq unique(rdate,id);
Table altered.
这个地方可以思考一下,如果单纯在id上建唯一性索引,这个分区的简直rdate就没什么用了,做本地索引就没有了分区的基准。