当前位置:首页 >> 计算机软件及应用 >>

oracle 数据库 快速解决实时生产库中,包不能编译,死锁等问题

快速解决实时生产库中,包不能编译,死锁等问题

1、使用 PLSQL 登陆该用户,执行如下 SQL,查看一下是否有 oracle 自己的进程. Select a.Username, a.SID, a.SERIAL# ,b.Sql_Text,c.spid From V$Session a, V$Sqlarea b,v$process c Where a.Username Is Not Null And (a.Sql_Address = b.Address Or a.Prev_Sql_Addr = b.Address) and a.PADDR=c.ADDR and c.SPID in( select spid from v$session s,v$process p where s.paddr=p.addr and s.sid in( select sid from v$session_wait )) 2、如果没有 ORACLE 进程则执行 Select ' kill -9 '|| spid From V$Session a, V$Sqlarea b,v$process c Where a.Username Is Not Null And (a.Sql_Address = b.Address Or a.Prev_Sql_Addr = b.Address) and a.PADDR=c.ADDR and c.SPID in( select spid from v$session s,v$process p where s.paddr=p.addr and s.sid in( select sid from v$session_wait )) 3、 先关掉系统使用的服务如 WEBSERVICE, 使用 telnet 工具或 SecureCRT 4.1 工具登陆到 unix 中的 oracle 用户下,拷贝粘贴如下命令,如有双机,最好两个机器都执行一下该杀进程的命令. 执行成功后则开始服务如(webservice),这样只快速解决由于包死锁带来的问题. 备注:改涉及医保接口的表结构或编码医保接口相关包,最好能把 HIS 或接口 WEBSERVICE 停 止后才进行修改,或晚上交易少的情况下进行变动

By wat 8/21/2009

解决行锁 select a.sql_text,b.sid,b.MACHINE,b.PROGRAM,b.serial#

from v$sqlarea a,v$session b,v$locked_object and c where a.address=b.sql_address b.sid=c.SESSION_ID

alter

system

kill

session

'180,

29757'

;

查 SPID select a.spid,b.sid,b.serial#,b.username from v$process a,v$session b where a.addr=b.paddr and b.status='KILLED' select spid, osuser, s.program from v$session s,v$process p where s.paddr=p.addr and s.sid='180' 用户 root 登陆后,进行 kill -9 spid;

一些 ORACLE 中的进程被杀掉后,状态被置为"killed",但是锁定的资源很长时间不释放,有时实在没办法,只好重启数据库。 但是 shutdown immediate 又怕可能进程杀不掉会一直停留在 shutdown immediate,直接 shutdown abort 又怕损坏数据库。 现在提供一种方法解决这种问题,那就是在 ORACLE 中杀不掉的,在 OS 一级再杀。 一些 ORACLE 中的进程被杀掉后,状态被置为"killed",但是锁定的资源很长时间不释放,有时实在没办法,只好重启数据库。 但是 shutdown immediate 又怕可能进程杀不掉会一直停留在 shutdown immediate,直接 shutdown abort 又怕损坏数据库。 现在提供一种方法解决这种问题,那就是在 ORACLE 中杀不掉的,在 OS 一级再杀。

1.下面的语句用来查询哪些对象被锁: SELECT S.USERNAME,S.OSUSER,S.SID,S.SERIAL#,P.SPID FROM V$SESSION S,V$PROCESS P WHERE S.PADDR=P.ADDR AND S.USERNAME IS NOT NULL;

2.下面的语句用来杀死一个进程: alter system kill session 'sid,serial#';

【注】以上两步,可以通过 Oracle 的管理控制台来执行。 如果出现题目的错误,可以 select a.spid,b.sid,b.serial#,b.username from v$process a,v$session b where a.addr=b.paddr and b.status='KILLED' ;

3.如果利用上面的命令杀死一个进程后,进程状态被置为"killed",但是锁定的资源很长时间没有被释放,那么可以在 os 一级再杀 死相应的进程(线程) ,首先执行下面的语句获得进程(线程)号: select spid, osuser, s.program from v$session s,v$process p where s.paddr=p.addr and s.sid=33 (33 就是上面的 sid)

4.在 OS 上杀死这个进程(线程) : 1)在 unix 上,用 root 身份执行命令: #kill -9 12345(即第 3 步查询出的 spid) 2)在 windows(unix 也适用)用 orakill 杀死线程,orakill 是 oracle 提供的一个可执行命令,语法为: orakill sid thread 其中: sid:表示要杀死的进程属于的实例名 thread:是要杀掉的线程号,即第 3 步查询出的 spid。 例:c:>orakill orcl 12345 Ps:这里要注意的是 kill OS 进程是在服务端操作,而不是你程序所在客户机。


相关文章:
Oracle常见死锁发生的原因以及解决方法
Oracle常见死锁发生的原因以及解决方法_电脑基础知识_IT/计算机_专业资料。简单介绍oracle数据库运行过程中死锁产生的原因及解决办法! ...
更多相关标签: