oracle 查询被锁进程

 select SESS.sid, SESS.SERIAL#, LO.ORACLE_USERNAME, LO.OS_USER_NAME,
      AO.OBJECT_NAME, LO.LOCKED_MODE
from V$LOCKED_OBJECT LO, DBA_OBJECTs AO, V$SESSION SESS
where AO.OBJECT_ID = LO.OBJECT_ID
and lo.session_id = sess.sid;


(1)释放锁的方法:
我们可以用下面SQL语句杀掉长期没有释放非正常的锁:
alter system kill session 'sid,serial#'; //sid,serial#是上面查询出来的
(2)系统级杀进程方法释放锁:
select spid from v$process where addr = (select paddr
from v$session where sid=&sid);$ kill -9 spid //spid是上面查询出来的
(3)注意点:如果出现了锁的问题, 某个DML操作可能等待很久没有反应。 当你采用的是直接连接数据库的方式,也不要用OS系统命令 $kill process_num 或者 $kill -9 process_num来终止用户连接,因为一个用户进程可能产生一个以上的锁,杀OS进程并不能彻底清除锁的问题。

如果利用上面的命令杀死一个进程后,进程状态被置为"killed",但是锁定的资源很长时间没有被释放,那么可以在os一级再杀死相应的进程(线程),首先执行下面的语句获得进程(线程)号:
select spid, osuser, s.program
from v$session s,v$process p
where s.paddr=p.addr and s.sid=24 (24是上面的sid)

4.在OS上杀死这个进程(线程):
1)在unix上,用root身份执行命令:
#kill -9 12345(即第3步查询出的spid)
2)在windows(unix也适用)用orakill杀死线程,orakill是oracle提供的一个可执行命令,语法为:
orakill sid thread
其中:
sid:表示要杀死的进程属于的实例名
thread:是要杀掉的线程号,即第3步查询出的spid。
例:c:>orakill orcl 12345




Oracle 数据库中,查询定表的进程以及相关的 SQL 语句可以通过以下方式实现。以下是常用的 SQL 查询语句,用于识别哪些会话正在持有、哪些会话被阻塞,以及这些会话正在执行的 SQL 语句。 ### 查询当前被定的对象和会话信息 ```sql SELECT s.sid, s.serial#, s.username, s.status, s.module, s.machine, s.program, o.object_name, o.object_type, l.locked_mode, sql.sql_text 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 LEFT JOIN v$sql sql ON s.sql_address = sql.address AND s.sql_hash_value = sql.hash_value; ``` 此查询可以获取到当前数据库中所有被定的对象、定该对象的会话信息(如用户名、机器名、程序等),以及这些会话正在执行的 SQL 语句[^3]。 ### 查询阻塞会话的信息 如果需要进一步了解哪些会话是阻塞源(即它们持有了其他会话请求的),可以使用以下查询: ```sql SELECT s1.sid AS blocking_sid, s1.username AS blocking_user, s2.sid AS blocked_sid, s2.username AS blocked_user, w.event, w.wait_time, w.seconds_in_wait, sql.sql_text FROM v$session_wait w JOIN v$session s1 ON w.p1 = s1.sid JOIN v$session s2 ON w.sid = s2.sid LEFT JOIN v$sql sql ON s2.sql_address = sql.address AND s2.sql_hash_value = sql.hash_value WHERE w.event = 'enqueue'; ``` 该查询将列出所有因而处于等待状态的会话,并显示哪个会话是阻塞源,以及被阻塞会话正在执行的 SQL 语句[^4]。 ### 查询特定对象的信息 如果你已经知道某个表或对象被定,并希望查找与该对象相关的所有信息,可以使用如下查询: ```sql SELECT s.sid, s.serial#, s.username, s.status, s.module, s.machine, s.program, l.locked_mode, sql.sql_text FROM v$locked_object l JOIN v$session s ON l.session_id = s.sid LEFT JOIN v$sql sql ON s.sql_address = sql.address AND s.sql_hash_value = sql.hash_value WHERE l.object_id = (SELECT object_id FROM dba_objects WHERE object_name = 'YOUR_TABLE_NAME'); ``` 请将 `YOUR_TABLE_NAME` 替换为实际的表名以获取特定表的信息[^1]。 ### 杀掉定会话(谨慎操作) 如果发现某个会话长时间持有并且影响了系统的正常运行,可以考虑终止该会话。使用以下命令: ```sql ALTER SYSTEM KILL SESSION 'sid,serial#'; ``` 请将 `sid` 和 `serial#` 替换为实际的会话 ID 和序列号。此操作应谨慎执行,确保不会对正在进行的重要事务造成影响[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值