oracle出现latch: undo global data 等待问题解决办法

前几日有11.2.0.3套库出现了性能问题,这里简单记录, 当时只是表现几个会话的同一条INSERT SQL语句出现了较高的latch: undo global data 等待,latch miss是 ktudba: KSLBEGIN ,同时还有BBS 等待。

SQL> @snapper ash 5 1 all
Sampling SID all with interval 5 seconds, taking 1 snapshots...
-- Session Snapper v4.22 - by Tanel Poder ( http://blog.tanelpoder.com/snapper ) - Enjoy the Most Advanced Oracle Troubleshooting Script on the Planet! :)
---------------------------------------------------------------------------------------------------------------
  ActSes   %Thread | INST | SQL_ID          | SQL_CHILD | EVENT                               | WAIT_CLASS
---------------------------------------------------------------------------------------------------------------
   44.00   (4400%) |    1 | 4rwaxk5gtg1t7   | 2         | latch: undo global data             | Other
   38.60   (3860%) |    1 | 4rwaxk5gtg1t7   | 0         | latch: undo global data             | Other
   14.00   (1400%) |    1 | 4rwaxk5gtg1t7   | 2         | buffer busy waits                   | Concurrency
   12.40   (1240%) |    1 | 4rwaxk5gtg1t7   | 0         | buffer busy waits                   | Concurrency
    6.00    (600%) |    1 | 4rwaxk5gtg1t7   | 2         | ON CPU                              | ON CPU
    5.60    (560%) |    1 | 4dxyn82n0zspx   | 0         | ON CPU                              | ON CPU
    4.80    (480%) |    1 | 4rwaxk5gtg1t7   | 0         | ON CPU                              | ON CPU
    3.40    (340%) |    1 | 4dxyn82n0zspx   | 0         | latch: cache buffers chains         | Concurrency
    3.20    (320%) |    1 |                 |           | ON CPU                              | ON CPU
    1.40    (140%) |    1 |                 |           | log file sync                       | Commit

--  End of ASH snap 1, end=2016-06-28 10:14:13, seconds=6, samples_taken=5, AAS=177.6

SQL> @sqlid 4rwaxk5gtg1t7 %
Show SQL text, child cursors and execution stats for SQLID 4rwaxk5gtg1t7 child %

HASH_VALUE PLAN_HASH_VALUE  CH# SQL_TEXT
---------- --------------- ---- ----------------------------------------------------------------------------
1603766055               0    0 INSERT INTO T  (REGION,  TELNUM,  ...... UDPTYPE) VALUES  ( :REGION,  :TELNUM,  .... :UDPTYPE)

 CH# PARENT_HANDLE    OBJECT_HANDLE     PLAN_HASH     PARSES   H_PARSES EXECUTIONS    FETCHES ROWS_PROCESSED ROWS_PER_FETCH    CPU_SEC CPU_SEC_EXEC    ELA_SEC       LIOS       PIOS      SORTS USERS_EXECUTING
---- ---------------- ---------------- ---------- ---------- ---------- ---------- ---------- -------------- -------------- ---------- ------------ ---------- ---------- ---------- ---------- ---------------
   0 C0000014D7859A70 C0000014D786C268          0         58         26      12772          0          12772                      9.32   .000729721  28.339461     246717       4523          0               0
TIP:
这里使用了Poder的脚本, 从AWR当时也是latch: undo global data 为数据库TOP 1 wait event, 查看了该语句就是一个insert values 简单语句,执行频率从AWR 得到的是半小时27000次,执行速度还可以,但是为什么会这么多的latch undo 呢?

LATCH: UNDO GLOBAL DATA

This latch serializes the access to the Undo (aka Rollback) segment information in the SGA.
Every time a session wants to know about the state of the Undo Segments, it has to get this latch.

该事件确认是与undo 相关,通常会伴有enq: US – contention 或 latch undo 的location是ktusm_stealext_2或ktusm_stealext: KSLBEGIN,对于stealext是因查找可用的segment 未发现offline 或过期的从未过期的窃取空间的调用, 那样增加UNDO表空间就可以得到缓解。
下面确认当时的情况是不是这种现象。

SQL> select * from v$latch_misses where SLEEP_COUNT>0 and  parent_name like 'undo global data%' order by sleep_count;
 
PARENT_NAME            WHERE                    NWFAIL_COUNT SLEEP_COUNT WTR_SLP_COUNT LONGHOLD_COUNT LOCATION             
---------------------- ------------------------ ------------ ----------- ------------- -------------- ----------------------
undo global data       kturar: KSLBEGIN                    0           1            11              0 kturar: KSLBEGIN     
undo global data       ktugnb: KSLBEGIN                    0           1             4              0 ktugnb: KSLBEGIN     
undo global data       ktusmasp: ktugd_tuux                0           3            28              0 ktusmasp: ktugd_tuux 
undo global data       kturdc: KSLBEGIN                    0           3             0              0 kturdc: KSLBEGIN     
undo global data       ktur set recov bit                  0           4            26              0 ktur set recov bit   
undo global data       ktusmofxu_1: kslgetl                0           8             0              0 ktusmofxu_1: kslgetl 
undo global data       ktuswr_3                            0          36             4              0 ktuswr_3             
undo global data       ktudax:child                        0          36            16              0 ktudax:child         
undo global data       ktubnd:child                        0         106           108              0 ktubnd:child         
undo global data       ktufrbs_2                           0         571          1292              0 ktufrbs_2            
undo global data       ktudnx:child                        0        1125          1044              0 ktudnx:child         
undo global data       ktucof: at start                    0        2003             0              0 ktucof: at start     
undo global data       ktusmupst: KSLBEGIN                 0        2118          9203              0 ktusmupst: KSLBEGIN  
undo global data       kturax                              0        5107             0              0 kturax               
undo global data       ktudba: KSLBEGIN                    0    43637217      43636922              0 ktudba: KSLBEGIN     
NOTE:
这里latch: undo global data 的location是ktudba: KSLBEGIN 和上面所说的情况不太一致, 后来我也尝试增加了一些UNDO 结果一样问题没有什么缓解。 要先搞明白ktudba: KSLBEGIN是什么?
KSLBEGIN 是一种get latch时的非常快的宏,在取得latch后调用KSLEND;
ktudba 像是一种从usn 转换data block address的宏
@ Latch Miss Sources
@ ——————
@ undo global data ktudba: KSLBEGIN 0 117,271,003 115,396,045
@ .
@ .
@ ktu.h:
@ ——
@ #define ktudba(usn, dbap, scnp, arspp) \
@ ktuGetUsegDba((usn), (dbap), (scnp), (arspp), \
@ NULLP(ub2), NULLP(ksqn), NULLP(uword))
@ .
@ ktuGetUsegDba – Kernel Transaction Undo convert from usn to DBA

检查当时的数据库参数

SQL> @p undo

NAME                                     VALUE
---------------------------------------- ----------------------------------------
_lm_spare_undo                           0
_flush_undo_after_tx_recovery            TRUE
_gc_undo_affinity                        FALSE
_gc_undo_block_disk_reads                TRUE
_gc_tsn_undo_affinity                    TRUE
_undo_block_compression                  TRUE
undo_management                          AUTO
undo_tablespace                          undotbs1
_collect_undo_stats                      TRUE
_undo_debug_mode                         0
_verify_undo_quota                       FALSE
_in_memory_undo                          TRUE         <<<<<<<<<<<<<<<
_undo_autotune                           FALSE        <<<<<<<<<<<<<<<
_highthreshold_undoretention             4294967294   <<<<<<<<<<<<<<<
undo_retention                           7200         <<<<<<<<<<<<<<<
_undo_debug_usage                        0
_disable_undo_tablespace_alerts          FALSE
_smon_undo_seg_rescan_limit              10
_optimizer_undo_cost_change              11.2.0.3
_optimizer_undo_changes                  FALSE
_enable_default_undo_threshold           TRUE

Note:
As the “_undo_autotune” instance parameter is set to FALSE, the undo retention is not automatically calculated based on the instance activity
UNDO 问题通常在_undo_autotune= false 和_highthreshold_undoretention value large时问题会较明显, 下面检查undo segment的使用情况.

SQL> col status format a20
SQL> col cnt format 999,999,999 head "How Many?"
SQL>
SQL> select status, count(*) cnt from dba_rollback_segs
  2  group by status
  3  /

STATUS                  How Many?
-------------------- ------------
OFFLINE                     2,053
ONLINE                      1,126

SQL> select tablespace_name,status,sum(bytes)/1024/1024 mb from DBA_UNDO_EXTENTS group by tablespace_name,status;
TABLESPACE_NAME                STATUS                       MB
------------------------------ -------------------- ----------
UNDOTBS1                       ACTIVE                34585.125   <<<<<<<<<<<<<<
UNDOTBS1                       EXPIRED                13843.75
UNDOTBS1                       UNEXPIRED             12030.375
UNDOTBS2                       ACTIVE                  72.5625
UNDOTBS2                       EXPIRED                 3000.25
UNDOTBS2                       UNEXPIRED             7369.5625

SQL> @a
A-Script: Display active sessions...

  COUNT(*) SQL_ID        STATE   EVENT
---------- ------------- ------- ----------------------------------------------------------------
        63 4rwaxk5gtg1t7 WAITING latch: undo global data     <<<<<<<<<<<<
        14 4rwaxk5gtg1t7 ON CPU  On CPU / runqueue
        13 4rwaxk5gtg1t7 WAITING buffer busy waits
        12 4dxyn82n0zspx WAITING latch: cache buffers chains
         7 4dxyn82n0zspx ON CPU  On CPU / runqueue
         2 0cgk3a3kjpg8m WAITING db file sequential read
         2 5upb68p4xd0h4 WAITING SQL*Net message from dblink
         1 4rwaxk5gtg1t7 WAITING latch: cache buffers chains
         1 5dt8ha6p0uuc4 WAITING read by other session
        
Note:
当时的actve undo seg 使用30多G引起注意,这里oltp类型库,平时都是些小事务,当时的业务量也不高, 查询undo是被哪个用了

SQL>select b.sid,--会话编号 
       b.SERIAL#, 
       b.USERNAME, 
       b.MACHINE, 
       b.sql_id, 
       a.START_TIME,--事务启动时间 
       a.USED_UBLK, --使用的UNDO块数 
       a.USED_UREC, --使用的UNDO记录条数
       a.START_UBAFIL, --使用的UNDO文件号 
       a.START_UBABLK --使用的UNDO起始块号 
  from v$transaction a, v$session b 
 where a.ses_addr = b.saddr;

   SID    SERIAL# USERNAME  MACHINE    SQL_ID        START_TIME            USED_UBLK  USED_UREC START_UBAFIL START_UBABLK
------ ---------- --------- ---------- ------------- -------------------- ---------- ---------- ------------ ------------
 10881      55703 ANBOB     kinjk1     gd29uxmzbmj2g 06/28/16 11:48:30             1          9          250      1504704
  9065      60993 S111008   HBYDYK\WIN 4abmpbbmt8fv5 06/28/16 11:43:50             1          1          248      1573967
  7626      52347 ANBOB     qmweb81                  06/28/16 10:48:00             1          1          245        84451
 11357      46961 COMMON    qdyya1     0jfw9hdzvvk9t 06/28/16 11:48:14           107       2416          586         6550
  6731      20111 ANBOB     qdtza1     0pymq63h93cr7 06/27/16 14:56:29       2290118   26084282          248       650766 <<<<<< 16101 36593 ANBOB qmweb54 06/28/16 09:45:03 1 1 250 620376 12821 24875 ANBOB qmyy31401 fd72s60zy0dk9 06/28/16 11:48:30 1 17 250 1504600 20855 2013 ANBOB qmyy31401 06/28/16 11:48:32 1 1 245 1249799 4705 53047 ANBOB kmyy17 0cgk3a3kjpg8m 06/28/16 11:48:32 2 49 248 700088 15569 32497 SONGZHZH HBYDYK\WIN 06/28/16 10:46:57 1 1 248 237094 10910 55127 SHILQ HBYDYK\WIN 06/28/16 11:07:14 1 1 250 1285765 2986 32313 ANBOB qmweb53 06/28/16 11:37:08 1 1 250 354863 50 rows selected. SQL> @usid 6731

USERNAME                SID                 AUDSID OSUSER           MACHINE            PROGRAM              SPID             OPID CPID                     SQL_ID         HASH_VALUE   LASTCALL STATUS   SADDR            PADDR            TADDR            LOGON_TIME
----------------------- -------------- ----------- ---------------- ------------------ -------------------- -------------- ------ ------------------------ ------------- ----------- ---------- -------- ---------------- ---------------- ---------------- -----------------
ANBOB                     '6731,20111'    936346265 grid             qdtza1             (TNS V1-V3)          11564            4478 17667                    0pymq63h93cr7  3767644903      75139 ACTIVE   C000001604A7DFB8 C0000016138BF9C0 C0000015C3F1EA20 20160627 14:56:29

SQL> @xi 0pymq63h93cr7 %
eXplain the execution plan for sqlid 0pymq63h93cr7 child %...

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------
SQL_ID  0pymq63h93cr7, child number 0

DELETE FROM "ANBOB"."T" "A1"

Note:
现在已经明确是sid=6731的会话做了一个delete 全表的操作, 该表正是上面insert的表,这个事务目前使用了2290118个undo block,
当然后期我们确认了是个人用户通过DBLINK 执行的该表删除的误操作,确认后杀掉了该会话,估算了回滚剩余时间。上面的latch: undo的等待事件消失。

SET SERVEROUT ON

SQL> declare
  2  l_start number;
  3  l_end    number;
  4  begin
  5  select sum(ktuxesiz) into l_start from x$ktuxe where KTUXECFL ='DEAD';
  6    dbms_lock.sleep(60);
  7   select sum(ktuxesiz) into l_end from x$ktuxe where KTUXECFL ='DEAD';
  8    dbms_output.put_line('time est Day:'|| round(l_end/(l_start -l_end)/60/24,2));
  9  end;
 10   /

PL/SQL procedure successfully completed.

SQL> set serveroutput on
SQL> /
time est Day:.04

SQL> select tablespace_name,status,sum(bytes)/1024/1024 mb from DBA_UNDO_EXTENTS group by tablespace_name,status;

TABLESPACE_NAME                STATUS            MB
------------------------------ --------- ----------
UNDOTBS1                       ACTIVE       98.0625
UNDOTBS1                       EXPIRED   14017.8125
UNDOTBS1                       UNEXPIRED 45236.3125
UNDOTBS2                       ACTIVE       78.5625
UNDOTBS2                       EXPIRED         3022
UNDOTBS2                       UNEXPIRED  6706.8125

时间: 2025-01-21 07:10:00

oracle出现latch: undo global data 等待问题解决办法的相关文章

oracle数据库Insert into数据很慢问题解决办法

上周运营商客户的计费库反应其入库程序很慢,应用方通过监控程序发现主要慢在对于几个表的insert操作上.按照我们的通常理解,insert应该是极快的,为什么会很慢呢?而且反应之前挺好的.这有点让我百思不得其解.通过检查event也并没有发现什么奇怪的地方,于是我通过10046 跟踪了应用的入库程序,如下应用方反应比较慢的表的insert操作,确实非常慢,如下所示:  代码如下 复制代码 INSERT INTO XXXX_EVENT_201605C (ROAMING_NBR,.....,OFFER

Oracle中常见的33个等待事件小结

在Oracle 10g中的等待事件有872个,11g中等待事件1116个. 我们可以通过v$event_name 视图来查看等待事件的相关信息   一. 等待事件的相关知识 1.1 等待事件主要可以分为两类,即空闲(IDLE)等待事件和非空闲(NON-IDLE)等待事件. 1). 空闲等待事件指ORACLE正等待某种工作,在诊断和优化数据库的时候,不用过多注意这部分事件. 2). 非空闲等待事件专门针对ORACLE的活动,指数据库任务或应用运行过程中发生的等待,这些等待事件 是在调整数据库的时候

云计算时代 CIO等待问题解决还是边走边看

导读:在未来几年,云计算将改变CIO的工作方式.会有越来越多的企业投入云计算的怀抱,而软件即服务(SaaS)等技术也将逐渐成熟.云计算模式所带来的按需快速交付能力以及潜在的成本节约能力,对企业来说,都是值得提前拥有的优势. 企业内部的各个部门独立购买自己专用的IT设备,这种情况迫使企业CIO不得不提早迈向云计算平台.但是这一转变对于CIO的传统角色来说,将是永久的变化. 在未来几年,云计算将改变CIO的工作方式.会有越来越多的企业投入云计算的怀抱,而软件即服务(SaaS)等技术也将逐渐成熟.云计

asp.net session、登录用户、cookie常见问题解决办法

asp教程.net session.登录用户.cookie常见问题解决办法 这里主要讲了关于session缓存,失效,以及cookie无法删除等常用见的问题了. OutPutCache 自定义缓存:session.登录用户.cookie 等 其实这个也是新瓶装旧酒的问题,前段时间,把这个做了,况且效果和性能都还不错,所以记录下,希望能帮助更多的人 虽然 outputcache 很重要,但是这个功能真的不好用,很多时间不能满足需求,比如做一些自定义方面的缓存依赖,如:session.登录用户信息.

Node.js中AES加密和其它语言不一致问题解决办法

 这篇文章主要介绍了Node.js中AES加密和其它语言不一致问题解决办法,例如和C#.JAVA语言相互通信时,需要的朋友可以参考下 例子一:   这几天被一个问题困扰着.Nodejs的AES加密和Java,C#加密出来的不一致.当然,这样就不能解密了.纠结了许久:后来还是实在不行了,看了下源代码,要不然还得继续纠结下去.网上说,通常的nodejs AES和其他语言实现不一样.好吧~~或许吧. nodejs的crypto模块.    代码如下: var crypto = require('cry

Linux系统安装NoSQL(MongoDB和Redis)步骤及问题解决办法(总结篇)_Linux

如下是我工作中的记录,介绍的是linux系统下NoSQL:MongoDB和Redis的安装过程和遇到的问题以及解决办法: 需要的朋友可以按照如下步骤进行安装,可以快速安装MongoDB和Redis,希望可以帮助大家:)! 一.MongoDB 1.MongoDB安装 (1)将安装包mongodb-linux-i686-3.0.2.tgz拷贝到要安装的服务器中 这里我用的rz命令,如果不支持需要安装yum -y install lrzsz (2)解压安装程序 tar xzvf mongodb-lin

Android的App启动时白屏的问题解决办法

Android的App启动时白屏的问题解决办法 在手机上调试后第一次启动后会等待很长时间白屏, 设置style样式,给activity加上设置的样式,完美解决 参考一下下面的代码.就可以解决(亲测好用) <style name="SplashTheme" parent="AppBaseTheme"> <!-- 将splash图片设置在这,这样这张图片取代白屏 --> <item name="android:windowBack

win7软件兼容问题解决办法

  win7软件兼容问题解决办法 最近几天装了个win7,遇到了不少的问题 通过同学的帮助 通过usb引导安装,pe系统解压缩 刷bios,主分区激活 装好后,出现了软件的不兼容, eclipse,war3等 后来经过网上的查找 在程序上右击弹出属性窗口 选择兼容标签页 根据win7提示的兼容模式进行相应的选择 还有下面几个复选框也要进行选中 才能使程序正常运行起来!

路由器常见问题解决办法

  路由器常见问题解决办法: 打开路由优化大师,进入高级设置页面,上网设置中检视帐号密码是否输入有误.这里的上网帐号不需要输入@163.gd之类的后缀,密码重新输入一遍. 一般的网络只需要设置正确的上网帐号和密码即可正常拨号上网,但也有部分地区网络运营商会对用户做单一限制,只允许同时段一个用户上线.可以在能正常宽带拨号上网的电脑上使用路由优化大师,进入高级设置页面,Mac地址克隆中选中克隆为当前电脑MAC地址后保存设置,重启路由器生效. 当一个路由器满足不了过多上网设备时,可以增加路由器来增加可