oracle中kill session的方法

简介:

 

在oracle中查找有多少表被锁住的方法:
 
select b.owner table_owner,b.object_name,c.username,c.sid,c.serial#
from v$locked_object a,dba_objects b,v$session c
where a.object_id=b.object_id and c.sid=a.session_id;
这样根据sid和serial#就可以直接杀掉(具体方法下面介绍)
 
查找一个表是否被锁的方法,例如:临时表SHZGY.SHZGY_PZ_BB_ERROR1

select object_id, owner||'.'||object_name object_name
from dba_objects
where owner='SHZGY'
and object_name like 'SHZGY_PZ_BB_ERROR1';
 OBJECT_ID OBJECT_NAME
---------- ----------------------------------
    105421 SHZGY.SHZGY_PZ_BB_ERROR1
找出该表的id1。
select * from v$lock where id1 = 105421;
ADDR     KADDR           SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK
-------- -------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
A08E1304 A08E1314         29 TO     105421          1          3          0    1209396          0
A08D4904 A08D4914         30 TO     105421          1          3          0    1295439          0
A08E1188 A08E1198         32 TO     105421          1          3          0    1284027          0
A08E12B8 A08E12C8         77 TO     105421          1          3          0    1209674          0
A08E11D4 A08E11E4        120 TO     105421          1          3          0    1280668          0
A08E1350 A08E1360        144 TO     105421          1          3          0    1209330          0
A08E1220 A08E1230        151 TO     105421          1          3          0    1279593          0
已选择7行。
说明有七个会话锁住该临时表。
 
如果可以kill,就可以 drop table shzgy.shzgy_pz_bb_error1;
select a.sid, a.SERIAL#, b.spid, a.status, a.PROGRAM
from v$session a, V$PROCESS b
where a.sid in (29, 30, 32, 77, 120, 144, 151)
and a.paddr=b.ADDR
order by a.sid;

       SID    SERIAL# SPID         STATUS   PROGRAM
---------- ---------- ------------ -------- ------------------------
        29        619 9738         INACTIVE JDBC Thin Client
        30         47 7608         INACTIVE JDBC Thin Client
        32        148 8014         INACTIVE JDBC Thin Client
        77        198 9736         INACTIVE JDBC Thin Client
       120        258 8204         INACTIVE JDBC Thin Client
       144         17 9762         INACTIVE JDBC Thin Client
       151        253 8232         INACTIVE JDBC Thin Client
这七个会话都是JDBC调用,status=INACTIVE。
然后根据这些调用和活动状态判断是否可以kill掉这些session。
如果可以就直接kill掉这些session:
使用dbms_system.set_sql_trace_in_session包来对这个session进行trace:
SQL > alter system kill session 'sid,SERIAL#' immediate;
这时这些session的状态就被标记为killed,Oracle会在该用户下一次touch时清除该进程。
我们发现当一个session被kill掉以后,该session的paddr被修改,如果有多个session被kill,那么多个session的paddr都被更改为相同的进程地址:
SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;
SADDR           SID    SERIAL# PADDR    USERNAME                       STATUS
-------- ---------- ---------- -------- ------------------------------ --------
542E0E6C         11        314 542B70E8 EYGLE                          INACTIVE
542E5044         18        662 542B6D38 SYS                            ACTIVE
SQL> alter system kill session '11,314';
System altered.
SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;
SADDR           SID    SERIAL# PADDR    USERNAME                       STATUS
-------- ---------- ---------- -------- ------------------------------ --------
542E0E6C         11        314 542D6BD4 EYGLE                          KILLED
542E5044         18        662 542B6D38  SYS                            ACTIVE
SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;
SADDR           SID    SERIAL# PADDR    USERNAME                       STATUS
-------- ---------- ---------- -------- ------------------------------ --------
542E0E6C         11        314 542D6BD4 EYGLE                          KILLED
542E2AA4         14        397 542B7498 EQSP                           INACTIVE
542E5044         18        662 542B6D38 SYS                            ACTIVE
SQL> alter system kill session '14,397';System altered.
SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;
SADDR           SID    SERIAL# PADDR    USERNAME                       STATUS
-------- ---------- ---------- -------- ------------------------------ --------
542E0E6C         11        314 542D6BD4 EYGLE                          KILLED
542E2AA4         14        397 542D6BD4 EQSP                           KILLED
542E5044         18        662 542B6D38 SYS                            ACTIVE
在这种情况下,很多时候,资源是无法释放的,我们需要查询spid,在操作系统级来kill这些进程.
 
方法:一个session会对应着操作系统中相应的一个进程(process),我们不使用Alter system kill session这种方式了,取而代之则是kill的方式,当session的后台进程被杀掉了,便会促使懒散的Pmon进程迅速进行清理工作。
以一个session做以示例,
a、  找到你要杀掉的那个session, 并记下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,看会话在不在了。
 




本文转自 vfast_chenxy 51CTO博客,原文链接:http://blog.51cto.com/chenxy/652307,如需转载请自行联系原作者
目录
相关文章
|
1月前
|
SQL Oracle 关系型数据库
Oracle数据库优化方法
【10月更文挑战第25天】Oracle数据库优化方法
54 7
|
7月前
|
Oracle 关系型数据库 MySQL
实时计算 Flink版操作报错之使用oracle-cdc的,遇到错误:ORA-01292: no log file has been specified for the current LogMiner session,该如何处理
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
3月前
|
Oracle 安全 关系型数据库
Oracle数据恢复—Oracle数据库误删除的数据恢复方法探讨
删除Oracle数据库数据一般有以下2种方式:delete、drop或truncate。下面针对这2种删除oracle数据库数据的方式探讨一下oracle数据库数据恢复方法(不考虑全库备份和利用归档日志)。
|
5月前
|
Oracle 关系型数据库 数据库
Oracle数据恢复—Oracle数据库误删除的数据恢复方法
相信有很多oracle数据库用户都遇到过在操作Oracle数据库时误删除某些重要数据的情况,这个时候如果数据库没有备份且数据十分重要的,怎么才能恢复误删除的数据呢?北亚企安数据恢复工程师下面简单介绍几个误删除Oracle数据库数据的恢复方法。
|
5月前
|
SQL 存储 Oracle
Oracle数据库中游标的工作原理与优化方法
Oracle数据库中游标的工作原理与优化方法
|
6月前
|
Oracle 关系型数据库 数据库
oracle误删除数据的恢复方法
oracle误删除数据的恢复方法
57 0
|
7月前
|
SQL Oracle 安全
Oracle的PL/SQL异常处理方法:守护数据之旅的“魔法盾”
【4月更文挑战第19天】Oracle PL/SQL的异常处理机制是保障数据安全的关键。通过预定义异常(如`NO_DATA_FOUND`)和自定义异常,开发者能优雅地管理错误。异常在子程序中抛出后会向上传播,直到被捕获,提供了一种集中处理错误的方式。理解和善用异常处理,如同手持“魔法盾”,确保程序在面对如除数为零、违反约束等挑战时,能有效保护数据的完整性和程序的稳定性。
|
7月前
|
Oracle 关系型数据库
oracle 修改表空间文件路径方法
oracle 修改表空间文件路径方法
|
7月前
|
SQL Oracle 关系型数据库
Oracle之替代OR的另一种方法
Oracle之替代OR的另一种方法
304 0
|
7月前
|
分布式计算 Oracle 关系型数据库
一种Oracle->PolarDB全量数据校验的实现方法
本文主要介绍如何在Oracle迁移PolarDB过程中,如何做全量校验,以及实现原理。
178 6
一种Oracle->PolarDB全量数据校验的实现方法