##查看session锁住情况
在实际开发中,我们经常会碰到业务的求助,XXX模板一直报资源被占用的错误,或者XX用户反映数据库登陆不上了。这个时候我们就可以在视图 gv$lock 和 gv$session 中查询哪些表被哪些会话锁住了:
SELECT /*+ RULE */
ls.osuser os_user_name,
ls.username user_name,
decode(ls.type,
'RW',
'Row wait enqueue lock',
'TM',
'DML enqueue lock',
'TX',
'Transaction enqueue lock',
'UL',
'User supplied lock') lock_type,
o.object_name OBJECT,
decode(ls.lmode,
1,
NULL,
2,
'Row Share',
3,
'Row Exclusive',
4,
'Share',
5,
'Share Row Exclusive',
6,
'Exclusive',
NULL) lock_mode,
o.owner,
ls.sid,
ls.serial# serial_num,
ls.id1,
ls.id2
FROM sys.dba_objects o,
(SELECT s.osuser,
s.username,
l.type,
l.lmode,
s.sid,
s.serial#,
l.id1,
l.id2
FROM gv$session s,
gv$lock l
WHERE s.sid = l.sid) ls
WHERE o.object_id = ls.id1
AND o.owner <> 'SYS'
ORDER BY o.owner,
o.object_name
##kill session
无论是session一直占用了资源不放,还是登陆不上去,大部分原因都是因为用户操作不当,当然也可能是oracle的小BUG,我们直接干掉这个session就可以了:
alter system kill session 'sid, SERIAL#';
一个偷懒的方法可以直接生成上述脚本:
SELECT DISTINCT 'alter system kill session ' || chr(39) || b.sid || ',' || b.serial# || chr(39) || ';' AS 生成的sql,
b.username,
b.logon_time
FROM v$locked_object a,
v$session b
WHERE a.session_id = b.sid
ORDER BY b.logon_time