oracle 11g RAC 等待一例 gc current request 和 enq: US - contention

本文记录了在11g R2 RAC环境中遇到的一个脚本执行挂住的问题及排查过程。通过查询GV$SESSION_WAIT视图发现,挂住的原因在于UNDO资源争用,最终决定通过扩大UNDO表空间来解决问题。

测试环境,11G R2 RAC。

有个脚本执行的时候,挂住了。检查一下:


SQL> select * from GV$SESSION_WAIT where sid = 2848 ;
 
   INST_ID        SID       SEQ# EVENT                                                            P1TEXT                                                                   P1 P1RAW            P2TEXT                                                                   P2 P2RAW            P3TEXT                                                                   P3 P3RAW            WAIT_CLASS_ID WAIT_CLASS# WAIT_CLASS                                                        WAIT_TIME SECONDS_IN_WAIT STATE               WAIT_TIME_MICRO TIME_REMAINING_MICRO TIME_SINCE_LAST_WAIT_MICRO
---------- ---------- ---------- ---------------------------------------------------------------- ---------------------------------------------------------------- ---------- ---------------- ---------------------------------------------------------------- ---------- ---------------- ---------------------------------------------------------------- ---------- ---------------- ------------- ----------- ---------------------------------------------------------------- ---------- --------------- ------------------- --------------- -------------------- --------------------------
         1       2848         85 gc current request                                               file#                                                                     4 0000000000000004 block#                                                                  128 0000000000000080 id#                                                                16777253 0000000001000025    3871361733          11 Cluster                                                                   0             767 WAITING                   766899151                   -1                          0
         2       2848         17 enq: US - contention                                             name|mode                                                        1431502854 0000000055530006 undo segment #                                                           17 0000000000000011 0                                                                         0 00                  1893977003           0 Other                                                                     0          139240 WAITING                139240348081                   -1                          0
 
SQL>


第一个事件:

SQL> select name,parameter1,parameter2,parameter3 from v$event_name where name='gc current request';
 
NAME                                                             PARAMETER1                                                       PARAMETER2                                                       PARAMETER3
---------------------------------------------------------------- ---------------------------------------------------------------- ---------------------------------------------------------------- ----------------------------------------------------------------
gc current request                                               file#                                                            block#                                                           id#
 
SQL> SELECT tablespace_name, file_name FROM dba_data_files WHERE file_id = 4;
 
TABLESPACE_NAME                FILE_NAME
------------------------------ --------------------------------------------------------------------------------
UNDOTBS2                       +XXX/xxx/undotbs02.dbf
 
SQL>

第二个也是说明UNDO的争用。


SQL> col file_name format a50   
SQL> set lines 100
SQL> select file_name,bytes/1024/1024 from dba_data_files order by file_name;


那就扩空间吧。



### ### enq: SV - contention 等待事件的含义 在 Oracle 数据库中,`enq: SV - contention` 是一种与序列(Sequence)相关的等待事件,通常出现在 RAC(Real Application Clusters)环境中。当多个实例同时请求同一个设置了 `CACHE` `ORDER` 属性的序列的 `NEXTVAL` 时,需要通过 SV 锁(SV enqueue)来保证序列值的有序性一致性。由于 SV 锁是以 SSX(Shared Sub-Exclusive)模式获取的,因此在争用发生时,会引发 `enq: SV - contention` 等待事件[^2]。 ### ### 原因分析 1. **高并发插入操作**:如果多个会话或实例频繁地请求同一个具有 `CACHE + ORDER` 属性的序列对象,会导致大量对 SV 锁的请求冲突,从而产生 `enq: SV - contention` 等待[^3]。 2. **RAC 环境下的锁竞争**:在 RAC 架构下,由于序列的 `ORDER` 属性要求生成的数值必须全局有序,Oracle 使用 SV 锁来同步不同节点间的访问。这种跨节点的同步机制会引入额外的锁资源竞争[^2]。 3. **序列缓存不足**:即使启用了 `CACHE`,若缓存大小不足以应对并发请求频率,仍然可能导致频繁的锁获取释放操作,加剧争用问题[^4]。 ### ### 解决方法 1. **调整序列属性**: - 如果业务允许无序的序列值,可以移除 `ORDER` 属性,这样可以避免使用 SV 锁,从而减少争用。 - 示例修改语句如下: ```sql ALTER SEQUENCE your_sequence_name NOORDER; ``` 2. **增加缓存大小**: - 提高 `CACHE` 参数值可以减少对共享资源的访问频率,降低争用概率。 - 修改示例如下: ```sql ALTER SEQUENCE your_sequence_name CACHE 1000; ``` 3. **使用多个序列或分区序列**: - 如果系统支持,可以通过创建多个独立的序列,并在应用层进行轮询分配,从而分散单个序列的并发压力。 4. **优化事务设计**: - 减少每次事务中调用 `NEXTVAL` 的次数,尽量将多个插入操作合并到一个事务中,以减少锁的持有时间。 5. **评估是否真的需要 `ORDER` 属性**: - 若业务逻辑并不严格依赖全局递增的顺序,则建议关闭 `ORDER` 选项,以提升性能并避免 SV 锁争用问题。 6. **监控诊断**: - 利用 AWR 报告、ASH 视图以及 `V$SESSION_WAIT` 等工具持续监控该等待事件的发生频率影响范围,以便及时采取措施。 7. **升级数据库版本**: - 在某些较新的 Oracle 版本中,针对序列争用进行了优化,如引入了更高效的锁管理机制。考虑升级至更高版本可能有助于缓解此类问题。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值