enq: us - contention本质是smon进程在业务负载突变时频繁online/offline回滚段,导致多个会话争用undo segment enqueue锁;重启后_undo_autotune自动拉高undo_retention,旧事务占位不放,新事务缺资源触发调度卡顿;禁用该参数(alter system set "_undo_autotune"=false)并设合理固定undo_retention可立竿见影缓解。

enq: US - contention本质是UNDO段动态伸缩引发的串行化争用
这不是SQL写错了,也不是磁盘慢了,而是Oracle在高并发DML时自动调整UNDO资源的行为本身成了瓶颈。SMON进程会在业务负载突变(比如压测启动、早高峰涌入)时频繁ONLINE/OFFLINE rollback segments,而每次操作都要获取US锁(Undo Segment Enqueue),多个会话排队等这个锁,就堆出大量enq: US - contention。
为什么重启后更容易触发
数据库刚重启时负载低,_undo_autotune会把UNDO_RETENTION拉得很高(比如从900秒涨到7200秒),导致旧事务占着UNDO不放;等业务流量上来,新事务急需分配UNDO空间,但可用rollback segment不足,SMON就得反复调度——这过程卡在US锁上。
- 查当前是否启用自动调优:
SELECT ksppinm, ksppstvl FROM x$ksppi x, x$ksppcv y WHERE x.indx = y.indx AND x.ksppinm = '_undo_autotune'; - 看最近UNDO保留时间波动:
SELECT MAX(undoblks), MAX(maxquerylen), MAX(tuned_undoretention) FROM v$undostat; - 确认
undo_retention实际值:SHOW PARAMETER undo_retention
直接有效的缓解动作
禁用自动调优是最立竿见影的方案,让UNDO行为回归可控:
- 执行:
ALTER SYSTEM SET "_undo_autotune" = FALSE SCOPE=BOTH; - 确保
undo_retention设为合理固定值(如OLTP系统常用900~1800秒) - 观察
v$undostat中unxpstealcnt(未过期块被偷用次数)是否归零,归零说明UNDO压力已释放
注意:隐含参数_undo_autotune在19c中默认为TRUE,且它的“智能”在高并发场景下恰恰是反效率的——它优化的是长事务保留,不是短事务吞吐。











