如何查询oracle会话及锁 如何查锁了哪张表?如何杀掉会话

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/alinshen/article/details/83927775

===================================================================================================================

--查看锁表:
SELECT O.OWNER, O.OBJECT_NAME, O.OBJECT_TYPE, S.SID, S.SERIAL#
  FROM V$LOCKED_OBJECT L, DBA_OBJECTS O, V$SESSION S
 WHERE L.OBJECT_ID = O.OBJECT_ID
   AND L.SESSION_ID = S.SID
 ORDER BY O.OBJECT_ID, XIDUSN DESC;

--解锁
alter system kill session '372,20909'; 


--查死锁   可以查出来哪个库的哪个表锁了-- 
select s.sid,
       s.serial#,
       s.LOGON_TIME,
       s.MACHINE,
       s.TERMINAL,
       l.oracle_username,
       l.os_user_name,
       a.object_name,--被锁的表名
       l.locked_mode
  from v$locked_object l, dba_objects a, v$session s
 where a.object_id = l.object_id
   and l.session_id = s.sid;

alter system kill session 'sid,serial#'; 


--在oralce中   会话失效了,但是锁还在,所以,如果某张表被锁了,查找是哪个会话锁的,不仅要看活着的会话,还需要看失效的会话
--1.使用以上sql语句,根据表名查询对应的会话记录,  2.kill调对应的会话(包括失效的会话)


--查询某个session的进程状态
SELECT a.username,
       a.machine,
       a.program,
       b.spid,
       a.sid,
       a.serial#,
       a.status,--显示当前会话的状态
       c.piece,
       c.sql_text
  FROM v$session a, v$process b, v$sqltext c
 WHERE a.sid = '1869'
   AND b.addr = a.paddr
   AND a.sql_address = c.address(+)
 ORDER BY c.piece;
 
 ===================================================================================================================
 
 --死锁是数据库经常发生的问题,数据库一般不会无缘无故产生死锁,死锁通常都是由于我们应用程序的设计本身造成的。产生死锁时,如何解决呢,下面是常规的解决办法:


--1)执行下面SQL,先查看哪些表被锁住了: 
select b.owner,b.object_name,a.session_id,a.locked_mode
from v$locked_object a,dba_objects b
where b.object_id = a.object_id;


--2)查处引起死锁的会话
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;
--这里会列出SID


--3) 查出SID和SERIAL#: 
--查V$SESSION视图: 
SELECT SID,SERIAL#,PADDR FROM V$SESSION WHERE SID='刚才查到的SID'; 
--这一步将得到PADDR 


--4)查V$PROCESS视图: 
SELECT SPID FROM V$PROCESS WHERE ADDR='刚才查到的PADDR'; 
--这一步得到SPID 

扫描二维码关注公众号,回复: 4532065 查看本文章


--5)杀死进程 
--(1)在数据库中,杀掉ORACLE进程: 
ALTER SYSTEM KILL SESSION '查出的SID,查出的SERIAL#'; 


--(2)如果在ORACLE中不能杀死进程,我们只能到操作系统中,使用操作系统命令杀死进程 
KILL -9  “刚才查出的SPID”
--在WINDOWS平台,可以是偶那个orakill。
 
===================================================================================================================

--oracle层面杀会话

select object_name,machine,s.sid,s.serial# from v$locked_object l,dba_objects o,v$session s where l.object_id=o.object_id and l.session_id=s.sid;(查询被锁对象)

alter system kill session '5,55'; (其中5,55分别是上面查询出的sid,serial#)

--操作系统层面杀进程(linux)
select spid, osuser, s.program from v$session s,v$process p where s.paddr=p.addr and s.sid=5; (5是上面的sid)

kill -9 55555(55555是刚查询出的spid)

--操作系统层面杀进程(win)
SQL>host orakill 实例名 55555;(555是刚查询出的spid)

===================================================================================================================

猜你喜欢

转载自blog.csdn.net/alinshen/article/details/83927775