ORACLE死锁问题

来源:互联网 发布:达内java视频 编辑:程序博客网 时间:2024/06/09 19:33

查看锁表进程SQL语句1:

<SQL>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; </SQL>

杀掉锁表进程:
复制所有的SID和SERIAL列内容到电子表格中,然后将SQL语句
alter system kill session ‘738,1429’;
编写公式为:
=”alter system kill session ‘”&A1&”,”&B1&”’;”
粘贴公式到ORACLE中统一删除。

用这个可以查:

<SQL>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#'; </SQL>

<SQL>session 1: C:\>sqlplus hxg/hxg SQL> select * from scott.t; SQL> update scott.t set b='good' where a=222; SQL> select * from scott.t; 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; SQL> alter system kill session '148,2'; SQL> select sid,serial#,username,status from v$session; SQL> </SQL>
<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>

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

<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; </SQL>
<SQL> 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 ; </SQL>

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

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