您的位置:首页 > 数据库 > Oracle

oracle 数据库12c 一个pdb进行delete操作,commit失败导致被锁,需要把会话杀掉

2017-08-31 16:02 375 查看
oracle 数据库12c 一个pdb进行delete操作,commit失败导致被锁,需要把会话杀掉。下面是详细步骤:

进入pdb alter session set container=ORCL;

oracle查锁的sql

set linesize 200

col ORACLE_USERNAME format a15

col OBJECT_NAME format a35

col machine for a20

col program for a20

select a.xidusn,a.OBJECT_ID,c.sid,c.serial#,ORACLE_USERNAME,LOCKED_MODE,OBJECT_NAME,object_type,machine

from v$locked_object a,dba_objects b, v$session c

where a.OBJECT_ID=b.OBJECT_ID

and a.SESSION_ID=c.sid

order by 1,4,7;

如果是gv$sessiion 则查询的是全局,INSID列表示在哪一个节点

本节点只能杀本节点的会话===========

 set linesize 200

col ORACLE_USERNAME format a15

col OBJECT_NAME format a35

col machine for a20

col program for a20

select a.INST_ID,a.xidusn,a.OBJECT_ID,c.sid,c.serial#,ORACLE_USERNAME,LOCKED_MODE,OBJECT_NAME,object_type,machine

from gv$locked_object a,dba_objects b, gv$session c

where a.OBJECT_ID=b.OBJECT_ID

and a.SESSION_ID=c.sid

order by 1,4,8;
 查询结果:

INST_ID  XIDUSN  OBJECT_ID    SID     SERIAL#  USERNAME LOCKED_MODE OBJECT_NAME               OBJECT_TYPE

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

         1          0      36782             6175      48734       BRMPROD      3  TBL_RISK_RESULT                     TABLE                       brcapp02

         2          0      36782             7265       51106      BRMPROD      3 TBL_RISK_RESULT                     TABLE                       brcapp02

         2          0      36782            7382        5596        BRMPROD     3 TBL_RISK_RESULT                     TABLE                        brcapp02

杀应用会话:

alter system kill session 'sid,serial#';

会报错:session make for kill;

或者:

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

会报错:session make for kill;实际上不是真正的杀死会话,它只是将会话标记为终止。不用其他操作,等待PMON进程来清除会话。

如何彻底杀掉不良用户会话

在ORACLE数据库当中,有时候会使用ALTER SYSTEM KILL SESSION 'sid,serial#'杀掉一个会话进程,但是使用这个SQL语句杀掉会话后,数据库并不会立即释放掉相关的资源,有时候你会发现锁定的资源很长时间也不会释放,即使会话状态为“KILLED”,依然会阻塞其它会话。

在ORACLE数据库杀掉会话进程有三种方式:

1: ALTER SYSTEM KILL SESSION

关于KILL SESSION Clause ,如下官方文档描述所示,alter system kill session实际上不是真正的杀死会话,它只是将会话标记为终止。等待PMON进程来清除会话。

    select sid,serial# from v$session where username='DEMO';查询用户的 sid,seria

可以使用ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE 来快速回滚事物、释放会话的相关锁、立即返回当前会话的控制权。

Specify IMMEDIATE to instruct Oracle Database to roll back ongoing transactions, release all session locks, recover the entire session state, and return control to you immediately.

2: ALTER SYSTEM DISCONNECT SESSION

ALTER SYSTEM DISCONNECT SESSION 杀掉专用服务器(DEDICATED SERVER)或共享服务器的连接会话,它等价于从操作系统杀掉进程。它有两个选项POST_TRANSACTION和IMMEDIATE, 其中POST_TRANSACTION表示等待事务完成后断开会话,IMMEDIATE表示中断会话,立即回滚事务。

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

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

3: KILL -9 SPID (Linux) 或 orakill ORACLE_SID spid (Windows)

可以使用下面SQL语句找到对应的操作系统进程SPID,然后杀掉。当然杀掉操作系统进程是一件危险的事情,尤其不要误杀。所以在执行前,一定要谨慎确认。

 select SPID from v$process where addr in (SELECT PADDR FROM V$SESSION WHERE USERNAME='用户名字');      (找到用户的spid)

 kill -9 spid

在数据库如果要彻底杀掉一个会话,尤其是大事务会话,最好是使用ALTER SYSTEM DISCONNECT SESSION IMMEDIATE或使用下面步骤:

1:首先在操作系统级别Kill掉进程。

2:在数据库内部KILL SESSION

或者反过来亦可。这样可以快速终止进程,释放资源。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐