ORA-04021是库缓存锁超时的直接表现,本质是DDL或RMAN等操作在5分钟内无法获取对象的library cache lock,需通过dba_ddl_locks、v$session等视图定位并清理阻塞会话。
ORA-04021 是库缓存锁冲突的直接表现
不是所有“卡住”或“超时”都叫库缓存锁冲突,只有报 ora-04021: timeout occurred while waiting for library cache lock 才是真问题。它说明 rman 正在尝试解析、编译或加载某个对象(比如包、视图、存储过程),但该对象被另一个会话以排他方式持有 library cache lock,且等待超过默认 5 秒(_library_cache_lock_timeout 隐含参数控制)。
RMAN 自身操作会触发库缓存争用
RMAN 并非只读工具——它在备份过程中会动态执行 SQL:生成备份片元元数据、更新控制文件记录、调用 DBMS_BACKUP_RESTORE 包、甚至在 VALIDATE 或 CROSSCHECK 时查询数据字典视图。这些动作都会访问 library cache。
- 执行
BACKUP VALIDATE DATABASE会反复打开/关闭数据字典游标,极易触发library cache lock - 多个 RMAN 通道并发执行
BACKUP AS COPY时,若目标路径含相同动态格式(如%U),RMAN 内部可能竞争同一 PL/SQL 包的解析锁 - 使用
CONFIGURE CONTROLFILE AUTOBACKUP ON后,每次BACKUP都会调用dbms_backup_restore.auto_backup_controlfile,该包若被其他会话修改或重编译,就会阻塞 RMAN
真正容易被忽略的外部干扰源
90% 的库缓存锁冲突不是 RMAN 引起的,而是它撞上了别人正在干的事。
- 开发人员正在
ALTER PACKAGE xxx COMPILE—— 这会持library cache lock排他锁,RMAN 等不到就报ORA-04021 - DBA 执行了
DBMS_STATS.GATHER_SCHEMA_STATS,尤其对含大量函数索引或虚拟列的表,会触发大量字典对象重解析 - 应用连接池频繁执行
EXECUTE IMMEDIATE拼接 SQL,且未绑定变量,导致硬解析风暴,挤占library cache空间和锁资源 - 监控脚本每分钟跑一次
SELECT * FROM V$SQLAREA WHERE ROWNUM —— 这类全扫描会刷新大量共享池对象,间接引发锁排队
查和杀要分清对象,别一锅端
查到持有锁的会话,不能直接 ALTER SYSTEM KILL SESSION,先确认它是不是“正当占用”:
- 用
SELECT sid, sql_id, event, blocking_session FROM v$session WHERE event = 'library cache lock'定位等待方 - 再查
SELECT sid, sql_id, sql_text FROM v$session s, v$sql t WHERE s.sql_id = t.sql_id AND s.sid = &blocking_sid看它在跑什么 - 如果
sql_text是alter package ... compile或create or replace function,等它完成比 kill 更安全 - 如果
sql_text是空,且status = 'ACTIVE'、program是oracle@xxx (J000)(作业进程),大概率是调度任务卡死,可 kill
最麻烦的是那种“没 SQL、没事件、status = INACTIVE 却一直占着 lock”的会话——通常是客户端断连未清理,这时才适合 kill,但得配合 IMMEDIATE 选项。


















