查询当前执行的SQL,锁表与解锁
一:查询当前正在执行的SQL:
SELECT a.sid, a.serial#, a.machine, a.username, b.hash_value, c.sql_text
FROM v$session a, v$sqlarea b, v$sqltext c
WHERE a.sql_hash_value = b.hash_value
AND b.hash_value = c.hash_value
ORDER BY b.hash_value, c.piece;
查询结果如下所示:
二:查看当前锁表信息:
SELECT l.session_id sid,
s.serial#,
l.locked_mode,
l.oracle_username,
l.os_user_name,
s.machine,
s.terminal,
o.object_name,
s.logon_time
FROM v$locked_object l, all_objects o, v$session s
WHERE l.object_id = o.object_id
AND l.session_id = s.sid
ORDER BY sid, s.serial#;
查询结果如下所示:
此锁的原因是我使用了select ... for update;此锁为三级锁,可以看出是CIRC_PERIOD表锁住了。
三:解锁:
根据上面查询出来的SID和SERIAL#来KILL SESSION,SQL如下:
alter system kill session 'SID,SERIAL#';
也可以根据如下SQL查询出KILL语句:
SELECT 'alter system kill session ''' || l.session_id || ',' || s.serial# || ''';'
FROM v$locked_object l, all_objects o, v$session s
WHERE l.object_id = o.object_id
AND l.session_id = s.sid
ORDER BY sid, s.serial#;
查询结果如下所示: