查看Oracle中是否有锁表的sql

本文提供了一套完整的Oracle数据库锁表排查方法,包括如何找出造成死锁的SQL语句、涉及的用户及进程信息、锁定的表名及级别等,并给出了具体的SQL脚本实例,最后还介绍了如何通过SQL命令解除锁定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查看Oracle中是否有锁表的sql,具体是那个用户那个进程造成死锁,锁的级别等。

1、查看是否有锁表的sql
select 'blocker('||lb.sid||':'||sb.username||')-sql:'|| qb.sql_text blockers,
'waiter ('||lw.sid||':'||sw.username||')-sql:'|| qw.sql_text waiters
from v$lock lb,
v$lock lw,
v$session sb,
v$session sw,
v$sql qb,
v$sql qw
where lb.sid=sb.sid
and lw.sid=sw.sid
and sb.prev_sql_addr=qb.address
and sw.sql_address=qw.address
and lb.id1=lw.id1
and sw.lockwait is not null
and sb.lockwait is null
and lb.block=1 ;

2、查看被锁的表
select p.spid,a.serial#,c.object_name,b.session_id,b.oracle_username,b.os_user_name
from v$process p,v$session a, v$locked_object b,all_objects c --www.jbxue.com
where p.addr=a.paddr and a.process=b.process and c.object_id=b.object_id ;

3、查看那个用户那个进程造成死锁,锁的级别
select b.owner,b.object_name,l.session_id,l.locked_mode fromv$locked_object l, dba_objects

4、查看连接的进程
SELECT sid, serial#, username, osuser FROMv$session;

5、查看是哪个session引起的
select b.username,b.sid,b.serial#,logon_time
from v$locked_object a,v$session b
where a.session_id = b.sid order by b.logon_time;

6、杀掉进程
alter system kill session 'sid,serial#';
此处的sid是第5步查询出的sid和serid 。
<think>好的,我现在需要帮助用户了解如何在Oracle数据库中检查进程是否。首先,我需要回忆一下Oracle的相关知识以及常用的查询方法。 首先,用户提到“oracle查进程是否”,所以应该涉及到Oracle数据库中的机制。在数据库中用于管理并发访问,防止数据不一致。当多个会话同时访问同一资源时,可能会发生定,导致阻塞。 接下来,我需要考虑如何查询Oracle中的信息。通常,可以通过数据字典视图来获取这些信息。常用的视图包括V$LOCK、V$SESSION、V$PROCESS,可能还有DBA_BLOCKERS和DBA_WAITERS。需要确认这些视图的权限是否足够,比如用户是否有SELECT权限。 然后,用户可能需要具体的SQL语句来检查的情况。我需要分步骤考虑: 1. 查询当前被定的对象和会话:可能需要连接V$SESSION和V$LOCK视图,通过SESSION_ID或SID关联,同时获取用户名、机器、终端等信息。 2. 查找阻塞会话:当一个会话持有而另一个会话在等待时,需要找到阻塞源头。可能需要关联V$LOCK中的BLOCK列,找出BLOCK=1的记录,示该会话正在阻塞其他会话。 3. 查看具体被的对象:可能需要使用DBA_OBJECTS,通过OBJECT_ID关联到V$LOCKED_OBJECT,以获取对象名称。 此外,还需要注意Oracle的版本差异,比如某些视图在不同版本中可能有不同的字段或名称。例如,V$SESSION中的某些列可能需要调整。 用户可能需要详细的步骤说明,包括如何编写这些查询语句,如何解读结果,以及如何处理发现的。比如,如果发现阻塞的会话,可能需要终止该会话,但需要谨慎操作,避免生产问题。 另外,需要注意权限问题。普通用户可能没有访问V$动态视图的权限,需要DBA角色或相应的权限授予。可能需要提醒用户确认权限,或者以DBA用户身份执行查询。 最后,可能需要给出一个综合的查询示例,将各个视图连接起来,展示会话ID、用户名、类型、被对象、阻塞状态等信息。同时,解释关键字段的含义,如LMODE、REQUEST、TYPE等,帮助用户理解的模式和类型。 总结一下,我需要分步骤写出如何查询Oracle中的,包括涉及的视图、连接条件、关键字段的解释,以及如何处理发现的。同时,提醒用户注意事项,比如权限和终止会话的风险。</think>在Oracle数据库中检查进程是否,可以通过以下步骤进行: --- ### **步骤1:查询当前信息** 使用`V$LOCK`和`V$SESSION`视图关联查询: ```sql SELECT s.sid, s.serial#, s.username, s.machine, s.program, l.type AS lock_type, l.lmode, l.request, l.block FROM v$session s JOIN v$lock l ON s.sid = l.sid WHERE l.block = 1 -- 示此会话阻塞其他会话 OR l.request > 0; -- 示此会话正在等待 ``` - **关键字段解释**: - `block=1`:此会话正在阻塞其他会话。 - `request>0`:此会话正在等待。 - `lmode`:模式(1=null, 2=row share, 3=row exclusive, 4=share, 5=share row exclusive, 6=exclusive)。 - `type`:类型(如TX=事务,TM=)。 --- ### **步骤2:查找被阻塞的会话** 通过`DBA_BLOCKERS`和`DBA_WAITERS`视图(需DBA权限): ```sql -- 查询阻塞其他会话的源头 SELECT * FROM dba_blockers; -- 查询正在等待的会话 SELECT * FROM dba_waiters; ``` --- ### **步骤3:定位被的具体对象** 通过`V$LOCKED_OBJECT`和`DBA_OBJECTS`关联查询: ```sql SELECT lo.session_id, s.serial#, o.owner, o.object_name, o.object_type FROM v$locked_object lo JOIN dba_objects o ON lo.object_id = o.object_id JOIN v$session s ON lo.session_id = s.sid; ``` - **结果说明**: - `object_name`:被或对象名称。 - `session_id`和`serial#`:用于后续操作(如终止会话)。 --- ### **步骤4:终止阻塞会话(谨慎操作!)** 如果确认需要终止会话,使用`ALTER SYSTEM KILL SESSION`: ```sql ALTER SYSTEM KILL SESSION 'sid,serial#'; -- 示例:ALTER SYSTEM KILL SESSION '123,4567'; ``` --- ### **注意事项** 1. **权限要求**:需要`SELECT`权限访问`V$`开头的动态视图(通常需DBA角色)。 2. **类型**: - **TX**:事务(常见于DML操作冲突)。 - **TM**:(如未提交的`UPDATE`或`DELETE`)。 3. **避免误杀**:终止会话可能导致事务回滚,需评估业务影响。 --- ### **总结** 通过上述步骤,可以快速定位Oracle中的问题: 1. 查询`V$LOCK`和`V$SESSION`找到阻塞源头。 2. 关联`DBA_OBJECTS`定位被对象。 3. 终止会话前务必确认影响范围。 建议定期监控情况,优化事务设计(如减少长事务)以降低冲突概率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值