你遇到过下面类似的情况吗?一个用户进程长期占用资源而不释放 导致Oracle进程占用了系统的大量资源 Oralce系统的效率变得很低 如果简单的关闭重启Oracle 实例 势必影响所有的用户 有没有办法仅仅只Kill掉有问题的用户进程而不用关闭整个Oralce实例呢?答案是可以的 使用Oralce提供的一个名叫Orakill的工具 大家都知道 Windows 是一个基于线程的操作系统 而不是象Unix Linux那样基于进程的操作系统 整个Oracle的后台进程 用户进程等 在Windows 环境下 都包含在ORACLE EXE这单独的一个体系进程中了 通过查看 任务管理器 ―― 进程 就可以看到 如果你不是使用MTS多线程服务器的模式 如果你Kill掉ORACLE EXE这个进程 将导致整个Oracle实例关闭 如同使用Shutdown abort命令一样 由于Windows自己没有提过一个专门用来Kill掉单个线程的工具 因此Oracle从Oracle 开始 自己提供了一个基于字符界面的用来在Windows环境下强制Kill掉一个线程的工具――Orakill Orakill的使用方法如下 Dos提示符下:orakill sid thread说明 sid Oracle的Sid号thread Oracle的线程id号在Sql*plus工具里面可以查询到Oracle的线程号sql:Select p spid THREADID s osuser s programsql:From v$process p v$session ssql:Where p addr = s addr结果如下 THREADID OSUSER PROGRAM SYSTEM ORACLE EXE SYSTEM ORACLE EXE SYSTEM ORACLE EXE SYSTEM ORACLE EXE SYSTEM ORACLE EXE SYSTEM ORACLE EXE SYSTEM ORACLE EXE SYSTEM ORACLE EXE PROD_NT\djones SVRMGRL EXE SSMITH PC\s *** ithSQLPLUSW EXE rows selected 需要注意的是 如果你Kill掉的是Oracle的核心后台线程(DBWR LGWR SMON or PMON) 将导致Oracle实例关闭 检查Oracle的核心后台线程的方法如下 sql:Select vb name NOME vp programe PROCESSNAME vp spid THREADID vs sid SIDsql:From v$session vs v$process vp v$bgprocess vbsql:Where vb addr andsql:vb paddr = vp addr andsql:vp addr = vs paddr查询结果如下 NOME PROCESSNAME THREADID SID PMON ORACLE EXE DBW ORACLE EXE LGWR ORACLE EXE CKPT ORACLE EXE SMON ORACLE EXE RECO ORACLE EXE SNP ORACLE EXE SNP ORACLE EXE rows selected lishixinzhi/Article/program/Oracle/201311/18840
创新互联建站一直在为企业提供服务,多年的磨炼,使我们在创意设计,网络营销推广到技术研发拥有了开发经验。我们擅长倾听企业需求,挖掘用户对产品需求服务价值,为企业制作有用的创意设计体验。核心团队拥有超过十载以上行业经验,涵盖创意,策化,开发等专业领域,公司涉及领域有基础互联网服务服务器托管、成都app开发、手机移动建站、网页设计、网络整合营销。
方法/步骤
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 '137,233'; (其中137,223分别是上面查询出的sid,serial#)
PS.以上两步,可通过Oracle的管理控制台来执行。
如果利用上面的方法杀死进程后,进程状态虽被置为"killed",但是锁定的资源很长时间没有被释放,那么可以在OS一级再杀死相应的进程(线程)
1.首先获得进程(线程)号:
select spid, osuser, s.program
from v$session s,v$process p
where s.paddr=p.addr and s.sid=137 (137是上面的sid)
2.在OS上杀死这个进程(线程):
1)在unix上,用root身份执行命令:
#kill -9 12345(即上面查询出的spid)
2)在windows(unix也适用)用orakill杀死线程,例:c:orakill orcl 12345
orakill是oracle提供的一个可执行命令,语法为:orakill sid thread
其中:
sid:表示要杀死的进程属于的实例名
thread:是要杀掉的线程号,即上面查询出的spid。
1.关闭oracle所有的服务。可以在windows的服务管理器中关闭;\x0d\x0a\x0d\x0a 2.打开注册表:regedit 打开路径:\x0d\x0a HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ \x0d\x0a 删除该路径下的所有以oracle开始的服务名称,这个键是标识Oracle在windows下注册的各种服务!\x0d\x0a \x0d\x0a 3.打开注册表,找到路径:\x0d\x0a HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\x0d\x0a 删除该oracle目录,该目录下注册着Oracle数据库的软件安装信息。\x0d\x0a \x0d\x0a 4.删除注册的oracle事件日志,打开注册表\x0d\x0a HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\x0d\x0a 删除注册表的以oracle开头的所有项目。\x0d\x0a \x0d\x0a 5.删除环境变量path中关于oracle的内容。\x0d\x0a 鼠标右键右单击“我的电脑--属性--高级--环境变量--PATH 变量。\x0d\x0a 删除Oracle在该值中的内容。注意:path中记录着一堆操作系统的目录,在windows中各个目录之间使用分号(;)隔开的,删除时注意。\x0d\x0a 建议:删除PATH环境变量中关于Oracle的值时,将该值全部拷贝到文本编辑器中,找到对应的Oracle的值,删除后,再拷贝修改的串,粘贴到PATH环境变量中,这样相对而言比较安全。\x0d\x0a \x0d\x0a 6.重新启动操作系统。\x0d\x0a 以上1~5个步骤操作完毕后,重新启动操作系统。\x0d\x0a \x0d\x0a 7.重启操作系统后各种Oracle相关的进程都不会加载了。这时删除Oracle_Home下的所有数据。(Oracle_Home指Oracle程序的安装目录)\x0d\x0a \x0d\x0a 8.删除C:\Program Files下oracle目录。\x0d\x0a (该目录视Oracle安装所在路径而定)\x0d\x0a \x0d\x0a 9.删除开始菜单下oracle项,如:\x0d\x0a C:\Documents and Settings\All Users\「开始」菜单\程序\Oracle - Ora10g\x0d\x0a 不同的安装这个目录稍有不同。\x0d\x0a 如果不删除开始菜单下的Oracle相关菜单目录,没关系,这个不影响再次安装Oracle.当再次安装Oracle时,该菜单会被替换。\x0d\x0a \x0d\x0a 至此,Windows平台下Oracle就彻底卸载了。
oracle死锁时杀进程的方法:
第一步:尝试在sqlplus中通过sql命令进行删除,如果能够删除成功,则万事大吉。但通常情况下,出现死锁时,想通过命令行或者通过oracle的管理工具删除有死锁的session,oracle只会将该session标记为killed,但无法清除掉,往往需要通过第二步在操作系统层级进行删除。
第二步:
1、select xidusn, object_id, session_id, locked_mode from v$locked_object; --查死锁的对象,获取其SESSION_ID。
2、select username,sid,serial# from v$session where sid=29; --根据上步获取到的sid查看其serial#号。
3、alter system kill session '29,57107'; --删除进程,如已经删除过,则会报ora-00031的错误;否则oracle会将该session标记为killed状态,等待一段时间看能否会自动消失,如长时间消失不掉,则需要做后续步骤。
一些ORACLE中的进程被杀掉后,状态被置为"killed",但是锁定的资源很长时间不释放,有时实在没办法,只好重启数据库。现在提供一种方法解决这种问题,那就是在ORACLE中杀不掉的,在OS一级再杀。