Oracle数据库中怎么查找锁表原因_如何用存储过程快速定位
Oracle数据库中怎么查找锁表原因
遇到数据库响应变慢,怀疑是锁表时,别急着“杀”会话。先得把问题搞清楚:到底是哪张表被锁了?谁干的?为什么?下面这套方法,能帮你快速定位到根因。
免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈
查 v$locked_object 确认哪些表真被锁了
第一步,先确认是不是真的发生了锁表。最快的方法就是查询 v$locked_object 视图。这个视图很“实在”,它只返回当前正持有 DML 锁的对象——简单说,就是那些因为 INSERT、UPDATE、DELETE 操作没提交,导致行级锁升级或阻塞的表。

不过要注意,它不包含 SELECT FOR UPDATE 产生的轻量级锁,也不反映 DDL 锁(比如 ALTER TABLE)。所以,如果查出来是空结果,并不代表绝对安全,可能只是锁的类型不同。
一个常用的组合查询是这样的:
SELECT b.owner, b.object_name, a.session_id, a.locked_mode FROM v$locked_object a, dba_objects b WHERE a.object_id = b.object_id;
怎么解读结果呢?如果 object_name 那列出现了你关心的表名,那它大概率就是“罪魁祸首”。再看 locked_mode 这个值,如果显示为 3(Row-X,行排他锁)或 6(Exclusive,排他锁),通常就意味着有写操作没提交,锁就是这么来的。
- 执行这个查询需要
SELECT ANY DICTIONARY或SELECT_CATALOG_ROLE权限,否则会报 ORA-00942 错误。 - 关联
dba_objects要求用户有 DBA 角色或对目标 schema 有访问权限。如果权限不够,可以尝试换成all_objects,但这样可能会漏掉其他用户下的表。 - 这个视图是“实时快照”,不保留历史记录,只反映“此刻”的锁状态。一些瞬间完成并提交的事务锁,很容易被错过。
连查 v$session 和 v$sql 定位谁在跑什么 SQL
光知道是哪张表和哪个会话 ID(SID)还不够。关键是要弄清楚:这个会话在干什么?它从哪台机器连过来的?运行的是什么程序?执行的又是哪条 SQL 语句?
这就需要把 v$locked_object 里的 session_id,关联到 v$session 视图,再通过 sql_id 找到具体的 SQL 文本。下面这条查询链路兼容 Oracle 11g 到 19c,非常实用:
SELECT s.sid, s.serial#, s.username, s.machine, s.program, s.logon_time,
q.sql_text
FROM v$locked_object l
JOIN v$session s ON l.session_id = s.sid
LEFT JOIN v$sql q ON s.sql_id = q.sql_id
WHERE s.status = 'ACTIVE' OR s.sql_id IS NOT NULL;
拿到结果后,重点看 sql_text 字段。如果里面是一条长时间的 UPDATE 语句,并且一直没 COMMIT,那基本就是锁表的根源了。如果 SQL 文本显示是 BEGIN ... END; 这样的 PL/SQL 块开头,那说明锁可能来自某个存储过程的内部逻辑。
- 注意,
v$sql只缓存已经硬解析过的 SQL。如果语句刚执行完就被刷出了共享池,这里的sql_text可能会是空的。这时候可以尝试查询q.sql_fulltext(需要 12c 及以上版本),或者通过v$session的prev_sql_addr去关联v$sqlarea。 machine和program这两个字段能帮你快速判断源头:是来自某台应用服务器、PL/SQL Developer 这样的客户端工具,还是数据库自身的某个定时任务进程。- 如果
username显示为NULL,那可能是后台进程(比如 job queue sla ve)在持锁,处理时需要格外小心。
用存储过程批量查锁并生成 kill 语句(不自动执行)
手动拼接 ALTER SYSTEM KILL SESSION 'sid,serial#' 这样的命令既繁琐又容易出错。一个更安全高效的折中方案是:让存储过程帮你生成所有需要执行的 KILL 命令,但先不自动执行。这样你可以在执行前,最后人工核对一遍。
下面这个查询就是一个“命令生成器”。它只输出 KILL 语句的列表,把决定权留给你:
SELECT 'ALTER SYSTEM KILL SESSION ''' || s.sid || ',' || s.serial# || ''' IMMEDIATE;' AS kill_cmd,
s.username, s.machine, o.object_name, s.logon_time
FROM v$locked_object l
JOIN dba_objects o ON l.object_id = o.object_id
JOIN v$session s ON l.session_id = s.sid
WHERE o.object_name IN ('YOUR_TABLE_NAME');
使用时,只需要把 YOUR_TABLE_NAME 换成真实的表名。运行后,你会得到一串带注释的 KILL 命令。复制粘贴前,务必扫一眼 username 和 machine,确认要终止的会话是否合理。
- 语句中加上
IMMEDIATE是为了绕过正常的等待队列,立刻中断会话,避免KILL SESSION命令自身也被阻塞。 - 如果目标表被多个 SID 锁定,结果会返回多行,记得不要漏掉任何一行。
- 这条语句本身只做查询,不修改任何数据,没有权限风险,普通开发账号只要能查询字典视图就能运行。
为什么不能只依赖 v$lock 查锁表原因
很多朋友会想到去查 v$lock 视图,因为它看起来更“底层”。但这个视图展示的是所有类型的锁(包括 TX、TM、UL、DX 等),信息比较庞杂。其中,只有 TM(DML enqueues)才对应表级的锁行为,而 TX 只是事务锁,并不指向具体的数据库对象。
新手常犯的一个错误是,在 v$lock 里看到一堆 TX 类型的锁,就以为是“锁表”了。其实那很可能只是两个会话在争用同一个回滚段,和具体的表没有直接关系。
下面就是一个典型的、容易产生误导的查询:
SELECT sid, type, id1, id2, lmode FROM v$lock WHERE type = 'TX';
这种查询结果里的 id1 和 id2 分别是回滚段编号和槽位号,根本看不出是哪张表被锁。真想准确定位,还是得走 v$locked_object → v$session → v$sql 这条路径。
- 在
v$lock中,只有type = 'TM'的记录才值得仔细看,这时id1就是 object_id,可以关联到dba_objects找到具体的表。 - DBA 有时会用
DBA_BLOCKERS和DBA_WAITERS来查死锁,但这两个视图只在发生真正的死锁(抛出 ORA-00060 错误)时才有记录,平时是空的。 - Oracle 12c 之后引入了
v$session_blockers,比老视图更实时,但依然不如v$locked_object来得直观和精准。
查v$locked_object可快速确认哪些表正被 DML 锁持有,它只反映当前真实锁表状态,需结合dba_objects和v$session定位会话及 SQL,locked_mode为 3 或 6 表明存在未提交的写操作,是锁表主因。
最后,还有一个最容易被忽略的点:锁可能并不直接发生在表本身,而是发生在它的索引、约束触发器或物化视图日志上。如果你在 v$locked_object 里没看到目标表,可以尝试去查它的索引名(通过 dba_indexes)、主键约束名(通过 dba_constraints)。或者,执行 SELECT * FROM v$access WHERE object = 'YOUR_PROC_NAME',看看是不是某个存储过程正在被其他会话调用而持有了锁。
相关攻略
Oracle数据库时间点恢复实战:避开四个关键陷阱 想要将数据库精准回滚到过去的某个特定时刻?Oracle RMAN的UNTIL TIME功能是实现这一目标的核心工具,但实际操作远比想象中复杂,许多数据库管理员都曾在此处遭遇挫折。本文将深入剖析执行时间点恢复(Point-in-Time Recove
Oracle数据库PROFILE配置详解:SESSIONS_PER_USER参数精准控制用户并发会话数 如何用 PROFILE 设置用户最大并发连接数 许多DBA在寻找限制Oracle用户并发连接数的方法时,常误以为数据库有直接的“并发连接数”配置项。实际上,最核心且有效的管控机制是利用PROFIL
RMAN恢复速度受网络影响吗? 答案是肯定的,但存在一个关键前提:网络限制仅当您使用 restore 命令从远程存储位置拉取备份片时才会生效。常见的远程位置包括:挂载的NFS共享、跨广域网的NFS、云对象存储网关,或通过 sbt_tape 等插件进行网络传输的备份。反之,如果备份集本身就存储在本地磁
如何诊断SQL执行计划漂移:先查AWR历史基线,再验证基线状态与参数 SQL性能突然下降?先检查AWR历史执行计划是否稳定 Oracle数据库SQL性能下降,执行计划漂移是常见原因。统计信息更新、绑定变量窥探或数据库版本升级都可能导致优化器生成次优计划。但性能变慢不一定就是计划问题。第一步,需要确认
Oracle如何撤销用户的DBA权限_执行REVOKE DBA操作 想收回一个用户的DBA权限,可不是简单地在图形界面上点掉勾选就万事大吉了。这里面有几个关键步骤和容易踩的坑,操作不当,用户可能依然拥有部分高危权限。核心操作是:必须用 SYS AS SYSDBA 或带 ADMIN OPTION 的
热门专题
热门推荐
你一直认为自己是个无与伦比的职工 不迟到、不早退、准时完成工作,对单位里的大小文具从不顺手牵羊——这当然是职业素养的基石。不过,衡量工作成绩的优劣,有时并不仅仅看个人表现,与周围环境的协调能力同样是重要的考察维度。一味地严于律己固然好,但若与同事龃龉过多,这些不经意间埋下的“暗礁”,很可能成为阻碍你
Pharos Network公共主网正式上线:一条聚焦合规与互操作性的新公链启航 Web3市场的发展一日千里,用户对既高效又合规的金融基础设施的渴求,从未像今天这样迫切。正是在这样的背景下,基于权益证明机制、兼容EVM的第一层区块链——Pharos Network,于今日正式向公众敞开了大门。通过一
基本原则 职业女性的着装,从来不是一件小事。它像一张无声的名片,必须精准地传达出你的个性、体态特征、职位角色,更要与你所处的企业文化、办公环境乃至个人志趣相契合。 这里有个常见的误区:认为展现权威就得向男同事的着装看齐。其实恰恰相反,真正的“女强人”魅力,源于“做女人真好”的自信心态。充分发挥女性特
现代社会中,智慧与才华成为职业生涯的决定因素 工业化和高科技的浪潮,正悄然改变着职场的力量格局。一个显著的趋势是,男性的体力优势在众多领域逐渐变得不那么关键,这为女性更广泛、更深入地参与社会财富创造打开了大门。如今在工作中,“人”的属性越来越超越性别属性。那句广为流传的宣言——“没有专门只给男人或者
在办公室里,同事每天见面的时间最长,谈话可能涉及到工作以外的各种事情,讲错话常常会给你带来不必要的麻烦。同事与同事间的谈话,如何掌握分寸就成了人际沟通中不可忽视的一环。 办公室里最好不要辩论 职场里总有些人,似乎天生就喜欢争论,凡事都要争个高低对错才肯罢休。如果你恰好也具备这种“才华”,那么真心建议





