今天在数据库的v$locked_object视图 里发现一个923号session,用户是SYS,一直持有对 PLAN_TABLE表的锁不释放,PLAN_TABLE是存储SQL执行计划的,很奇怪。
select sid,serial#,paddr,username,server,schemaname,osuser,terminal,program from v$session where sid=923
SID SERIAL# PADDR USERNAME SERVER SCHEMANAME OSUSER TERMINAL PROGRAM
923 42779 0700000C8F3D9588 SYS PSEUDO SYS oracle pts/2 sqlplus@p5b1 (TNS V1-V3)
查看进程信息:
select * from v$process where addr='0700000C8F3D9588'
发现spid的值为234178,这个也就是操作系统的进程id:
DB2@/ora_arch>ps -ef|grep 234178
oracle 413964 807630 0 15:00:19 pts/1 0:00 grep 234178
oracle 234178 623538 0 May 04 - 0:39 oraclebanpingdb2 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
通过检查一些操作日志发现5月4号,青年节这天确实有人登录执行过一个SQL:
SQL> create or replace procedure show_space(...
然后异常退出了,那么可以断定就是这个session一直僵死在这里了。
这时在数据库端杀session:
alter system kill session '923,42779'
从v$session看oracle只是把这个session标记为killed了,v$process虽然也查不到了,但是os层面的进程还在,杀之:
DB2@/ora_arch>kill -9 234178
然后再看,这个session已经被清理掉消失了:
select * from v$session where status='KILLED'
这种进程在oracle实例关闭的时侯会在alert日志里记录:
Process OS id : 271052 alive after kill
Errors in file /u01/admin/banpingdb/udump/banpingdb1_ora_865116.trc