`

查看oracle死锁进程并结束死锁

阅读更多
查看锁表进程SQL语句1:
select sess.sid,
   sess.serial#,
   lo.oracle_username,
   lo.os_user_name,
   ao.object_name,
   lo.locked_mode
   from v$locked_object lo,
   dba_objects ao,
   v$session sess
where ao.object_id = lo.object_id and lo.session_id = sess.sid;

查看锁表进程SQL语句2:
select * from v$session t1, v$locked_object t2 where t1.sid = t2.SESSION_ID;

杀掉锁表进程:
如有記錄則表示有lock,記錄下SID和serial# ,將記錄的ID替換下面的738,1429,即可解除LOCK
alter system kill session '738,1429';


用这个可以查:  select s.sid,s.machine,o.object_name,l.oracle_username,l.locked_mode, 'ALTER  SYSTEM  KILL  SESSION  '''||s.sid||',  '||s.serial#||''';'   Command  from  v$locked_object  l,v$session  s,all_objects  o  where  l.session_id=s.sid  and  l.object_id=o.object_id  可以查看哪台机器哪个用户锁了记录, 其中command是用来杀掉锁住记录的session
******************************************************************************************************************
SELECT        A.OBJECT_ID,        B.OBJECT_NAME,        A.SESSION_ID,        A.ORACLE_USERNAME,        A.OS_USER_NAME,        A.PROCESS,        A.LOCKED_MODE FROM V$LOCKED_OBJECT A, DBA_OBJECTS B WHERE A.OBJECT_ID = B.OBJECT_ID;
SELECT T2.USERNAME, T2.SID, T2.SERIAL#, T2.LOGON_TIME FROM V$LOCKED_OBJECT T1, V$SESSION T2 WHERE T1.SESSION_ID = T2.SID ORDER BY T2.LOGON_TIME;
ALTER SYSTEM KILL SESSION 'sid, serial#';
********************************************************************************************************************
session 1: C:\>sqlplus hxg/hxg
SQL> select * from scott.t;
         A B                    C ---------- -------------------- --------------------        111 aa                   bb        222 hello                world
SQL> update scott.t  set b='good' where a=222;
已更新 1 行。
session 2: C:\>sqlplus scott/tiger
SQL> select * from scott.t;
         A B                    C ---------- -------------------- --------------------        111 aa                   bb        222 hello                world
SQL> update t set b='asdfds' where a=222;
挂起。。。。
session 3: C:\>sqlplus "system/*** as sysdba"
SQL> select sid,serial#,username,status from v$session;
SID    SERIAL# USERNAME                       STATUS ---- ---------- ------------------------------ --------  146         25 SYS                            ACTIVE  147         11 SYS                            INACTIVE  148          2 HXG                            INACTIVE  150          5 SCOTT                          ACTIVE  151          1                                ACTIVE  154          1                                ACTIVE  159          6                                ACTIVE  160          1                                ACTIVE  161          1                                ACTIVE  162          1                                ACTIVE  163          1                                ACTIVE
SID    SERIAL# USERNAME                       STATUS ---- ---------- ------------------------------ --------  164          1                                ACTIVE  165          1                                ACTIVE  166          1                                ACTIVE  167          1                                ACTIVE  168          1                                ACTIVE  169          1                                ACTIVE  170          1                                ACTIVE
已选择18行。
SQL> alter system kill session '148,2';
系统已更改。
SQL> select sid,serial#,username,status from v$session;
SID    SERIAL# USERNAME                       STATUS ---- ---------- ------------------------------ --------  146         25 SYS                            ACTIVE  147         11 SYS                            INACTIVE  148          2 HXG                            KILLED  150          5 SCOTT                          INACTIVE  151          1                                ACTIVE  154          1                                ACTIVE  159          6                                ACTIVE  160          1                                ACTIVE  161          1                                ACTIVE  162          1                                ACTIVE  163          1                                ACTIVE
SID    SERIAL# USERNAME                       STATUS ---- ---------- ------------------------------ --------  164          1                                ACTIVE  165          1                                ACTIVE  166          1                                ACTIVE  167          1                                ACTIVE  168          1                                ACTIVE  169          1                                ACTIVE  170          1                                ACTIVE
已选择18行。
SQL>


select   V$SESSION.sid,v$session.SERIAL#,v$process.spid,  
  rtrim(object_type)   object_type,rtrim(owner)   ||   '.'   ||   object_name   object_name,  
  decode(lmode,       0,   'None',  
  1,   'Null',  
  2,   'Row-S',  
  3,   'Row-X',  
  4,   'Share',  
  5,   'S/Row-X',  
  6,   'Exclusive', 'Unknown')   LockMode,  
  decode(request,   0,   'None',  
  1,   'Null',  
  2,   'Row-S',  
  3,   'Row-X',  
  4,   'Share',  
  5,   'S/Row-X',  
  6,   'Exclusive',   'Unknown')   RequestMode  
  ,ctime,   block   b,  
  v$session.username,MACHINE,MODULE,ACTION,  
  decode(A.type,  
  'MR',   'Media   Recovery',  
  'RT','Redo   Thread',  
  'UN','User   Name',  
  'TX',   'Transaction',  
  'TM',   'DML',  
  'UL',   'PL/SQL   User   Lock',  
  'DX',   'Distributed   Xaction',  
  'CF',   'Control   File',  
  'IS',   'Instance   State',  
  'FS',   'File   Set',  
  'IR',   'Instance   Recovery',  
  'ST',   'Disk   Space   Transaction',  
  'TS',   'Temp   Segment',  
  'IV',   'Library   Cache   Invalida-tion',  
  'LS',   'Log   Start   or   Switch',  
  'RW',   'Row   Wait',  
  'SQ',   'Sequence   Number',  
  'TE',   'Extend   Table',  
  'TT',   'Temp   Table',  
  'Unknown')   LockType  
  from   (SELECT   *   FROM   V$LOCK)   A,   all_objects,V$SESSION,v$process  
  where   A.sid   >   6  
  and   object_name<>'OBJ$'  
  and   A.id1   =   all_objects.object_id  
  and   A.sid=v$session.sid  
  and   v$process.addr=v$session.paddr;


同样也是通过写sql从数据字典里查出来。

// SELECT-SQL1
// 功能:检查被加锁的对象
//select obj.OWNER||'.'||obj.OBJECT_NAME as OBJ_NAME, // 对象名称(已经被锁住)
//   obj.SUBOBJECT_NAME as SUBOBJ_NAME,     // 子对象名称(已经被锁住)
//   obj.OBJECT_ID as OBJ_ID,        // 对象ID
//   obj.OBJECT_TYPE as OBJ_TYPE,       // 对象类型
//   lock_obj.SESSION_ID as SESSION_ID,     // 会话SESSION_ID
//   lock_obj.ORACLE_USERNAME as ORA_USERNAME,  // ORACLE系统用户名称
//   lock_obj.OS_USER_NAME as OS_USERNAME,    // 操作系统用户名称
//   lock_obj.PROCESS as PROCESS       // 进程编号
//from
//  ( select * from all_objects where object_id in (select object_id from v$locked_object)) obj,
//  v$locked_object lock_obj
//where obj.object_id=lock_obj.object_id;

//// SELECT-SQL2
//// 功能:检查被加锁的对象以及加锁的会话信息
////  如果需要手工解除锁,请对照要解锁的对象,记下SESSION_ID,SERIAL#

//// 项,然后运行下面的ALTER-SQL1
//select LOCK_INFO.OWNER||'.'||LOCK_INFO.OBJ_NAME as OBJ_NAME, // 对象名称(已经被锁住)
//   LOCK_INFO.SUBOBJ_NAME as SUBOBJ_NAME,       // 子对象名称(已经被锁住)
//   SESS_INFO.MACHINE as MACHINE,         // 机器名称
//   LOCK_INFO.SESSION_ID as SESSION_ID,       // 会话SESSION_ID
//   SESS_INFO.SERIAL# as SERIAL#,         // 会话SERIAL#
//   LOCK_INFO.ORA_USERNAME as ORA_USERNAME,      // ORACLE系统用户名称
//   LOCK_INFO.OS_USERNAME as OS_USERNAME,       // 操作系统用户名称
//   LOCK_INFO.PROCESS as PROCESS,         // 进程编号
//   LOCK_INFO.OBJ_ID as OBJ_ID,          // 对象ID
//   LOCK_INFO.OBJ_TYPE as OBJ_TYPE,         // 对象类型
//   SESS_INFO.LOGON_TIME as LOGON_TIME,       // 登录时间
//   SESS_INFO.PROGRAM  as PROGRAM,         // 程序名称
//   SESS_INFO.STATUS as STATUS,          // 会话状态
//   SESS_INFO.LOCKWAIT as LOCKWAIT,         // 等待锁
//   SESS_INFO.ACTION as ACTION,          // 动作
//   SESS_INFO.CLIENT_INFO as CLIENT_INFO       // 客户信息
//
//from
// (
//  select obj.OWNER as OWNER,
//     obj.OBJECT_NAME as OBJ_NAME,
//     obj.SUBOBJECT_NAME as SUBOBJ_NAME,
//     obj.OBJECT_ID as OBJ_ID,
//     obj.OBJECT_TYPE as OBJ_TYPE,
//     lock_obj.SESSION_ID as SESSION_ID,
//     lock_obj.ORACLE_USERNAME as ORA_USERNAME,
//     lock_obj.OS_USER_NAME as OS_USERNAME,
//     lock_obj.PROCESS as PROCESS
//  from
//   ( select * from all_objects where object_id in (select object_id from v$locked_object)) obj,
//   v$locked_object lock_obj
//  where obj.object_id=lock_obj.object_id
// )  LOCK_INFO,
// (
//  select SID,
//     SERIAL#,
//     LOCKWAIT,
//     STATUS,
//     PROGRAM,
//     ACTION,
//     CLIENT_INFO,
//     LOGON_TIME,
//     MACHINE
//  from v$session
// ) SESS_INFO
//where LOCK_INFO.SESSION_ID=SESS_INFO.SID ;



//// 看清楚了 下面就可以 杀死它了。

// ALTER-SQL1
// 功能:杀死会话(SESSION_ID,SERIAL#),可以手工解除锁
//    请手工修改SESSION_ID,SERIAL#为相应值
// 注意:本功能慎重使用,有一定的破坏性,该SQL可以断开客户机和服务器的连接

//ALTER SYSTEM KILL SESSION 'SESSION_ID,SERIAL#';






分享到:
评论

相关推荐

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

    以下将详细阐述如何通过一系列步骤有效地关闭Oracle死锁进程,以及如何释放状态为killed的session。 ### 一、识别死锁进程 #### 查找被锁定的过程 首先,我们需要确定哪些进程正处于死锁状态。这可以通过查询`V$...

    如何解决Oracle杀死死锁进程

    解决 Oracle 杀死死锁进程 Oracle 杀死死锁进程是数据库管理员经常遇到的问题,本文将介绍解决 Oracle 杀死死锁进程的方法。 在 Oracle 中,死锁是指两个或多个会话在等待对方释放资源,从而导致互相阻塞的情况。...

    杀死oracle死锁进程

    解决Oracle数据库死锁问题,查询出数据库所有死锁,并杀死所有的死锁,解决程序运行问题;

    oracle-死锁查询

    oracle死锁问题查询代码,仅供参考,有问题大家一起交流

    oracle查询死锁语句

    oracle查询死锁语句,并能根据根据ID值杀死锁表的进程!

    oracle死锁原因解决办法

    ### Oracle死锁原因及解决办法 #### 一、Oracle死锁概述 在Oracle数据库系统中,死锁是一种常见的并发问题,它会导致多个事务之间互相等待对方释放资源而无法继续执行,最终导致整个系统的运行效率降低甚至停滞。...

    查看oracle进程,杀进程pb源程序

    本文将深入探讨如何使用PB(PowerBuilder)源程序来查看Oracle进程并进行必要的操作,如杀死进程。 首先,我们要了解Oracle进程的概念。在Oracle数据库中,进程主要分为用户进程和服务器进程。用户进程是由数据库...

    Oracle 死锁问题的排查语句

    Oracle 死锁问题的排查语句 Oracle 死锁是指在数据库中出现的循环等待资源的情形,从而导致数据库性能下降或系统崩溃。出现死锁的原因有多种,如资源竞争、锁定机制不当等。下面是排查 Oracle 死锁问题的语句: 1....

    oracle死锁表后处理

    当你采用的是直接连接数据库的方式,也不要用OS系统命令$kill process_num或者$kill -9 process_num来终止用户连接,因为一个用户进程可能产生一个以上的锁,杀OS进程并不能彻底清除锁的问题。 oracle死锁表后处理...

    oracle 死锁时候 ,杀进程方法

    ### Oracle死锁时的进程处理方法 在Oracle数据库管理中,死锁是一个常见的问题,它通常发生在两个或多个事务互相等待对方释放资源的情况。当这种情况发生时,可能会导致应用程序响应变慢甚至完全停止运行。因此,...

    解决Oracle死锁问题.txt

    编译的存储过程的时候,程序死住,等待一会出现ora-04021错误解决办法。文档中有查询思索的语句,以及杀掉死锁进程的方法。

    解决oracle死锁

    在Oracle数据库系统中,死锁是指两个或多个...综上所述,处理Oracle死锁需要深入了解数据库的内部机制,并结合适当的监控和预防措施。通过有效的诊断和管理,我们可以减少死锁的发生,从而提高数据库的性能和可用性。

    Oracle表死锁与解锁

    Oracle数据库在运行过程中,可能会遇到一种情况,那就是“表死锁”,这会导致多个事务相互等待对方释放资源,从而无法继续执行。死锁不仅影响数据库的正常运行,还可能导致数据一致性问题。本文将深入探讨Oracle表...

    查看进程死锁存储过程

    查看数据库进程死锁存储过程,查看死锁的进程号,用KILL杀掉,就不会造成数据库一直堵塞。

    oracle死锁故障分析和诊断解决

    - 在Unix系统中,可以通过`kill -9 SID`的方式强制结束进程。 2. **优化代码**: - 确保所有的事务都按照相同的顺序获取锁。 - 减少事务处理时间,避免长时间持有锁。 3. **调整配置参数**: - 调整`DEADLOCK_...

    oracle查找死锁

    #### 一、Oracle死锁的查找方法 ##### 1. 使用V$DB_OBJECT_CACHE视图 可以通过查询V$DB_OBJECT_CACHE视图来获取有关锁定对象的信息,进而发现可能存在的死锁情况。具体的SQL语句如下: ```sql SELECT * FROM V$DB...

    Oracle删除死锁进程的方法

    在Oracle数据库管理中,...综上所述,Oracle中删除死锁进程需要识别出死锁的会话,然后通过`ALTER SYSTEM KILL SESSION`命令结束相关会话。同时,了解和应用正确的数据库管理和并发控制策略,是预防和解决死锁的根本。

    oracle中关于死锁的处理

    ### Oracle中关于死锁的处理 #### 死锁概述 在Oracle数据库中,死锁是一种常见但必须妥善处理的问题。当两个或多个事务互相等待对方释放资源时就会发生死锁。这种情况下,没有一个事务能够继续执行,直到系统采取...

Global site tag (gtag.js) - Google Analytics