一、问题的提出
很多的时候我们迅速的杀掉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的,需要用到sidspid两个值,所用的命令也由kill替换为Orakill,格式为:orakill sid spid
      C:\>orakill 941 13824
d 再查一下v$session,看会话在不在了。
2 如何谋杀掉所有的Oracle的用户的进程呢?
awindows的环境,执行如下图中的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.通过查出已被锁定的数据库表及相关的sidserial#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#';
    --sidserial#为第一步查出来的数据
    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是基础信息视图,用于寻用户SIDSADDR
常用列:
SIDSESSION标识
SERIAL#:如果某个SID又被其它的session使用的话则此数值自增加(当一个SESSION结束,另一个SESSION开始并使用了同一个SID)
AUDSID:审查session ID唯一性,确认它通常也用于当寻并行查询模式
USERNAME:当前sessionoracle中的用户名。
STATUS:这列用来判断session状态是:
  Achtive:正执行SQL语句(waiting for/using a resource)
  Inactive:等待操作(即等待需要执行的SQL语句)
  Killed:被标注为删除
  v$process视图
v$process视图包含当前系统Oracle运行的所有进程信息。常被用于将Oracle或服务进程的操作系统进程ID与数据库session之间建立联系。
常用列:
ADDR:进程对象地址
PIDoracle进程ID
SPID:操作系统进程ID
----------------------------------------------------v$session深入學習--------------------------------------------------------
  在本视图中,每一个连接到数据库实例中的session都拥有一条记录。包括用户session及后台进程如DBWRLGWRarcchiver等等。

V$SESSION中的常用列
V$SESSION是基础信息视图,用于寻用户SIDSADDR。不过,它也有一些列会动态的变化,可用于检查用户。如例:
SQL_HASH_VALUESQL_ADDRESS:这两列用于鉴别默认被session执行的SQL语句。如果为null0,那就说明这个session没有执行任何SQL语句。PREV_HASH_VALUEPREV_ADDRESS两列用来鉴别被session执行的上一条语句。
注意:当使用SQL*Plus进行选择时,确认你重定义的列宽不小于11以便看到完整的数值。
STATUS:这列用来判断session状态是:
Achtive:正执行SQL语句(waiting for/using a resource)
Inactive:等待操作(即等待需要执行的SQL语句)
Killed:被标注为删除
下列各列提供session的信息,可被用于当一个或多个combination未知时到session
Session信息
SIDSESSION标识,常用于连接其它列
SERIAL#:如果某个SID又被其它的session使用的话则此数值自增加(当一个SESSION结束,另一个SESSION开始并使用了同一个SID)
AUDSID:审查session ID唯一性,确认它通常也用于当寻并行查询模式
USERNAME:当前sessionoracle中的用户名。
Client信息
数据库session被一个运行在数据库服务器上或从中间服务器甚至桌面通过SQL*Net连接到数据库的客户端进程启动,下列各列提供这个客户端的信息
OSUSER:客户端操作系统用户名
MACHINE:客户端执行的机器
TERMINAL:客户端运行的终端
PROCESS:客户端进程的ID
PROGRAM:客户端执行的客户端程序
要显示用户所连接PC TERMINALOSUSER,需在该PCORACLE.INIWindows中设置关键字TERMINALUSERNAME
Application信息
调用DBMS_APPLICATION_INFO包以设置一些信息区分用户。这将显示下列各列。
CLIENT_INFODBMS_APPLICATION_INFO中设置
ACTIONDBMS_APPLICATION_INFO中设置
MODULEDBMS_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

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。