博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
orakill和ALTER SYSTEM KILL SESSION有何区别
阅读量:2451 次
发布时间:2019-05-10

本文共 3588 字,大约阅读时间需要 11 分钟。

orakill和ALTER SYSTEM KILL SESSION有何区别
2008-04-16 16:10

一个用户进程偶尔会挂起或占用过多资源而拒绝其它会话。如果 DBA 依然能够访问数据库,她通常可以发出以下查询:
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;
select 'alter system kill session ',''''||trim(t2.sid)||','||trim(t2.serial#)||''';'
from v$locked_object t1,v$session t2 where t1.session_id=t2.sid order by t2.logon_time;
这个查询将返回数据库用户名、操作系统用户名、会话 ID,序列号和系统进程 ID(SPID)。然后,DBA 用户就可以发出以下命令(前面的查询返回的使用 SID 和SERIAL# 信息):
ALTER SYSTEM KILL SESSION 'sid,serial#';
ALTER SYSTEM KILL SESSION '9,203';
使用这条语句有两个问题。
第一:分配给这个进程的任何锁或资源在会话完全超时之前不会被释放。
第二:查询和 kill 命令需要能够访问数据库。如果一个进行失去控制,那么数据库访问可能会出现问题。
在一个 UNIX 数据库中,下一步是 ps 命令输出的 UNIX 提示中定位进程(同样是查找 OSUSER 和 SPID 等 ID)然后使用 kill -9 spid 结束失控的后台进程。然而,在 Windows 中,只有一个进程 ORACLE.EXE,而且用户连接是在 Windows 线程中处理的,而不在进程中处理的。如果使用 Windows 任务管理器结束 Oracle 线程,就有可能影响所有用户和后台线程,并导致数据库崩溃。
出于这些原因,Oracle 在Oracle Home/bin 目录下提供了一个 orakill.exe 命令,这个命令的参数与ALTER SYSTEM KILL SESSION 相同,但是不要求数据库连接。要定位一个特定的线程,需要寻找一个能够显示属于一个进程的所有线程的程序。Windows 任务管理器只能显示线程数和进程。你需要从微软的资源工具包中寻找一个用于 Windows 2000 和 NT 的工具程序,比如免费的QuickSlice,或者Qslice.exe(该工具是基于 Windows 的),或者PStat(Pstat.exe 是一个命令行工具)。简单地在 orakill 命令后输入线程 ID(以十进制表示)和 SID 即可:
orakill
orakill ORCL 2760
"Kill of thread id 2760 in instance ORCL successfully signalled[sic]."
应该只有在不能访问数据库来执行ALTER SYSTEM KILL SESSION 的情况才使用orakill。如果意外结束了一个必要的后台进程,比如 PMON,那么很可能会导致数据库崩溃。新手永远不要这样做。
Orakill的使用方法如下:
Dos提示符下:>orakill sid thread
说明: sid Oracle的Sid号
   thread   Oracle的线程id号
在Sql*plus工具里面可以查询到Oracle的线程号
sql:>Select p.spid THREADID, s.osuser, s.program
sql:>From v$process p, v$session s
sql:>Where p.addr = s.paddr
结果如下:
THREADID   OSUSER                PROGRAM
--------- ----------------------- -----------------------------
169    SYSTEM                ORACLE.EXE
215    SYSTEM                ORACLE.EXE
280    SYSTEM                ORACLE.EXE
267    SYSTEM                ORACLE.EXE
287    SYSTEM                ORACLE.EXE
288    SYSTEM                ORACLE.EXE
271    SYSTEM                ORACLE.EXE  
282    SYSTEM                ORACLE.EXE  
239    PROD_NTdjones       SVRMGRL.EXE
281    SSMITH-PCssmith        SQLPLUSW.EXE
12 rows selected.
需要注意的是,如果你Kill掉的是Oracle的核心后台线程(DBWR, LGWR, SMON or PMON),将导致Oracle实例关闭。检查Oracle的核心后台线程的方法如下:
sql:>Select vb.name NOME, vp.programe PROCESSNAME, vp.spid THREADID, vs,sid SID
sql:>From v$session vs, v$process vp, v$bgprocess vb
sql:>Where vb.addr <> ‘00’ and
sql:>vb.paddr = vp.addr and
sql:>vp.addr = vs.paddr
查询结果如下:
NOME   PROCESSNAME                      THREADID   SID
----- ----------------------------------- --------- ------
PMON   ORACLE.EXE                          169    1
DBW0   ORACLE.EXE                          215    2
LGWR   ORACLE.EXE                          280    3
CKPT   ORACLE.EXE                          267    4
SMON   ORACLE.EXE                          287    5
RECO   ORACLE.EXE                          288    6
SNP0   ORACLE.EXE                          271    7
SNP1   ORACLE.EXE                          282    8
8 rows selected.
window xp + oracle 9.2.0.1
================
orakill的用法
================
SQL> SELECT spid, osuser, s.program,sid
                FROM v$process p, v$session s
                WHERE p.addr=s.paddr;
SPID                   OSUSER             PROGRAM             SID
------------------------ -------------------- --------------- ----------
6928                   SYSTEM             ORACLE.EXE             1
5272                   SYSTEM             ORACLE.EXE             2
7008                   SYSTEM             ORACLE.EXE             3
6588                   SYSTEM             ORACLE.EXE             4
6780                   SYSTEM             ORACLE.EXE             5
6128                   SYSTEM             ORACLE.EXE             6
6740                   SYSTEM             ORACLE.EXE             7
6684                   SYSTEM             ORACLE.EXE             8
7092                   SYSTEM             ORACLE.EXE             9
6272                   SYSTEM             ORACLE.EXE              10
4760                   lifeng.fang       sqlplus.exe          12
SPID                   OSUSER             PROGRAM             SID
------------------------ -------------------- --------------- ----------
6484                   lifeng.fang       sqlplus.exe          11
4284
语法:orakill 实例名 spid   (在win上是线程号)
SQL> host orakill charset 6484;
Kill of thread id 6484 in instance charset successfully signalled.
spid是os进程ID
pid是Oracle process ID

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12137615/viewspace-566896/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/12137615/viewspace-566896/

你可能感兴趣的文章
使用Express和MongoDB构建CRUD应用程序-第2部分
查看>>
node.js ejs_如何在Node.js应用程序中使用EJS模板
查看>>
lynda ux_UX编排原理
查看>>
种子接近,随机数也接近吗_接近代码,接近爸爸
查看>>
创建微信机器人和女朋友聊天_创建聊天机器人
查看>>
scrum master_从Scrum Master到工程副总裁:职称为何重要
查看>>
sdlc 瀑布式 生命周期_SDLC指南–软件开发生命周期的阶段和方法
查看>>
大omega记号_什么是大欧米茄符号?
查看>>
react 使用 mobx_如何使用React和MobX状态树构建基于状态的路由器
查看>>
移动认证_如何在移动设备上实施安全的生物特征认证
查看>>
敏捷开发创始人_开发人员和技术创始人如何将他们的想法转化为UI设计
查看>>
node aws 内存溢出_在AWS Elastic Beanstalk上运行生产Node应用程序的现实
查看>>
我如何在昌迪加尔大学中心组织Google Hash Code 2019
查看>>
子集和与一个整数相等算法_背包问题的一个变体:如何解决Java中的分区相等子集和问题...
查看>>
aws中部署防火墙_如何在AWS中设置自动部署
查看>>
typescript_如何掌握高级TypeScript模式
查看>>
golang底层深入_带有Golang的GraphQL:从基础到高级的深入研究
查看>>
如何选择正确的容器编排以及如何进行部署
查看>>
出现字迹模糊迹象_改变迹象:如何使用动态编程解决竞争性编程问题
查看>>
angular 渐进_如何创建具有Angular和无头CMS的渐进式Web应用程序
查看>>