由于在PLSQL Developer执行update或某种操作时没有commit,导致oracle将该条记录锁住了。
处理思路:
(1)通过相关语句查找出占用该表资源的会话sid和serial#,以及process。
(2)找到相关信息之后,需要杀会话,杀process进程。
解决办法:
1. 通过v$locked_object、dba_objects、v$session和v$process等视图查找锁住的记录(要确认你的数据库用户有操作的权限,否则会报错“ORA-00942: table or view does not exist”,代表当前用户没有操作这张表的权限)(sql未执行过,没权限,字段与表的对应关系可能需要完善下)。
select object_name,
machine,
s.program,
s.sid,
s.serial#
p.spid as os_pid,
s.sql_address,
l.locked_mode,
s.username,
s.process,
s.sql_id
from v$locked_object l,dba_objects o,v$session s,v$process p
where l.object_id=o.object_id
and l.session_id=s.sid
and s.paddr=p.addr
and object_name='表名' and o.owner='数据库用户名'
order by 1;
-- ORDER BY 1 表示 所select 的字段按第一个字段排序,
-- ORDER BY ASC应该没有这样写法,ORDER BY 后面不是字段就是数字,
-- 可以ORDER BY 1 ASC 或者ORDER BY COL1 ASC,
-- ASC表示按升序排序,DESC表示按降序排序。
2. 根据SQL_ID查找对应的SQL语句。了解下这个操作是否导致资源繁忙。
SELECT SQL_TEXT FROM V$SQLTEXT WHERE SQL_ID = '7qaxjdqwm4tkf' ORDER BY PIECE;
delete from /*+parallel(t,4)*/ from ZJDB.T_TABLE t where id=10;
3. 杀会话。杀会话也不是那么容易就能杀掉的喔,需要等待一些时间。
alter system KILL session 'sid,serial#';
sid,serial#是‘1’中查找出来的值,例如:
alter system kill session '5489,21743';
4. 查看会话的状态。
select sid,serial#,status from v$session where sid =5489 and serial#=21743;
5. 查process进程。
$ps -ef|grep 4392874
0 17:09:20 pts/0 0:00 grep 4202874
9 10:08:17 - 19:18 oracle RAZJDB1 (LOCAL=NO) --刷出非本地连接信息
$ps -ef|grep 4392874 |grep LOCAL=NO|awk '{print " -9 "$2}' --刷出可以直接用于kill的信息
-9 4392874
$ps -ef|grep 4392874 |grep LOCAL=NO|awk '{print " -9 "$2}'|xargs kill --杀process
$
6. 查看会话是否存在。
alter system kill session '5489,21743';
alter system kill session '5489,21743'
*
ERROR at line 1:
ORA-00030: User session ID does not exist.