===================================================================================================================
--查看锁表:
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
--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)
===================================================================================================================