结论是物化视图刷新失败后残留锁90%源于atomic_refresh=>true默认行为引发的排他锁或tx锁未释放;应先查v$locked_object与locked_mode=6定位truncate卡住,再验证fast可刷性及日志完备性,而非直接kill会话。
直接说结论:物化视图刷新失败后残留的锁,90% 是因为 atomic_refresh => true 默认行为导致的排他锁未释放,或刷新事务卡住后长期持有 tx 锁。别急着 kill session,先确认锁源和刷新状态。
查锁源时重点看 v$locked_object 和 locked_mode
执行以下语句快速定位:
SELECT b.owner, b.object_name, a.session_id, a.locked_mode, c.machine, c.program, c.status, c.event FROM v$locked_object a JOIN dba_objects b ON a.object_id = b.object_id JOIN v$session c ON a.session_id = c.sid WHERE b.object_name IN ( SELECT mview_name FROM dba_mviews WHERE owner = 'YOUR_SCHEMA' ) ORDER BY b.object_name;
-
locked_mode = 6表示排他锁(X),基本可判定是ATOMIC_REFRESH => TRUE触发的TRUNCATE操作卡住了 -
program字段显示oracle@ (J000)是后台作业(如DBMS_MVIEW.REFRESH调用),若显示jdbc thin client或应用名,则是业务会话在写基表,与刷新争同一行 - 若多个
session_id同时锁住同一object_name的不同行,且event是enq: TX - row lock contention,说明是 FAST 刷新的SELECT FOR UPDATE升级为全表扫描锁——大概率因基表缺少索引
ATOMIC_REFRESH => FALSE 不是万能开关,必须验证 FAST 可刷性
设成 FALSE 后仍锁表?说明它根本没走 FAST,而是静默退化为 COMPLETE 刷新,反而更慢更锁。
- 先查真实支持状态:
SELECT fast_refreshable FROM user_mviews WHERE mview_name = 'MV_SALES',返回值必须是FAST,不是DIRLOADDML或UNDEFINED - 再查日志是否完备:
SELECT log_table, rowids, primary_key FROM user_mview_logs WHERE master = 'SALES',确保rowids = 'Y'或primary_key = 'Y',且日志表存在 - 如果
EXPLAIN_MVIEW返回REFRESH_FROM_LOG_AFTER_INSERT = 'DISABLED',说明日志缺失关键列(比如 JOIN 条件字段没包含),补建日志前别硬上FALSE
刷新卡住时别直接 ALTER SYSTEM KILL SESSION
杀错会话可能让 undo 回滚段雪崩,甚至拖垮整个实例。
- 先查锁持有者正在跑什么:
SELECT sid, serial#, sql_id, event, sql_text FROM v$session s JOIN v$sql t ON s.sql_id = t.sql_id WHERE s.sid IN (SELECT session_id FROM v$locked_object) - 若
event是db file sequential read或enq: TX,且sql_text包含DELETE FROM MLOG$_或INSERT /*+ APPEND */,说明就是刷新本身卡了,可安全中止该 session - 若
sql_text是一个长存储过程(哪怕不碰 MV 表),但event是undo segment extension,说明它占用了大量回滚空间,导致刷新事务无法分配 undo,优先 kill 它 - 中止后,立刻手动执行一次
DBMS_MVIEW.REFRESH('MV_NAME', method => 'F', atomic_refresh => FALSE),避免日志堆积
最易被忽略的一点:即使开了 ATOMIC_REFRESH => FALSE,如果基表上没有高效索引支撑 FAST 刷新的 SELECT FOR UPDATE,Oracle 仍会扫描全表加锁——锁范围不是“几行”,而是“整张基表”。务必检查 WHERE 条件字段是否有索引,尤其是物化视图定义里涉及的 JOIN、FILTER、GROUP BY 字段。











