必须用gv$active_session_history查library cache lock,聚焦event='library cache lock'且sql_opname∈('create','alter','drop','grant','revoke')、p1text='handle address'、p2text='lock address'、blocking_session非空,并关联v$session查sql_text确认持锁ddl。

查 library cache lock 事件必须加 sql_opname 过滤
只筛 event = 'library cache lock' 会捞出大量干扰样本,比如编译失败重试、隐式游标解析等。真正引发阻塞的 DDL 操作集中在 CREATE、ALTER、DROP、GRANT、REVOKE 这几类。不加 sql_opname 条件,可能把一个 SELECT 的硬解析锁误判为 DDL 冲突。
实操建议:
- 必须写
WHERE event = 'library cache lock' AND sql_opname IN ('ALTER', 'CREATE', 'DROP', 'GRANT', 'REVOKE') -
sql_id常为空——DDL 编译阶段尚未生成完整 SQL ID,此时要靠sql_opname+session_id关联v$session查sql_text - 别把
library cache: mutex X当成library cache lock,两者底层机制不同,混查会漏掉真实持锁者
RAC 环境下必须用 gv$active_session_history 查 final_blocking_session
单节点查 v$active_session_history 在 RAC 中大概率失效:持锁会话可能在实例 2,而你只连了实例 1。更糟的是,blocking_session 字段只指向本节点的中间阻塞者,不是根源头。
实操建议:
- 统一用
gv$active_session_history,并显式 SELECTfinal_blocking_session和final_blocking_instance - 查到
final_blocking_instance = 2后,先确认该实例是否存活:SELECT instance_number FROM v$instance WHERE instance_number = 2 - 若
final_blocking_session为 0 或 NULL,说明它是根阻塞源——极大概率就是那个卡在CREATE OR REPLACE PACKAGE中间状态的会话
重点看 p1text = 'handle address' 和 p2text = 'lock address'
library cache lock 的本质是多个会话争抢同一个库缓存对象句柄(handle)上的锁(lock)。p1 和 p2 就是这两个地址值。同一时间多个会话的 p1 和 p2 完全一致,基本可锁定它们在争抢同一个对象。
实操建议:
- 执行时加
ORDER BY p1, p2, sample_time DESC,方便快速聚类 - 若发现多个会话都等在相同
p1/p2,且其中一人的blocking_session为空、session_state = 'ON CPU'、sql_text是CREATE OR REPLACE PACKAGE xxx,就不用再往下查了 -
handle address可反查对象:SELECT kglnaobj FROM x$kglob WHERE kglhdadr = '00000000ABC12345'(需 DBA 权限)
为什么 CREATE OR REPLACE PACKAGE 最容易卡住
这个操作不是原子的:Oracle 先以 mode=3(独占)加 library cache lock 删除旧版本,再加载新版本。中间任何环节卡住——包体过大、依赖对象未就绪、共享池碎片、甚至只是网络延迟——锁就一直挂着,后续所有访问该包的会话都会被阻塞。
典型表现:
- 持锁会话的
event是library cache lock,但state是WAITING或ON CPU且长时间不动 - 等待方会话的
sql_id可能是业务 SQL,但event也是library cache lock,且p1/p2与持锁者完全一致 - 查
v$session会发现大量会话blocking_session指向同一个 SID,但该 SID 自身blocking_session IS NULL
这种场景下,sql_id 不重要,sql_opname 和 p1/p2 才是关键锚点;ASH 快照里看不到完整的 DDL 执行过程,但能看到它“卡住”的那一秒。











