1、查看是否有被鎖的表: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。
專注于為中小企業(yè)提供成都做網站、網站制作服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)蓬溪免費做網站提供優(yōu)質的服務。我們立足成都,凝聚了一批互聯網行業(yè)人才,有力地推動了千余家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網站建設實現規(guī)模擴充和轉變。
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。
3、殺掉進程alter system kill session 'sid,serial#';。
查看鎖表進程SQL語句:
select * from v$session t1, v$locked_object t2 where t1.sid = t2.SESSION_ID;
殺掉鎖表進程:
alter system kill session 'SID,serial#';
我跟你碰到類似的情況,重新查了好多次,用alter語句殺了好幾次還是殺不掉。最后是通過把該用戶的所有連接會話都調出來。通過PL/SQL的工具----會話 ;然后把通過JDBC連接池的會話中帶insert 的會話手動關掉就行。(我是提前查明是通過kettle插入數據庫數據時發(fā)生鎖表,只是把程序關了還是無法解鎖,然后知道kettle程序是通過JDBC連接池發(fā)起的會話)
1. 先通過top命令查看產用資源較多的spid號
2.查詢當前耗時的會話ID,用戶名,sqlID等:
select sid,serial#,machine,username,program,sql_hash_value,sql_id,
? to_char(logon_time,'yyyy/mm/dd hh24:mi:ss') as login_time from v$session
where paddr in (select addr from v$process where spid in ('5648612','256523'));
3. 如果上一步sql_id或者 hash_value不為空,則可用v$sqlarea查出當前正在使用的sql
select sql_text
from v$sqltext_with_newlines
where hash_value = hash_value
order by piece;
也可直接使用:
select a.*,b.SQL_TEXT from (
select sid,serial#,machine,username,program,sql_hash_value,sql_id,
? to_char(logon_time,'yyyy/mm/dd hh24:mi:ss') as login_time from v$session
where paddr in (select addr from v$process where spid in ('23226'))
) a,v$sql b
where a.sql_id? = b.SQL_ID(+)
4.kill占用大資源的session
Alter system kill session 'SID,SERIAL#'
解鎖:
1.查詢哪些對象被鎖:
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;
2.下面的語句用來殺死一個進程:
alter system kill session '524,1095'; (其中24,111分別是上面查詢出的sid,serial#)
3.再一次查詢目前鎖定的對象,若發(fā)現以上方法不能解除鎖定的表,則用以下方法:
3.1 執(zhí)行下面的語句獲得進程(線程)號:
select spid, osuser, s.program
from v$session s,v$process p
where s.paddr=p.addr and s.sid=524 (524是上面的sid)