`

Oracle:彻底结束会话

 
阅读更多
Oracle:彻底结束会话 ,彻底解锁oracle会话被锁是经常的。但有时alter system kill session 'sid,serial#';并不能彻底的杀死会话。只能通过杀死Linux上对应的进程才行。

以前都是通过v$session里的logon_time,和ps -ef|grep oracle所列出的时间大约的定位进程。然后结束。本来想把这个写成日志。但有一个服务器存在了好几个前几天启动的进程(估计是我kill -9 weblogic进程产生的) ps -ef不能只能列出进程启动的日期,不能列出具体时间。

上网查到了2篇详细的解决方法。就转了过来:

Oracle杀死死锁进程

先查看哪些表被锁住了:


杀进程中的会话:


如果有ora-00031错误,则在后面加immediate;alter system kill session '29,5497' immediate;

如何杀死oracle死锁进程

1.查哪个过程被锁:

查V$DB_OBJECT_CACHE视图:

SELECT * FROM V$DB_OBJECT_CACHE WHERE OWNER='过程的所属用户' AND CLOCKS!='0';

2. 查是哪一个SID,通过SID可知道是哪个SESSION:

查V$ACCESS视图:

SELECT * FROM V$ACCESS WHERE OWNER='过程的所属用户' AND NAME='刚才查到的过程名';

3. 查出SID和SERIAL#:

查V$SESSION视图:

SELECT SID,SERIAL#,PADDR FROM V$SESSION WHERE SID='刚才查到的SID';

查V$PROCESS视图:

SELECT SPID FROM V$PROCESS WHERE ADDR='刚才查到的PADDR';

4. 杀进程:

(1)先杀ORACLE进程:

ALTER SYSTEM KILL SESSION '查出的SID,查出的SERIAL#';

(2)再杀操作系统进程:

KILL -9 刚才查出的SPID或ORAKILL 刚才查出的SID 刚才查出的SPID。

Oracle的死锁

查询数据库死锁:


查询出来的结果就是有死锁的session了,下面就是杀掉,拿到上面查询出来的SID和SERIAL#,填入到下面的语句中:

alter system kill session 'sid,serial#';

一般情况可以解决数据库存在的死锁了,或通过session id 查到对应的操作系统进程,在Unix中杀掉操作系统的进程。


然后采用kill (unix) 或 orakill(windows )。

在Unix中:


经常在Oracle的使用过程中碰到这个问题,所以也总结了一点解决方法。

1)查找死锁的进程:


2)kill掉这个死锁的进程:

alter system kill session ‘sid,serial#’; (其中sid=l.session_id)

3)如果还不能解决:


其中sid用死锁的sid替换:


其中spid是这个进程的进程号,kill掉这个Oracle进程。

上文来源:http://www.webjx.com/htmldata/2007-05-23/1179879038.html


Oracle中Kill session的研究


作者:

link:

http://www.eygle.com/faq/Kill_Session.htm

我们知道,在Oracle数据库中,可以通过kill session的方式来终止一个进程,其基本语法结构为:

alter system kill session ''''sid,serial#'''' ;


被kill掉的session,状态会被标记为killed,Oracle会在该用户下一次touch时清除该进程.


我们发现当一个session被kill掉以后,lag管:\u业网育a网供M该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



在这种情况下,很多时候,c_件D?L~?\%j3Sd资源是无法释放的,我们需要查询spid,在操作系统级来kill这些进程.

但是由于此时v$session.paddr已经改变,我们无法通过v$session和v$process关联来获得spid

那还可以怎么办呢?

我们来看一下下面的查询:

     SQL> SELECT s.username,s.status,
     2     x.ADDR,x.KSLLAPSC,x.KSLLAPSN,x.KSLLASPO,x.KSLLID1R,x.KSLLRTYP,
     3     decode(bitand (x.ksuprflg,2),0,null,1)
     4     FROM x$ksupr x,v$session s
     5     WHERE s.paddr(+)=x.addr
     6     and bitand(ksspaflg,1)!=0;


USERNAME                          STATUS      ADDR          KSLLAPSC      KSLLAPSN KSLLASPO          KSLLID1R KS D
------------------------------ -------- -------- ---------- ---------- ------------ ---------- -- -
                                           542B44A8             0             0                          0
                                  ACTIVE      542B4858             1            14 24069                    0       1
                                  ACTIVE      542B4C08            26            16 15901                    0       1
                                  ACTIVE      542B4FB8             7            46 24083                    0       1
                                  ACTIVE      542B5368            12            15 24081                    0       1
                                  ACTIVE      542B5718            15            46 24083                    0       1
                                  ACTIVE      542B5AC8            79             4 15923                    0       1
                                  ACTIVE      542B5E78            50            16 24085                    0       1
                                  ACTIVE      542B6228           754            15 24081                    0       1
                                  ACTIVE      542B65D8             1            14 24069                    0       1
                                  ACTIVE      542B6988             2            30 14571                    0       1

USERNAME                          STATUS      ADDR          KSLLAPSC      KSLLAPSN KSLLASPO          KSLLID1R KS D
------------------------------ -------- -------- ---------- ---------- ------------ ---------- -- -
SYS                               ACTIVE      542B6D38             2             8 24071                    0
                                           542B70E8             1            15 24081                  195 EV
                                           542B7498             1            15 24081                  195 EV
SYS                               INACTIVE 542B7848             0             0                          0
SYS                               INACTIVE 542B7BF8             1            15 24081                  195 EV

16 rows selected.



我们注意,红字标出的部分就是被Kill掉的进程的进程地址.


简化一点,其实就是如下概念:


SQL> select p.addr from v$process p where pid <> 1
2 minus
3 select s.paddr from v$session s;
ADDR
--------
542B70E8
542B7498



Ok,OY[)Yj?=的专软

ykGo管垠y国的n专u网k无D
现在我们获得了进程地址,就可以在v$process中找到spid,然后可以使用Kill或者orakill在系统级来杀掉这些进程.


实际上,我猜测:

当在Oracle中kill session以后, Oracle只是简单的把相关session的paddr 指向同一个虚拟地址.

此时v$process和v$session失去关联,进程就此中断.

然后Oracle就等待PMON去清除这些Session.所以通常等待一个被标记为Killed的Session退出需要花费很长的时间.

如果此时被Kill的process,重新尝试执行任务,那么马上会收到进程中断的提示,process退出,此时Oracle会立即启动PMON
来清除该session.这被作为一次异常中断处理.

分享到:
评论

相关推荐

    深入浅出Oracle: DBA入门、进阶与诊断案例.pdf

    《深入浅出Oracle:DBA入门、进阶与诊断案例》是一本专为数据库管理员(DBA)设计的Oracle技术指南。这本书详细介绍了Oracle数据库管理的基础知识,中级技能以及高级故障诊断技巧,旨在帮助读者从新手到专家逐步提升...

    深入浅出Oracle:DBA入门、进阶与诊断案例

    深入浅出Oracle:DBA入门、进阶与诊断案例深入浅出Oracle:DBA入门、进阶与诊断案例深入浅出Oracle:DBA入门、进阶与诊断案例深入浅出Oracle:DBA入门、进阶与诊断案例深入浅出Oracle:DBA入门、进阶与诊断案例

    oracle 查看当前会话执行的sql语句

    ### Oracle 查看当前会话执行的SQL语句 在Oracle数据库管理中,有时我们需要了解某个特定会话(Session)正在执行哪些SQL语句。这在性能调优、问题诊断等场景下尤为重要。以下将详细介绍如何通过不同的方法来查看...

    Oracle数据库连接与会话

    Oracle数据库连接与会话 Oracle数据库连接与会话是Oracle数据库管理系统中的两个核心概念。它们之间存在一定的关系,但又有着明显的区别。 连接是一种从客户端到数据库实例的物理通道,可以通过网络或IPC机制建立...

    Oracle 中如何对会话的所有SQL进行跟踪?

    1、目的:在实际工作中,有时需将某个程序执行的所有SQL查出来,而程序在Oracle中与会话均可对应,故可通过本文脚本对会话的所有SQL进行跟踪,转换后即可还原程序对Oracle的操作。 2、适用场景:在源码无法拿到,但...

    oracle错误一览表

    ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出最大进程数 () ORA-00021: 会话附属于其它某些进程;无法转换会话 ORA-00022: 无效的会话 ID;...

    Oracle疑难:session无法完全删除问题

    Oracle疑难:session无法完全删除问题

    oracle错误大全一览表

    oracle错误大全,绝对全。 部分内容 ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出最大进程数 () ORA-00021:...

    oracle错误代码大全(超详细)

    ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出最大进程数 () ORA-00021: 会话附属于其它某些进程;无法转换会话 ...

    DBArtisan工具说明文档_中文版PDF最全说明

    DBArtisan 是一个行业领先的数据库管理解决方案,用于管理 Oracle 、Microsoft SQL Server 、Sybase Adaptive Server、IBM DB2 for Windows 、Unix 和 Linux、IBM DB2 for OS/390 和 z/OS 数据库以及 MySQL。...

    ojdbc7-12.1.0.2.jar

    ojdbc7-12.1.0.2.jar 是Oracle公司为Java开发者提供的一个数据库驱动包,主要用于连接Oracle 12c数据库。Oracle JDBC驱动程序是Java应用程序与Oracle数据库之间通信的桥梁,使得开发者能够在Java环境中执行SQL语句、...

    Oracle经典故障解析 连接数&会话数

    在使用Oracle数据库的过程中,连接数和会话数是影响系统性能的关键因素。下面将详细解析这两个概念,以及它们在Oracle故障排查中的重要性。 1. 连接数和会话数的概念:在Oracle中,连接数指的是同一时间连接到...

    Oracle错误码大全

    ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出最大进程数 () ORA-00021: 会话附属于其它某些进程;无法转换会话 ORA-00022: 无效的会话 ID;...

    oracle性能监控sql 监控当前会话 执行的sql及io等信息

    Oracle性能监控SQL——监控当前会话执行的SQL及IO等信息 Oracle性能监控是数据库管理员的重要职责之一,通过监控数据库的性能,可以及时发现问题,避免数据库的宕机和性能下降。本文将介绍一些常用的Oracle性能监控...

    Oracle 错误大全

    错误说明:会话附属于其它某些进程,无法转换会话。 解决方法:检查会话所属关系,确保会话正确转换。 ORA-00022: 无效的会话 ID;访问被拒绝 错误说明:无效的会话 ID,访问被拒绝。 解决方法:检查会话 ID ...

    深入浅出Oracle: DBA入门、进阶与诊断案例. pdf

    《深入浅出Oracle:DBA入门、进阶与诊断案例》是盖国强撰写的一本专为Oracle数据库管理员(DBA)设计的教程。这本书旨在帮助初学者掌握Oracle数据库的基本概念,同时也为有一定经验的DBA提供进一步提升技能和解决...

    linux-cPP-oracle.rar_occi 源码_oracle

    为了简化上述过程,Oracle提供了OCII的C++封装,名为`Oracle::OCCCI`,它提供了更加面向对象的API。例如: - `Oracle::OCCCI::Environment`类代表环境。 - `Oracle::OCCCI::Connection`类表示数据库连接。 - `Oracle...

    oracle临时表(事务级、会话级).docx

    3. 当一个会话结束(用户正常退出、用户不正常退出、Oracle 实例崩溃)或者一个事务结束的时候,Oracle 对这个会话的表执行 TRUNCATE 语句清空临时表数据。但不会清空其它会话临时表中的数据。 4. 你可以索引临时表...

Global site tag (gtag.js) - Google Analytics