已经有很多人问过这个问题了。
检查表锁定问题:SELECT A.OWNER,   
         A.OBJECT_NAME,   
         B.XIDUSN,   
         B.XIDSLOT,   
         B.XIDSQN,   
         B.SESSION_ID,   
         B.ORACLE_USERNAME,   
         B.OS_USER_NAME,   
         B.PROCESS,   
         B.LOCKED_MODE,   
         C.MACHINE,   
         C.STATUS,   
         C.SERVER,   
         C.SID,   
         C.SERIAL#,   
         C.PROGRAM  
    FROM ALL_OBJECTS A,   
         V$LOCKED_OBJECT B,   
         SYS.GV_$SESSION C 
   WHERE ( A.OBJECT_ID = B.OBJECT_ID ) 
     AND (B.PROCESS = C.PROCESS )
   ORDER BY 1,2

解决方案 »

  1.   

    你得把注释去掉  //时注释符号,sqlplus的--你如果使用pb的话,配置一个system用户的profile就可以直接使用
    // 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#';
      

  2.   

    set echo off
    set feedback offdrop table my_session;
    create table my_session
    as
    select a.username, a.sid, a.serial#,
    a.lockwait, a.machine,a.status,
    a.last_call_et,a.sql_hash_value,a.program
      from v$session a
     where 1=2 ;
    create unique index my_session_u1 on my_session(sid);
    create index my_session_n2 on my_session(lockwait);
    create index my_session_n3 on my_session(sql_hash_value);drop table my_lock;
    create table my_lock
    as
    select id1, kaddr, sid, request,type
      from v$lock
     where 1=2;
    create index my_lock_n1 on my_lock(sid);
    create index my_lock_n2 on my_lock(kaddr);drop table my_sqltext;
    create table my_sqltext
    as
    select hash_value , sql_text
      from v$sqltext
     where 1=2;
    create index my_sqltext_n1 on my_sqltext (hash_value);prompt '删除旧记录.....'
    truncate table my_session;
    truncate table my_lock;
    truncate table my_sqltext;prompt '获取数据.....'
    insert into my_session
    select a.username, a.sid, a.serial#,
           a.lockwait, a.machine,a.status,
           a.last_call_et,a.sql_hash_value,a.program
      from v$session a
     where a.username is not NULL;insert into my_lock
    select id1, kaddr, sid, request,type
      from v$lock;insert into my_sqltext
    select hash_value , sql_text
      from v$sqltext s, my_session m
     where s.hash_value=m.sql_hash_value;column username format a10
    column machine format a15
    column last_call_et format 99999 heading "Seconds"
    column sid format 9999prompt "正在等待别人的用户"
    select a.sid, a.serial#, 
    a.machine,a.last_call_et, a.username, b.id1
      from my_session a, my_lock b
     where a.lockwait = b.kaddr;prompt "被等待的用户"
    select a.sid, a.serial#, 
    a.machine,  a.last_call_et,a.username, b.type,a.status,b.id1
      from my_session a, my_lock b
     where b.id1 in
          (select distinct e.id1
             from my_session d, my_lock e
            where d.lockwait = e.kaddr)
       and a.sid = b.sid
       and b.request=0;prompt "查出其  sql "
    select a.username, a.sid, a.serial#,
     b.id1, b.type, c.sql_text
      from my_session a, my_lock b, my_sqltext c
     where b.id1 in
           (select distinct e.id1
              from my_session d, my_lock e
             where d.lockwait = e.kaddr)
       and a.sid = b.sid
       and b.request=0
       and c.hash_value =a.sql_hash_value;
    prompt "释放锁住的资源:alter system kill session 'sid, serial#' "
      

  3.   

    select s.sid,s.machine,o.object_name,l.oracle_username,l.locked_mode,S.osuser,
    '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