Oracle数据库数据恢复、性能优化

找回密码
注册
搜索
热搜: 活动 交友 discuz
发新帖

0

积分

0

好友

14

主题
1#
发表于 2013-1-11 10:34:21 | 查看: 6011| 回复: 10
OS: AIX 5.3
DB: 10.2.0.4 RAC  

昨天检查发现查询dba_data_files表很慢不出结果,晚上手动收集了EXEC DBMS_STATS.GATHER_FIXED_OBJECTS_STATS;
不过没成功也hang在那
早上发现的问题alert日志中1节点:
  1. Current log# 9 seq# 55278 mem# 0: /dev/rlv_bst_redo3b
  2. Thu Jan 10 09:09:48 2013
  3. Thread 1 advanced to log sequence 55279 (LGWR switch)
  4.   Current log# 1 seq# 55279 mem# 0: /dev/rlv_bst_redo1a
  5. Thu Jan 10 17:20:01 2013
  6. Thread 1 advanced to log sequence 55280 (LGWR switch)
  7.   Current log# 2 seq# 55280 mem# 0: /dev/rlv_bst_redo2a
  8. Thu Jan 10 22:03:25 2013
  9. GATHER_STATS_JOB encountered errors.  Check the trace file.
  10. Thu Jan 10 22:03:25 2013
  11. Errors in file /u01/orabase/admin/bst/bdump/bst1_j004_1880162.trc:
  12. ORA-00054: resource busy and acquire with NOWAIT specified
  13. Fri Jan 11 08:47:42 2013
  14. >>> WAITED TOO LONG FOR A ROW CACHE ENQUEUE LOCK! pid=170
  15. System State dumped to trace file /u01/orabase/admin/bst/udump/bst1_ora_1925314.trc
  16. Fri Jan 11 08:47:54 2013
  17. >>> WAITED TOO LONG FOR A ROW CACHE ENQUEUE LOCK! pid=197
  18. Fri Jan 11 08:48:04 2013
  19. >>> WAITED TOO LONG FOR A ROW CACHE ENQUEUE LOCK! pid=232
复制代码
2节点:
  1.   Current log# 5 seq# 53847 mem# 0: /dev/rlv_bst_redo5a
  2. Thu Jan 10 03:21:41 2013
  3. Thread 2 advanced to log sequence 53848 (LGWR switch)
  4.   Current log# 10 seq# 53848 mem# 0: /dev/rlv_bst_redo4b
  5. Thu Jan 10 09:09:48 2013
  6. Thread 2 advanced to log sequence 53849 (LGWR switch)
  7.   Current log# 11 seq# 53849 mem# 0: /dev/rlv_bst_redo5b
  8. Thu Jan 10 19:33:08 2013
  9. Thread 2 advanced to log sequence 53850 (LGWR switch)
  10.   Current log# 12 seq# 53850 mem# 0: /dev/rlv_bst_redo6b
  11. Fri Jan 11 08:26:10 2013
  12. >>> WAITED TOO LONG FOR A ROW CACHE ENQUEUE LOCK! pid=212
  13. System State dumped to trace file /u01/orabase/admin/bst/udump/bst2_ora_1577628.trc
  14. Fri Jan 11 08:26:10 2013
  15. >>> WAITED TOO LONG FOR A ROW CACHE ENQUEUE LOCK! pid=220
  16. Fri Jan 11 08:26:10 2013
  17. >>> WAITED TOO LONG FOR A ROW CACHE ENQUEUE LOCK! pid=87
  18. Fri Jan 11 08:26:11 2013
复制代码

node2.rar

6.58 MB, 下载次数: 960

node1.rar

8.66 MB, 下载次数: 945

2#
发表于 2013-1-11 10:37:51
awk report
  1. Blockers
  2. ~~~~~~~~

  3.         Above is a list of all the processes. If they are waiting for a resource
  4.         then it will be given in square brackets. Below is a summary of the
  5.         waited upon resources, together with the holder of that resource.
  6.         Notes:
  7.         ~~~~~
  8.          o A process id of '???' implies that the holder was not found in the
  9.            systemstate.

  10.                     Resource Holder State
  11.        Latch 7000005ed7579f8    ??? Blocker
  12. Enqueue US-00000017-00000000    ??? Blocker
  13. Rcache object=7000003cd541d68,    ??? Blocker
  14. Enqueue TX-003D001E-002166BD   250: 250: is waiting for Latch 7000005ed7579f8
  15. Enqueue TX-003B0015-001504A2   318: last wait for 'gc cr request'
  16. Enqueue TX-0060002C-001BF791   148: 148: is waiting for Latch 7000005ed7579f8
  17. Enqueue TX-003F0024-003879D9   177: 177: is waiting for Latch 7000005ed7579f8
  18. Enqueue TX-005B0003-001F91AA   386: waiting for 'gc current request'

  19. Object Names
  20. ~~~~~~~~~~~~
  21. Latch 7000005ed7579f8   Child cache buffers chains   
  22. Enqueue US-00000017-00000000                                 
  23. Rcache object=7000003cd541d68,                                
  24. Enqueue TX-003D001E-002166BD                                 
  25. Enqueue TX-003B0015-001504A2                                 
  26. Enqueue TX-0060002C-001BF791                                 
  27. Enqueue TX-003F0024-003879D9                                 
  28. Enqueue TX-005B0003-001F91AA                                 
复制代码

回复 只看该作者 道具 举报

3#
发表于 2013-1-11 10:53:43

Blockers
~~~~~~~~

        Above is a list of all the processes. If they are waiting for a resource
        then it will be given in square brackets. Below is a summary of the
        waited upon resources, together with the holder of that resource.
        Notes:
        ~~~~~
         o A process id of '???' implies that the holder was not found in the
           systemstate. (The holder may have released the resource before we
           dumped the state object tree of the blocking process).
         o Lines with 'Enqueue conversion' below can be ignored *unless*
           other sessions are waiting on that resource too. For more, see
           http://dlsunuk11.uk.oracle.com/Public/TOOLS/Ass.html#enqcnv)

                    Resource Holder State
    Enq HW-00000053-00800169    18: waiting for 'DFS lock handle'
Rcache object=70000060ee0d950,   149: waiting for 'gc current request'
           Buffer 0x0e03c37a    96: waiting for 'gc current request'
           Buffer 0x2a02f24d    ??? Blocker
           Buffer 0x0f800002    18: waiting for 'DFS lock handle'
    Enq TX-003B0015-001504A2    ??? Blocker
    Enq TX-00370014-0009D402   237: waiting for 'gc current request'
           Buffer 0x13435b67   237: waiting for 'gc current request'

Blockers According to Tracefile Wait Info:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. This may not work for 64bit platforms. See bug 2902997 for details.
2. If the blocking process is shown as 0 then that session may no longer be
   present.
3. If resources are held across code layers then sometimes the tracefile wait
   info will not recognise the problem.

No blockers seen.

Object Names
~~~~~~~~~~~~
Enq HW-00000053-00800169                                      
Rcache object=70000060ee0d950,  cid=3(dc_rollback_segments)   
Buffer 0x0e03c37a                                             
Buffer 0x2a02f24d                                             
Buffer 0x0f800002                                             
Enq TX-003B0015-001504A2                                      
Enq TX-00370014-0009D402                                      
Buffer 0x13435b67                                             

Summary of Wait Events Seen (count>10)
~~~~~~~~~~~~~~~~~~~~~~~~~~~
    14 : 'rdbms ipc message'
   121 : 'SQL*Net message from client'
   188 : 'row cache lock'
    57 : 'gc buffer busy'
    11 : 'gc current request'


       
       
       
       
       
       
       
       
       
        Rcache object=70000060ee0d950,  cid=3(dc_rollback_segments)
       
       
          SO: 7000005a408b7a8, type: 50, owner: 7000005edaf6768, flag: INIT/-/-/0x00
          row cache enqueue: count=1 session=700000609773ed0 object=70000060ee0d950, request=S
          savepoint=0x59
          row cache parent object: address=70000060ee0d950 cid=3(dc_rollback_segments)
          hash=8e1019e8 typ=11 transaction=7000005e819b390 flags=0000012a
          own=70000060ee0da20[7000001160cf4f0,7000001160cf4f0] wat=70000060ee0da30[7000005a478b1a8,7000005a408ca98] mode=X
          status=VALID/UPDATE/-/-/IO/-/-/-/-
          request=N release=TRUE flags=0
          instance lock id=QD f8211c14 4289348c
          data=
          0000005d 00000053 0000003e 00000081 000a5f53 5953534d 55393324 00000000
          00000000 00000000 00000000 00000000 00020000 00000001 55b90000 000db814
          e6b004ae 0008ac50 00000002 00000001
                  
dc_rollback_segments ; US

                  
00000081 000a5f53 5953534d 55393324 00000000=>                  
_SYSSMU93$

这个row cache resource的owner 70000060ee0da20似乎已经不存在了




跑一下这个脚本:http://www.askmaclean.com/archiv ... nostic-scripts.html

回复 只看该作者 道具 举报

4#
发表于 2013-1-11 11:03:37
也跑一下这个脚本
  1. REM tablespace report


  2. set linesize 200


  3. select a.tablespace_name,
  4.        round(a.bytes_alloc / 1024 / 1024) megs_alloc,
  5.        round(nvl(b.bytes_free, 0) / 1024 / 1024) megs_free,
  6.        round((a.bytes_alloc - nvl(b.bytes_free, 0)) / 1024 / 1024) megs_used,
  7.        round((nvl(b.bytes_free, 0) / a.bytes_alloc) * 100) Pct_Free,
  8.        100 - round((nvl(b.bytes_free, 0) / a.bytes_alloc) * 100) Pct_used,
  9.        round(maxbytes / 1048576) Max
  10.   from (select f.tablespace_name,
  11.                sum(f.bytes) bytes_alloc,
  12.                sum(decode(f.autoextensible, 'YES', f.maxbytes, 'NO', f.bytes)) maxbytes
  13.           from dba_data_files f
  14.          group by tablespace_name) a,
  15.        (select f.tablespace_name, sum(f.bytes) bytes_free
  16.           from dba_free_space f
  17.          group by tablespace_name) b
  18. where a.tablespace_name = b.tablespace_name(+)
  19. union all
  20. select h.tablespace_name,
  21.        round(sum(h.bytes_free + h.bytes_used) / 1048576) megs_alloc,
  22.        round(sum((h.bytes_free + h.bytes_used) - nvl(p.bytes_used, 0)) /
  23.              1048576) megs_free,
  24.        round(sum(nvl(p.bytes_used, 0)) / 1048576) megs_used,
  25.        round((sum((h.bytes_free + h.bytes_used) - nvl(p.bytes_used, 0)) /
  26.              sum(h.bytes_used + h.bytes_free)) * 100) Pct_Free,
  27.        100 -
  28.        round((sum((h.bytes_free + h.bytes_used) - nvl(p.bytes_used, 0)) /
  29.              sum(h.bytes_used + h.bytes_free)) * 100) pct_used,
  30.        round(sum(f.maxbytes) / 1048576) max
  31.   from sys.v_$TEMP_SPACE_HEADER h,
  32.        sys.v_$Temp_extent_pool  p,
  33.        dba_temp_files           f
  34. where p.file_id(+) = h.file_id
  35.    and p.tablespace_name(+) = h.tablespace_name
  36.    and f.file_id = h.file_id
  37.    and f.tablespace_name = h.tablespace_name
  38. group by h.tablespace_name
  39. ORDER BY 1
  40. /
复制代码

回复 只看该作者 道具 举报

5#
发表于 2013-1-11 11:06:25
这个脚本也卡住了
  1. ttitle center "Undo Extents" skip 2

  2. col segment_name format a30 heading "Name"
  3. col "ACT BYTES" format 999,999,999,999 head "Active|Extents"
  4. col "UNEXP BYTES" format 999,999,999,999 head "Unxpired|Extents"
  5. col "EXP BYTES" format 999,999,999,999 head "Expired|Extents"

  6. select segment_name,
  7. nvl(sum(act),0) "ACT BYTES",
  8. nvl(sum(unexp),0) "UNEXP BYTES",
  9. nvl(sum(exp),0) "EXP BYTES"
  10. from (
  11.   select segment_name,
  12.          nvl(sum(bytes),0) act,00 unexp, 00 exp
  13.     from DBA_UNDO_EXTENTS
  14.    where status='ACTIVE' group by segment_name
  15.   union
  16.   select segment_name,
  17.          00 act, nvl(sum(bytes),0) unexp, 00 exp
  18.     from DBA_UNDO_EXTENTS
  19.    where status='UNEXPIRED' group by segment_name
  20.   union
  21.   select segment_name,
  22.          00 act, 00 unexp, nvl(sum(bytes),0) exp
复制代码

回复 只看该作者 道具 举报

6#
发表于 2013-1-11 12:43:00
Maclean Liu(刘相兵 发表于 2013-1-11 11:03
也跑一下这个脚本

查看1节点的redo全部为active状态添加新的logfile仍旧为active,似乎lgwr死掉了

回复 只看该作者 道具 举报

7#
发表于 2013-1-11 13:53:22
fluttersnow 发表于 2013-1-11 12:43
查看1节点的redo全部为active状态添加新的logfile仍旧为active,似乎lgwr死掉了


alter system checkpoint;
1.
怀疑是 某个进程持有dc_rollback_segment =>_SYSSMU93$ 后dead , row cache resource 未被清理

2. 短期内有大量事务,但是undo 空间不够,引起较多的rollback 争用

3.bug

建议你先KILL server process


ps -ef|grep LOCAL=NO|grep -v grep | awk '{print $2}' | xargs kill -9

最好有AWR 参考,以及上面的脚本结果

回复 只看该作者 道具 举报

8#
发表于 2013-1-12 21:33:06
本帖最后由 fluttersnow 于 2013-1-12 21:36 编辑
Maclean Liu(刘相兵 发表于 2013-1-11 13:53
alter system checkpoint;
1.
怀疑是 某个进程持有dc_rollback_segment =>_SYSSMU93$ 后dead , row cach ...


kill 2个节点所有连接以后,在1节点还是产生 “ROW CACHE ENQUEUE LOCK” 而且1节点用户无法登陆,再次检查其他trc,发现holding似乎是个j001进程,而且几个trc文件都又找到这个holding
  1. PROCESS 318:
  2.   ----------------------------------------
  3.   SO: 700000605389218, type: 2, owner: 0, flag: INIT/-/-/0x00
  4.   (process) Oracle pid=318, calls cur/top: 7000005dab89db8/70000031505d2c8, flag: (0) -
  5.             int error: 0, call error: 0, sess error: 0, txn error 0
  6.   (post info) last post received: 0 0 136
  7.               last post received-location: kclrcvt
  8.               last process to post me: 700000605373798 1 6
  9.               last post sent: 0 0 123
  10.               last post sent-location: kcrfw_redo_gen: wake LGWR after redo copy
  11.               last process posted by me: 7000006033a1c88 1 6
  12.     (latch info) wait_event=0 bits=2
  13.       holding    (efd=55) 7000005ed7579f8 Child cache buffers chains level=1 child#=105349
  14.         Location from where latch is held: kcbgtcr: kslbegin excl:
  15.         Context saved from call: 1015236325
  16.         state=busy(exclusive) (val=0x200000000000013e) holder orapid = 318
  17.           waiters [orapid (seconds since: put on list, posted, alive check)]:
  18.            319 (107033, 1357866339, 1)
  19.            21 (99663, 1357866339, 1)
  20.            177 (87863, 1357866339, 1)
  21.            206 (87214, 1357866339, 1)
  22.            203 (86635, 1357866339, 1)
  23.            250 (85992, 1357866339, 1)
  24.            190 (83029, 1357866339, 1)
  25.            182 (79437, 1357866339, 1)
  26.            166 (75837, 1357866339, 1)
  27.            261 (74970, 1357866339, 1)
  28.            276 (74949, 1357866339, 1)
  29.            257 (74901, 1357866339, 1)
  30.            290 (74878, 1357866339, 1)
  31.            179 (73446, 1357866339, 1)
  32.            194 (72235, 1357866339, 1)
  33.            159 (68636, 1357866339, 1)
  34.            151 (65694, 1357866339, 1)
  35.            229 (65041, 1357866339, 1)
  36.            148 (64555, 1357866339, 1)
  37.            343 (61440, 1357866339, 1)
  38.            277 (58257, 1357866339, 1)
  39.            360 (57837, 1357866339, 1)
  40.            345 (54223, 1357866339, 1)
  41.            362 (50641, 1357866339, 1)
  42.            193 (47035, 1357866339, 1)
  43.            223 (43444, 1357866339, 1)
  44.            363 (40495, 1357866339, 1)
  45.            99 (39832, 1357866339, 1)
  46.            184 (39789, 1357866339, 1)
  47.            446 (36234, 1357866339, 1)
  48.            10 (35589, 1357866339, 1)
  49.            207 (21845, 1357866339, 1)
  50.            233 (18256, 1357866339, 1)
  51.            279 (14656, 1357866339, 0)
  52.            334 (11044, 1357866339, 1)
  53.            195 (7438, 1357866339, 1)
  54.            604 (178, 1357866339, 1)
  55.            waiter count=37
  56.     Process Group: DEFAULT, pseudo proc: 7000006073efb90
  57.     O/S info: user: oracle, term: UNKNOWN, ospid: 2130496
  58.     OSD pid info: Unix process pid: 2130496, image: oracle@oltp1 (J001)
复制代码
查看发现此进程所运行的sql为大量的update操作
(此处有个疑问:j00x进程是job的进程,而这些操作都是一个triger引发的,为什么也在job进程中运行?)

手动kill 这个j001进程,redo file 状态开始改变为inactive,日志可以正常切换。用户也可以正常连接了,dba_data_files也可以正常查询了,昨天弄了一上午总算是解决了。

这里有个疑问:
对于这种故障,为了快速恢复数据库服务,是否可以直接在trc文件中查找holding关键字找到block的进程?这样是否准确,还是说这次只是碰巧找到?

回复 只看该作者 道具 举报

9#
发表于 2013-1-12 23:04:17
如果能找到 blocker那么是最好也是最简单的 解决方法, 甚至于oracle会自动去request KILL BLOCKER,前提是blocker不是后台关键进程。

但是大多数情况是 一个resource 确实被hold住了,但是holder在哪里都找不到,或者干脆早被KILL了, 这种情况下  一般考虑 先收集 systemstate dump 后期配合其他数据 一起分析原因 , 对应bug或者其他解决方案。 之后KILL server process 、或者rebounce instance 恢复数据库可用

回复 只看该作者 道具 举报

10#
发表于 2013-1-13 20:42:43
Maclean Liu(刘相兵 发表于 2013-1-12 23:04
如果能找到 blocker那么是最好也是最简单的 解决方法, 甚至于oracle会自动去request KILL BLOCKER,前提是 ...

谢谢回复,ML还有个问题:
找到的这个j001进程,根据spid查到正在运行都是update操作,根据这些语句发现是一个triger引发的,为什么会在job的进程中执行?

回复 只看该作者 道具 举报

11#
发表于 2013-1-21 15:20:02
fluttersnow 发表于 2013-1-13 20:42
谢谢回复,ML还有个问题:
找到的这个j001进程,根据spid查到正在运行都是update操作,根据这些语句发现是 ...

自己回复下,原来概念搞错了,j00进程是cjq0的slave进程,只要与job有关的sql都会在这个session中记录。
经查询这个job在执行一个pacage中会对表A做更新,然当更新时又会触发这个triger做对B表的update,故一起被记录在session的sql中。

回复 只看该作者 道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|Archiver|Oracle数据库数据恢复、性能优化

GMT+8, 2024-12-26 13:54 , Processed in 0.052045 second(s), 23 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部
TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569