`

请您先登录,才能继续操作

Oracle kill sessin 说明

 
阅读更多

一.Session状态说明

Oracle session 有如下几种状态

ACTIVE - Sessioncurrently executing SQL

INACTIVE

KILLED - Sessionmarked to be killed

CACHED - Sessiontemporarily cached for use by Oracle*XA

SNIPED - Sessioninactive, waiting on the client

在之前的blog里有说明,参考:

Oraclesession active 和inactive 状态 说明

http://blog.csdn.net/tianlesoftware/article/details/6539297

1.1 Active 状态

active处于此状态的会话,表示正在执行,处于活动状态。

官方文档说明:

Anysession that is connected to the database and is waiting for an event that doesnot belong to the Idle wait class is considered as an active session.

1.2 Killed 状态

killed处于此状态的会话,被标注为删除,表示出现了错误,正在回滚。

当然,也是占用系统资源的。还有一点就是,killed的状态一般会持续较长时间,而且用windows下的工具pl/sql developer来kill掉,是不管用的,要用命令:alter system kill session 'sid,serial#' ;

1.3 Inactive 状态

inactive处于此状态的会话表示不是正在执行的,该状态处于等待操作(即等待需要执行的SQL语句),通常当DML语句已经完成。但连接没有释放,这个可能是程序中没有释放,如果是使用中间件来连接的话,也可能是中间件的配置或者是bug导致。

inactive对数据库本身没有什么影响,但是如果程序没有及时commit,那么就会造成占用过多会话。容易使DB的session达到极限值。

一般不处理inactive状态的session,如果达到了session的最大值,就增加processes和sessions参数。对于Inactive 状态的session,可以设置过期时间,具体的2个参数是:

(1)sqlnet.ora文件中设置expire_time参数

(2)用户profile的idle_time 参数

. Kill session 说明

2.1 查看session 类型

Kill session 也是一个危险的操作,所以在kill之前要先确认session 的类型,如果我们kill 掉错误的后台进程的session,那么可能就会导致实例crash。

可以通过gv$session 和 gv$process 或者v$session 和 v$process 来确认session 类型。

SET LINESIZE 100

COLUMN spid FORMAT A10

COLUMN username FORMAT A10

COLUMN program FORMAT A45

SELECT s.inst_id,

s.sid,

s.serial#,

p.spid,

s.username,

s.program

FROMgv$session s

JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id

WHEREs.type != 'BACKGROUND';

示例:

SQL> SET LINESIZE 100

SQL> COLUMN spid FORMAT A10

SQL> COLUMN username FORMAT A10

SQL> COLUMN program FORMAT A45

SQL> SELECT s.inst_id,

2 s.sid,

3 s.serial#,

4 p.spid,

5 s.username,

6 s.program

7 FROM gv$session s

8 JOIN gv$process p ONp.addr = s.paddr AND p.inst_id = s.inst_id

9 WHERE s.type != 'BACKGROUND';

INST_ID SID SERIAL# SPID USERNAME PROGRAM

---------- ---------- ---------- -------------------- ------------------------

1 133 22 4816 SYS sqlplus.exe

1 21 6 3176 SYS Toad.exe

1 19 35 3248 SYS Toad.exe

SQL>

2.2 ALTER SYSTEM KILL SESSION 说明

Kill session 的基本语法如下:

SQL> ALTER SYSTEM KILL SESSION 'sid,serial#';

在RAC 环境下,我们还可以在语法中指定INST_ID. 这个值可以从gv$session 中获取:

SQL> ALTERSYSTEM KILL SESSION 'sid,serial#,@inst_id';

Kill session 命令实际不会kill session。 该命令仅要求session 自己kill 自己。 在以前情况下,比如等待远程数据库的反应或者回滚事务,那么session 就不会立即kill 自己,其必须等待当前的操作结束才能执行。 在这种情况下,session 就会被标记为killed 状态。 它会尽快被kill。

我们可以在kill 命令中添加immediate,语法如下:

SQL> ALTERSYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;

这个命令不会影响性能,但它会立即返回到当前的session,处理kill操作,而不是等待其他的信息完成。

如果session 一直处于killed 状态,那么可以考虑在操作系统级别kill掉相关的进程。不过在操作之前,要先确认session 是否在执行rollback 操作。 可以使用如下SQL 来确认。

SET LINESIZE 200

COLUMN username FORMAT A15

SELECT s.username,

s.sid,

s.serial#,

t.used_ublk,

t.used_urec,

rs.segment_name,

r.rssize,

r.status

FROMv$transaction t,

v$session s,

v$rollstat r,

dba_rollback_segs rs

WHEREs.saddr = t.ses_addr

ANDt.xidusn = r.usn

ANDrs.segment_id = t.xidusn

ORDER BY t.used_ublk DESC;

如果有我们的session,那么就要等rollback 先完成,然后才能在操作系统级别kill session。

2.3 ALTER SYSTEM DISCONNECT SESSION 说明

Alter system disconnect session 是一个可选的kill session 的方法。 与kill session 命令不同,disconnect session 命令会kill 掉 dedicated server process, 该命令等同于在操作系统级别kill 掉server process。

具体语法如下:

SQL> ALTER SYSTEM DISCONNECT SESSION'sid,serial#' POST_TRANSACTION;

SQL> ALTER SYSTEM DISCONNECT SESSION'sid,serial#' IMMEDIATE;

POST_TRANSACTION 选项会等待事务完成之后在断开连接。

IMMEDIATE 选项会立即断开连接,然后事务会进行recover操作。

2个选项也可以一起使用,但是必须指定其中一个,否则就会报错:

SQL> alter system disconnect session'30,7';

alter system disconnect session '30,7'

*

ERROR at line 1:

ORA-02000: missing POST_TRANSACTION orIMMEDIATE keyword

SQL>

SQL> alter system disconnect session'15,12' post_transaction immediate;

System altered.

使用alter system disconnectsession 命令就不需要切换到系统来kill session,也从而减少了kill 错进程的几率。

2.4 PMON 进程清理KILLEDsession

MOS 上的几篇相关文章:

ALTER SYSTEM KILL Session Marked for KilledForever [ID 1020720.102]

Removing Sessions in Killed Status on Unix[ID 274216.1]

ALTER SYSTEM KILL SESSION does not ReleaseLocks Killing a Thread on Windows NT [ID 100859.1]

在之前说过,如果我们使用alter system kill session 命令,是要求session 自己kill 自己,这个过程可能需要等待远程事务的回应或者回滚事务,在这个状态会被标记为killed,并且可能需要等待很长时间,等这些操作完成之后才会kill掉。

Killing thesession will not clear the locks. Thesession on the remote database will remain idle waiting for input until thenetwork read times out. Only then the kill session is processed, and locks arereleased.

要释放这些状态为killed的session,可以重启DB,也可以直接在OS 级别kill 进程, windows 下使用ORAKILL 命令,UNIX 直接使用kill 命令。

对于这些状态为KILLED的session,PMON 进程也会清理它,MOS的解释如下:

It does notexplicitly indicate what happens to the session while it is in the KILLEDPSEUDO state. What's happening is thatPMON periodically checks to see if any sessions have been killed.

PMON 会定期的检查是否有session 被标记为killed

If it finds one,it attempts to rollback the transaction for that session (that was in progresswhen it was killed). The reason this cantake a long time is because PMON may have more than one transaction to rollbackat a time (if other sessions have been killed, or if processes have died etc).

--如果PMON 发现了一个被标记为killedsessin,那么PMON 会尝试rollback这个事务。这个操作可能需要很长时间,因为PMON 进程可以一次回滚多个事务。

Thus, it maytake a while to finally cleanup the killed session and have it disappear fromthe session monitor. The system i/omonitor correctly shows the reads and writes being performed by PMON in orderto rollback the session's transaction.

--PMON可能需要很长的时间来清理killed session,从session Monitor就看不到。但是从systemI/O上可以显示PMON 产生的读写。

PMON will notdelete the session object itself until the client connected to that sessionnotices that it has been killed.Therefore, the sequence of events is:

--PMON 不会删除session 对象直到client 再次连接标记为killedsession 时,具体的操作过程顺序如下:

1) alter system kill session is issued -the STATUS of the session object in V$SESSION becomes KILLED, its serverbecomes PSEUDO.

2) PMON cleans up the *resources* allocatedto the session

(i.e., rolls back its transaction, releases its locks, etc).

3) the entry in V$SESSION remains thereuntil the client of that session (the client is the process associated with theOSUSER,MACHINE,PROCESS columns in the V$SESSION view) tries to do anotherrequest.

4) the client attempts another SQLstatement and gets back ORA-28.

5) PMON can now remove the entry from V$SESSION.

This behavior is necessary because the client still has pointers to thesession object even though the session has been killed. Therefore, the object cannot be deleted untilthe client is no longer pointing at it.

. 在操作系统级别清理killed session 进程

如果标记为KILLED的session 等了很长时间还没有被清理掉,那么只能在OS级别来kill 进程。 注意这里不能kill DB 的进程,否则会导致DB crash。

之前整理的Blog就是一个示例,参考:

Oracle 存储过程 无法编译 解决方法

http://blog.csdn.net/tianlesoftware/article/details/7412555

3.1 查看seesion的具体信息:

SELECT sid, serial#, username,process,machine, terminal, program,

osuser, logon_time, last_call_et

FROM v$session

WHERE username IS NOT NULL

AND status != 'ACTIVE'

ORDER BY last_call_et

/

3.2 查看SPID

可以使用如下SQL:

select spid,osuser, s.program

from v$session s,v$process p

where s.paddr=p.addr and s.sid=958;

或者:

SELECT s.sid, s.serial#, p.spid

FROM v$session s,v$process p

WHERE s.paddr = p.addr

3.3 kill 进程

(1)在Unix 平台下

kill -9 <spid>

(2)Windows 平台

c:\> orakill <SID> <spid>

where <SID> = the Oracle instance name (ORACLE_SID)

<spid> = the thread id of the thread to kill

-------------------------------------------------------------------------------------------------------

版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!

Skype: tianlesoftware

Email: tianlesoftware@gmail.com

Blog: http://www.tianlesoftware.com

Weibo: http://weibo.com/tianlesoftware

Twitter: http://twitter.com/tianlesoftware

Facebook: http://www.facebook.com/tianlesoftware

Linkedin: http://cn.linkedin.com/in/tianlesoftware

-------加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请----

DBA1 群:62697716(满); DBA2 群:62697977(满)DBA3 群:62697850(满)

DBA 超级群:63306533(满); DBA4 群:83829929 DBA5群: 142216823

DBA6 群:158654907 DBA7 群:172855474 DBA总群:104207940

分享到:
评论

相关推荐

    oracle kill session

    ### Oracle Kill Session:详解与实践 在Oracle数据库管理与维护过程中,“Oracle Kill Session”是一项非常重要的操作技巧。本文将从理论到实践多个层面深入探讨如何有效地执行“Oracle Kill Session”,帮助...

    oracle中已killed session的处理

    在Oracle数据库管理中,有时会遇到一些异常情况,比如某个Session长时间未响应或占用大量资源,这时可能需要管理员手动干预,通过`ALTER SYSTEM KILL SESSION 'SID,SERIAL#'`命令来强制终止这个Session。然而,在...

    Oracle_Kill_Session_终极篇

    ### Oracle_Kill_Session_终极篇:深入解析与实践 #### 环境配置与背景 在探讨Oracle数据库中如何有效地管理会话(session)时,本文档聚焦于Oracle Database 10g Enterprise Edition Version 10.2.0.2.0的64位版本...

    如何快速的杀掉Oracle的Session

    需要注意的是,使用`alter system kill session`命令,被结束的Session状态会变为killed,Oracle会在下次该用户交互时清理。然而,直接杀死进程会导致Session的`paddr`被修改,如果多个Session被杀,它们的`paddr`...

    kill system session(解决oracle死锁)

    kill system session(解决oracle死锁)

    有效关闭Oracle死锁进程,和释放状态为killed的session

    在Oracle数据库管理中,处理死锁进程和释放状态为killed的session是一项关键技能,尤其对于维护数据库性能和稳定性至关重要。以下将详细阐述如何通过一系列步骤有效地关闭Oracle死锁进程,以及如何释放状态为killed...

    oracle kill 进程

    ### Oracle Kill 进程详解 #### 一、概述 在Oracle数据库管理中,有时会遇到因为某些进程长时间运行导致系统响应变慢的情况。在这种情况下,管理员可能需要采取措施来终止这些进程,即“Kill”进程。本文将详细...

    快速杀死oracle的session

    ### 快速杀死Oracle的Session方法详解 在Oracle数据库管理中,有时会遇到需要迅速终止某个或某些Session的情况。这通常发生在系统响应缓慢、需要紧急关闭特定进程时,或者是在执行`shutdown immediate`命令但发现...

    oracle Session与lock 解除

    ### Oracle Session与Lock解除 在Oracle数据库环境中,锁机制是一种重要的资源管理手段,它能够确保数据的一致性和并发性处理。锁(Lock)是数据库管理系统为了控制多个用户对同一数据资源的同时访问而采取的一种...

    ORACLE进程无法KILL处理方案.docx

    在 ORACLE 数据库中,当我们尝试 kill 一个进程时,可能会出现状态被置为 "KILLED" 但是锁定的资源长时间不释放的情况,这会导致错误提示 ORA-00030: User session ID does not exist 或 ORA-00031: session marked ...

    如何安全快速的批量删除Oracle数据库外部会话session

    总结来说,安全快速地批量删除Oracle数据库外部会话涉及到对`ALTER SYSTEM KILL SESSION`、`ALTER SYSTEM DISCONNECT SESSION`命令的熟练运用,以及可能的与操作系统交互。在执行这些操作时,务必小心谨慎,避免对...

    Oracle 数据库解锁session方式

    Oracle 数据库解锁session方式

    oracle ORA-00031:session marked for kill(标记要终止的会话)解决方法

    Oracle数据库在操作过程中,有时会遇到ORA-00031错误,这个错误提示是“会话标记为kill(session marked for kill)”。这通常发生在使用ALTER SYSTEM KILL SESSION命令企图终止某个会话时,但由于会话正在执行无法...

    重启oracle服务,删除session

    ps -ef | grep $ORACLE_SID | grep -v ora_ | grep LOCAL=NO | awk '{print $2}' | xargs kill ``` 此命令会列出所有与当前Oracle实例相关的进程,并筛选出非本地会话(即远程连接),然后逐一杀死这些进程。 之后...

    dbjob to create kill session

    根据提供的文件信息,本文将详细解释“dbjob to create kill session”的相关知识点,包括Oracle数据库中的DBMS_JOB包、如何创建任务(job)以及如何利用这些任务来终止特定的会话(session)。 ### Oracle DBMS_...

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

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

    oracle_v$session_v$session_wait用途详解

    ALTER SYSTEM KILL SESSION ':sid', ':serial#'; ``` - **进程地址 (PADDR) 查询** - 通过进程地址 (PADDR) 可以获取到与后台进程相关的信息,如进程 ID (PID)、系统 ID (SID)、系统用户名等: ```sql SELECT ...

    清除Oracle中长时间持锁的session

    ### 清除Oracle中长时间持锁的Session #### 背景介绍 在Oracle数据库管理过程中,有时会遇到一些长时间占用资源的进程,这些进程可能会导致数据库性能下降甚至某些操作无法执行。通常情况下,如果一个session的状态...

    Windows环境中Kill掉Oracle线程

    Windows 环境中 Kill 掉 Oracle 线程 在 Windows 环境中,Kill 掉 Oracle 线程是非常重要的操作,因为 Oracle 线程占用了系统的大量资源,导致 Oracle 系统的效率变得很低。如果简单的关闭重启 Oracle 实例,势必...

    Oracle kill 表锁正确的 出现表锁后数据不会被查询到这个表这条数据 要先解决掉表锁死锁的情况.docx

    以下是对"Oracle中去除锁表命令"的详细说明: 1. **检测表锁** 在Oracle中,你可以通过查询`v$locked_object`视图来查看当前被锁定的对象。结合`dba_objects`视图,可以找出被锁定的表及其锁定模式和持有锁的会话...

Global site tag (gtag.js) - Google Analytics