一、问题的提出
很多的时候我们迅速的杀掉Oralcle的一些session,理由大体如下:
1、 一些时候,由于我们的数据量很大,相应的事务大并且多,在做shutdown immediate的时候会花费好多的时间,而我们却想用shutdown immediate的方式,而又要把数据库迅速的shutdown下来。
2、 我们的应用可能使用了会话控制,即在应用的层面控制了一些用户的连接的数量。但有时可能网络发生的瞬断,从而就产生了一些死进程,他们的状态为 Inactive的状态。当我们用alter system kill session ‘sid,serial#’进行清除时,这些session的状态又变成了killed,这些就由Pmon进程来慢慢进行清除了,而你恰恰又是个急脾气。
3、 系统忽然慢了现来,你发现是某个session在做怪,想迅速把它迅速结束掉。
二、处理方法
其实处理方法很简单,是被一些人称为“谋杀”的一种方法。因为一个session会对应着操作系统中相应的一个进程(process),我们不使用 Alter system kill session这种方式了,取而代之则是kill的方式,当session的后台进程被杀掉了,便会促使懒散的Pmon进程迅速进行清理工作。
很多的时候我们迅速的杀掉Oralcle的一些session,理由大体如下:
1、 一些时候,由于我们的数据量很大,相应的事务大并且多,在做shutdown immediate的时候会花费好多的时间,而我们却想用shutdown immediate的方式,而又要把数据库迅速的shutdown下来。
2、 我们的应用可能使用了会话控制,即在应用的层面控制了一些用户的连接的数量。但有时可能网络发生的瞬断,从而就产生了一些死进程,他们的状态为 Inactive的状态。当我们用alter system kill session ‘sid,serial#’进行清除时,这些session的状态又变成了killed,这些就由Pmon进程来慢慢进行清除了,而你恰恰又是个急脾气。
3、 系统忽然慢了现来,你发现是某个session在做怪,想迅速把它迅速结束掉。
二、处理方法
其实处理方法很简单,是被一些人称为“谋杀”的一种方法。因为一个session会对应着操作系统中相应的一个进程(process),我们不使用 Alter system kill session这种方式了,取而代之则是kill的方式,当session的后台进程被杀掉了,便会促使懒散的Pmon进程迅速进行清理工作。
1、 以一个session做以示例,
a、 到你要杀掉的那个session, oracle 新建用户并记下paddr
b、 到这个session所对应的spid
c、 杀掉spid所标识的那个进程
♀如果你的Oracle是在Unix平台上的,可以用kill。
$kill 13824
♀如果你的Oracle是在windown平台上的,有一些的不同,因为windown是以thead来代替process的,需要用到sid和spid两个值,所用的命令也由kill替换为Orakill,格式为:orakill sid spid
C:\>orakill 941 13824
d、 再查一下v$session,看会话在不在了。
a、 到你要杀掉的那个session, oracle 新建用户并记下paddr
b、 到这个session所对应的spid
c、 杀掉spid所标识的那个进程
♀如果你的Oracle是在Unix平台上的,可以用kill。
$kill 13824
♀如果你的Oracle是在windown平台上的,有一些的不同,因为windown是以thead来代替process的,需要用到sid和spid两个值,所用的命令也由kill替换为Orakill,格式为:orakill sid spid
C:\>orakill 941 13824
d、 再查一下v$session,看会话在不在了。
2、 如何谋杀掉所有的Oracle的用户的进程呢?
a、windows的环境,执行如下图中的SQL,并把结果存成.bat的文件,比如kill.bat, 执行一下kill.bat就可以了。
select 'orakill '||sid||' '||spid as thread from
sys.v_$process p, sys.v_$session s
where sid > 6 and
p.addr = s.paddr ;
b、 Unix的环境相对来说就简单多了,执行如下的命令就可以了
$ ps -ef|grep $ORACLE_SID|grep -v ora_|grep LOCAL=NO|awk '{print $2}'|xargs kill
然后你再shutdown immediate就很快的了。
有一些死锁进程,异常退出后用
alter system kill session 'sid, serial#';无法释放会话
可从操作系统直接处理。
-
--------------------------oracle查并杀掉锁表及对象的session及相关系统进程-------------------------
一、处理过程 1.通过查出已被锁定的数据库表及相关的sid、serial#及spid: select object_name as 对象名称,s.sid,s.serial#,p.spid as 系统进程号 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; 2.在数据库中灭掉相关session: alter system kill session 'sid,serial#'; --sid及serial#为第一步查出来的数据 3.从系统中灭掉与该session对应的进程: kill -9 spid; --spid为第一步中查出来的系统进程号 经过以上操作之后重新对之前锁定的对象进行操作应该就可以了。 二、使用了相关表的基本介绍 V$LOCKED_OBJECT中的列说明: XIDUSN:回滚段号 XIDSLOT:槽号 XIDSQN:序列号 OBJECT_ID:被锁对象ID SESSION_ID:持有锁的sessionID ORACLE_USERNAME:持有锁的Oracle 用户名 OS_USER_NAME:持有锁的操作系统 用户名 PROCESS:操作系统进程号 LOCKED_MODE:锁模式 dba_objects的列说明(网上的,懒得翻译了^_^) OWNER Username of the owner of the object OBJECT_NAME 名称对象 SUBOBJECT_NAME 名称的子对象(例如, partititon ) OBJECT_ID 对象的对象数目 DATA_OBJECT_ID 对象数量的部分,其中载对象 OBJECT_TYPE 类型的对象 产生的 时间戳为创建对象 LAST_DDL_TIME 时间戳最后DDL变化(包括赠款和撤消)的目标 时间戳 时间戳的规范对象 状态 地位的对象 临时 可在本届会议只能看到数据,它在这个对象本身? 产生 的名字是这个对象系统生成的? 二次 这是一个中学创建的对象的一部分icreate域指标 v$session的说明 V$SESSION是基础信息视图,用于寻用户SID或SADDR 常用列: SID:SESSION标识 SERIAL#:如果某个SID又被其它的session使用的话则此数值自增加(当一个SESSION结束,另一个SESSION开始并使用了同一个SID)。 AUDSID:审查session ID唯一性,确认它通常也用于当寻并行查询模式 USERNAME:当前session在oracle中的用户名。 STATUS:这列用来判断session状态是: Achtive:正执行SQL语句(waiting for/using a resource) Inactive:等待操作(即等待需要执行的SQL语句) Killed:被标注为删除 v$process视图 v$process视图包含当前系统Oracle运行的所有进程信息。常被用于将Oracle或服务进程的操作系统进程ID与数据库session之间建立联系。 常用列: ADDR:进程对象地址 PID:oracle进程ID SPID:操作系统进程ID |
----------------------------------------------------v$session深入學習--------------------------------------------------------
在本视图中,每一个连接到数据库实例中的session都拥有一条记录。包括用户session及后台进程如DBWR,LGWR,arcchiver等等。
V$SESSION中的常用列
V$SESSION中的常用列
V$SESSION是基础信息视图,用于寻用户SID或SADDR。不过,它也有一些列会动态的变化,可用于检查用户。如例:
SQL_HASH_VALUE,SQL_ADDRESS:这两列用于鉴别默认被session执行的SQL语句。如果为null或0,那就说明这个session没有执行任何SQL语句。PREV_HASH_VALUE和PREV_ADDRESS两列用来鉴别被session执行的上一条语句。
SQL_HASH_VALUE,SQL_ADDRESS:这两列用于鉴别默认被session执行的SQL语句。如果为null或0,那就说明这个session没有执行任何SQL语句。PREV_HASH_VALUE和PREV_ADDRESS两列用来鉴别被session执行的上一条语句。
注意:当使用SQL*Plus进行选择时,确认你重定义的列宽不小于11以便看到完整的数值。
STATUS:这列用来判断session状态是:
Achtive:正执行SQL语句(waiting for/using a resource)
Inactive:等待操作(即等待需要执行的SQL语句)
Killed:被标注为删除
Inactive:等待操作(即等待需要执行的SQL语句)
Killed:被标注为删除
下列各列提供session的信息,可被用于当一个或多个combination未知时到session。
Session信息
SID:SESSION标识,常用于连接其它列
SERIAL#:如果某个SID又被其它的session使用的话则此数值自增加(当一个SESSION结束,另一个SESSION开始并使用了同一个SID)。
AUDSID:审查session ID唯一性,确认它通常也用于当寻并行查询模式
USERNAME:当前session在oracle中的用户名。
SID:SESSION标识,常用于连接其它列
SERIAL#:如果某个SID又被其它的session使用的话则此数值自增加(当一个SESSION结束,另一个SESSION开始并使用了同一个SID)。
AUDSID:审查session ID唯一性,确认它通常也用于当寻并行查询模式
USERNAME:当前session在oracle中的用户名。
Client信息
数据库session被一个运行在数据库服务器上或从中间服务器甚至桌面通过SQL*Net连接到数据库的客户端进程启动,下列各列提供这个客户端的信息
OSUSER:客户端操作系统用户名
数据库session被一个运行在数据库服务器上或从中间服务器甚至桌面通过SQL*Net连接到数据库的客户端进程启动,下列各列提供这个客户端的信息
OSUSER:客户端操作系统用户名
MACHINE:客户端执行的机器
TERMINAL:客户端运行的终端
PROCESS:客户端进程的ID
PROGRAM:客户端执行的客户端程序
要显示用户所连接PC的 TERMINAL、OSUSER,需在该PC的ORACLE.INI或Windows中设置关键字TERMINAL,USERNAME。
TERMINAL:客户端运行的终端
PROCESS:客户端进程的ID
PROGRAM:客户端执行的客户端程序
要显示用户所连接PC的 TERMINAL、OSUSER,需在该PC的ORACLE.INI或Windows中设置关键字TERMINAL,USERNAME。
Application信息
调用DBMS_APPLICATION_INFO包以设置一些信息区分用户。这将显示下列各列。
CLIENT_INFO:DBMS_APPLICATION_INFO中设置
ACTION:DBMS_APPLICATION_INFO中设置
MODULE:DBMS_APPLICATION_INFO中设置
下列V$SESSION列同样可能会被用到:
ROW_WAIT_OBJ#
ROW_WAIT_FILE#
ROW_WAIT_BLOCK#
调用DBMS_APPLICATION_INFO包以设置一些信息区分用户。这将显示下列各列。
CLIENT_INFO:DBMS_APPLICATION_INFO中设置
ACTION:DBMS_APPLICATION_INFO中设置
MODULE:DBMS_APPLICATION_INFO中设置
下列V$SESSION列同样可能会被用到:
ROW_WAIT_OBJ#
ROW_WAIT_FILE#
ROW_WAIT_BLOCK#
ROW_WAIT_ROW#
V$SESSION中的连接列
Column View Joined Column(s)
SID V$SESSION_WAIT,,V$SESSTAT,,V$LOCK,V$SESSION_EVENT,V$OPEN_CURSOR SID
(SQL_HASH_VALUE, SQL_ADDRESS) V$SQLTEXT, V$SQLAREA, V$SQL (HASH_VALUE, ADDRESS)
(PREV_HASH_VALUE, PREV_SQL_ADDRESS) V$SQLTEXT, V$SQLAREA, V$SQL (HASH_VALUE, ADDRESS)
TADDR V$TRANSACTION ADDR
PADDR V$PROCESS ADDR
SID V$SESSION_WAIT,,V$SESSTAT,,V$LOCK,V$SESSION_EVENT,V$OPEN_CURSOR SID
(SQL_HASH_VALUE, SQL_ADDRESS) V$SQLTEXT, V$SQLAREA, V$SQL (HASH_VALUE, ADDRESS)
(PREV_HASH_VALUE, PREV_SQL_ADDRESS) V$SQLTEXT, V$SQLAREA, V$SQL (HASH_VALUE, ADDRESS)
TADDR V$TRANSACTION ADDR
PADDR V$PROCESS ADDR
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论