下面我们来看一下trace文件中Current Wait Stack部分类容 ? ? ? ? ? ? ? ?
Current Wait Stack:
? ? ? ? ? ? ? ? ? ? ? ? Not in wait; last wait ended 58 min 27 sec ago ?<<<<====一个新的会话需要独占FU enqueue,获取失败,发现FU enqueue已经被另一个会话持有(在not in wait状态下持有超过58分钟),并且另一个会话整出not in wait状态,所以最后持有FU enqueue的会话被Hang Manager杀掉。
? ? ? ? ? ? ? ? ? ? ? There are 1 sessions blocked by this session.
? ? ? ? ? ? ? ? ? ? ? Dumping one waiter:
? ? ? ? ? ? ? ? ? ? ? ? inst: 1, sid: 1444, ser: 7855
? ? ? ? ? ? ? ? ? ? ? ? wait event: 'enq: FU - contention'
? ? ? ? ? ? ? ? ? ? ? ? ? p1: 'name|mode'=0x46550006
? ? ? ? ? ? ? ? ? ? ? ? ? p2: '0'=0x0
? ? ? ? ? ? ? ? ? ? ? ? ? p3: '0'=0x0
? ? ? ? ? ? ? ? ? ? ? ? row_wait_obj#: 4294967295, block#: 0, row#: 0, file# 0
? ? ? ? ? ? ? ? ? ? ? ? min_blocked_time: 534 secs, waiter_cache_ver: 31914
? ? ? ? ? ? ? ? ? ? ? Wait State:
? ? ? ? ? ? ? ? ? ? ? ? fixed_waits=0 flags=0x20 boundary=0x0/-1
? ? ? ? ? ? ? ? ? ? ? Session Wait History:
? ? ? ? ? ? ? ? ? ? ? ? ? elapsed time of 58 min 27 sec since last wait
? ? ? ? ? ? ? ? ? ? ? ?0: waited for 'latch free'
? ? ? ? ? ? ? ? ? ? ? ? ? address=0x7000000000356a0, number=0x13c, tries=0x0
? ? ? ? ? ? ? ? ? ? ? ? ? wait_id=12785 seq_num=20683 snap_id=1
? ? ? ? ? ? ? ? ? ? ? ? ? wait times: snap=0.001418 sec, exc=0.001418 sec, total=0.001418 sec
? ? ? ? ? ? ? ? ? ? ? ? ? wait times: max=infinite
? ? ? ? ? ? ? ? ? ? ? ? ? wait counts: calls=0 os=0
? ? ? ? ? ? ? ? ? ? ? ? ? occurred after 0.001614 sec of elapsed time
? ? ? ? ? ? ? ? ? ? ? ?1: waited for 'control file sequential read'
? ? ? ? ? ? ? ? ? ? ? ? ? file#=0x0, block#=0x1a, blocks=0x1
? ? ? ? ? ? ? ? ? ? ? ? ? wait_id=12784 seq_num=20682 snap_id=1
? ? ? ? ? ? ? ? ? ? ? ? ? wait times: snap=0.000258 sec, exc=0.000258 sec, total=0.000258 sec
? ? ? ? ? ? ? ? ? ? ? ? ? wait times: max=infinite
? ? ? ? ? ? ? ? ? ? ? ? ? wait counts: calls=0 os=0
? ? ? ? ? ? ? ? ? ? ? ? ? occurred after 0.000016 sec of elapsed time
三:错误原因及解决方法
要处理这个问题我们需要先了解一下 oracle 11g 新特性―hang 管理器(Hang Manager),关于Hang Manager详细内容可以参考我的另一篇博客
http://blog.csdn.net/shaochenshuo/article/details/41845079(取自MOS)。
看完Hang Manager,结合上面alert日志及trace的分析我们知道报错的原因是FU enqueue的争用。但是为什么会产生FU enqueue的争用呢,为什么导致阻塞的会话会保持FU enqueue 58分钟这么久的时间?
我试着在执行手动执行SELECT MAX(TOTAL_MB), MIN(TOTAL_MB), SUM(TOTAL_MB), COUNT(*) FROM V$ASM_DISKGROUP;语句,发现语句一直处于Hang着不动,等了几十分钟都没有结果。接着有试着查看了asm_disk,也是被HANG住。这就难怪数据库会报ORA-32701错误了,数据库MMON的子进程在搜集磁盘组的使用信息时,被HANG住(推测这个信息可能是每隔一个小时会收集一次,因为这个报错大概一个小时会发生一次。当下次收集任务开始时,发现FU enqueue还在被上一个任务持有,然后通过Hang Manager杀掉了上一个会话,如此往复)。
那么问题又来了,为什么访问与磁盘信息有关的视图会Hang住呢?
MOS上找到一遍NOTE貌似跟我们报错一样,'enq: FU - contention' and ORA-32701 Warning Seen in Alert Log (Doc ID 1464844.1)。这个上面说可能是因为统计信息有问题,导致查询Hang,但是数据库fixed objects统计信息是没有问题的。
没有办法提了SR,但是一个多月过去了,oracle也没查出问题原因。看来还是只能靠自己啊,根据经验asm_diskstring异常经常会导致查询磁盘相关视图慢,我们的数据库该参数是空的(正常情况下是没有问题的,该参数不设置,ASM也会根据操作系统不同到相关目录下去扫描磁盘)。所以我猜测这个问题有可能是该参数引起的。根据猜测准备重置该参数alter system set asm_diskstring='' scope=both;发现该语句也被hang住。最后重启实例,实例重启后数据库不再报ORA-32701,disk相关视图也能正常查询。