Oracle 查看 对象 持有 锁 的情况

同事在测试库上对一个表加字段,提示 ORA-00054, 资源忙。 应该是表对象的锁没有释放。

有关Oracle 锁的说明,参考:

ORACLE锁机制

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

用如下SQL 查看一下系统中相关对象上锁的情况:

[sql] view plain copy

  1. <pre name="code" class="sql">/* Formatted on 2012/2/13 14:24:32 (QP5 v5.185.11230.41888) */
  2. SELECT S.SID SESSION_ID,
  3. S.USERNAME,
  4. DECODE (LMODE,
  5. 0, ‘ None ‘,
  6. 1, ‘ Null ‘,
  7. 2, ‘ Row-S(SS) ‘,
  8. 3, ‘ Row-X(SX) ‘,
  9. 4, ‘ Share‘,
  10. 5, ‘S/Row-X (SSX) ‘,
  11. 6, ‘Exclusive ‘,
  12. TO_CHAR (LMODE))
  13. MODE_HELD,
  14. DECODE (REQUEST,
  15. 0, ‘ None ‘,
  16. 1, ‘ Null ‘,
  17. 2, ‘ Row-S(SS) ‘,
  18. 3, ‘ Row-X(SX) ‘,
  19. 4, ‘ Share‘,
  20. 5, ‘S/Row-X (SSX) ‘,
  21. 6, ‘Exclusive ‘,
  22. TO_CHAR (REQUEST))
  23. MODE_REQUESTED,
  24. O.OWNER || ‘ . ‘ || O.OBJECT_NAME || ‘ ( ‘ || O.OBJECT_TYPE || ‘ ) ‘
  25. AS OBJECT_NAME,
  26. S.TYPE LOCK_TYPE,
  27. L.ID1 LOCK_ID1,
  28. L.ID2 LOCK_ID2
  29. FROM V$LOCK L, SYS.DBA_OBJECTS O, V$SESSION S
  30. WHERE L.SID = S.SID AND L.ID1 = O.OBJECT_ID AND object_name = ‘xxxx‘;</pre><br>

该SQL 显示所有对象上的锁,如果要查某个具体的对象,可以根据OBJECT_NAME 字段进行一下过滤,找到对应的SID 之后去查V$SESSION 视图。

该视图会显示session 对应的信息,包括终端的信息,如果找到了终端,可以让它提交或者回滚一下就OK了。 我这里是测试环境,直接把session kill 掉了。然后修改表就ok了。

[sql] view plain copy

  1. SQL>alter system kill session ‘SID,SERIAL#‘

后来测试了发现,上面的脚本有时候会查不到对象的的相关记录,故增加了V$ACCESS视图,通过对这个视图进行对象的判断,修改之后的脚本如下:

[sql] view plain copy

  1. SELECT S.SID SESSION_ID,
  2. S.USERNAME,
  3. DECODE (LMODE,
  4. 0, ‘ None ‘,
  5. 1, ‘ Null ‘,
  6. 2, ‘ Row-S(SS) ‘,
  7. 3, ‘ Row-X(SX) ‘,
  8. 4, ‘ Share‘,
  9. 5, ‘S/Row-X (SSX) ‘,
  10. 6, ‘Exclusive ‘,
  11. TO_CHAR (LMODE))
  12. MODE_HELD,
  13. DECODE (REQUEST,
  14. 0, ‘ None ‘,
  15. 1, ‘ Null ‘,
  16. 2, ‘ Row-S(SS) ‘,
  17. 3, ‘ Row-X(SX) ‘,
  18. 4, ‘ Share‘,
  19. 5, ‘S/Row-X (SSX) ‘,
  20. 6, ‘Exclusive ‘,
  21. TO_CHAR (REQUEST))
  22. MODE_REQUESTED,
  23. O.OWNER || ‘ . ‘ || O.OBJECT_NAME || ‘ ( ‘ || O.OBJECT_TYPE || ‘ ) ‘
  24. AS OBJECT_NAME,
  25. S.TYPE LOCK_TYPE,
  26. L.ID1 LOCK_ID1,
  27. L.ID2 LOCK_ID2
  28. FROM V$LOCK L, SYS.DBA_OBJECTS O, V$SESSION S,V$ACCESS A
  29. WHERE L.SID = S.SID AND L.ID1 = O.OBJECT_ID AND S.SID=A.SID AND A.OBJECT= ‘PROC_VALIDATE_RULE_V3‘;

再次修改了一下,添加了V$SQL视图,这样可以一起查出具体导致这种锁的SQL语句,一次性就搞定了,SQL如下:

[sql] view plain copy

  1. /* Formatted on 2012/6/6 10:59:49 (QP5 v5.185.11230.41888) */
  2. SELECT distinct S.SID SESSION_ID,
  3. S.STATUS,
  4. S.USERNAME,
  5. DECODE (LMODE,
  6. 0, ‘ None ‘,
  7. 1, ‘ Null ‘,
  8. 2, ‘ Row-S(SS) ‘,
  9. 3, ‘ Row-X(SX) ‘,
  10. 4, ‘ Share‘,
  11. 5, ‘S/Row-X (SSX) ‘,
  12. 6, ‘Exclusive ‘,
  13. TO_CHAR (LMODE))
  14. MODE_HELD,
  15. DECODE (REQUEST,
  16. 0, ‘ None ‘,
  17. 1, ‘ Null ‘,
  18. 2, ‘ Row-S(SS) ‘,
  19. 3, ‘ Row-X(SX) ‘,
  20. 4, ‘ Share‘,
  21. 5, ‘S/Row-X (SSX) ‘,
  22. 6, ‘Exclusive ‘,
  23. TO_CHAR (REQUEST))
  24. MODE_REQUESTED,
  25. O.OWNER || ‘ . ‘ || O.OBJECT_NAME || ‘ ( ‘ || O.OBJECT_TYPE || ‘ ) ‘
  26. AS OBJECT_NAME,
  27. S.TYPE LOCK_TYPE,
  28. L.ID1 LOCK_ID1,
  29. L.ID2 LOCK_ID2,
  30. S2.SQL_TEXT
  31. FROM V$LOCK L,
  32. SYS.DBA_OBJECTS O,
  33. V$SESSION S,
  34. V$ACCESS A,
  35. V$SQL S2
  36. WHERE     L.SID = S.SID
  37. AND L.ID1 = O.OBJECT_ID
  38. AND S.SID = A.SID
  39. AND S2.HASH_VALUE = S.SQL_HASH_VALUE
  40. AND A.OBJECT = ‘PROC_VALIDATE_RULE_V3‘;

效果如下:

转:http://blog.csdn.net/tianlesoftware/article/details/6822321

时间: 2024-11-09 21:08:58

Oracle 查看 对象 持有 锁 的情况的相关文章

ORACLE查询数据库的锁表情况

  查询数据库的锁表情况语句如下: SELECT p.spid,a.serial#, c.object_name,b.session_id,b.oracle_username,b.os_user_name FROM v$process p,v$session a, v$locked_object b,all_objects c WHERE p.addr=a.paddr AND a.process=b.process AND c.object_id=b.object_id 如果表因为某些情况出现死

Oracle查看对象空间使用情况show_space

tom大神写了一个用于查看Oracle数据库对象空间使用情况. 下面演示一下如何使用: –工具源码 CREATE OR REPLACE PROCEDURE show_space(p_segname IN VARCHAR2, p_owner IN VARCHAR2 DEFAULT USER, p_type IN VARCHAR2 DEFAULT 'TABLE', p_partition IN VARCHAR2 DEFAULT NULL) AS l_free_blks NUMBER; l_total

oracle查看对象信息

1.查看某用户下所有对象的信息: SELECT owner, object_type, status, COUNT(*) count# FROM all_objects where owner='xxx' GROUP BY owner, object_type, status order by 2; 2.查看表行数(多个表)(需先分析表): 1 select 'analyze table '|| table_name||' compute statistics;' from user_table

oracle查看当前用户信息

一.查看当前用户信息: 1.查看当前用户拥有的角色权限信息:select * from role_sys_privs; 2.查看当前用户的详细信息:select * from user_users; 3.查看当前用户的角色信息:select * from user_role_privs; 总结:ORACLE中数据字典视图分为3大类,用前缀区别,分别为:USER,ALL 和 DBA, 许多数据字典视图包含相似的信息. USER_*:有关用户所拥有的对象信息,即用户自己创建的对象信息. ALL_*:

Oracle 查看索引表空间

Oracle 查看表空间的使用情况或表空间的大小,应该如何实现呢?下面就为您介绍实现 Oracle 查看表空间方面的语句. 1.查看表空间的使用情况 Java代码   select sum(bytes)/(1024*1024) as free_space,tablespace_name from dba_free_space group by tablespace_name; SELECT A.TABLESPACE_NAME,A.BYTES TOTAL,B.BYTES USED, C.BYTES

zbb20170728 oracle 查看被锁对象

查询Oracle正在执行和执行过的SQL语句 --查询Oracle正在执行的sql语句及执行该语句的用户 SELECT b.sid oracleID, b.username 登录Oracle用户名, b.serial#, spid 操作系统ID, paddr, sql_text 正在执行的SQL, b.machine 计算机名 FROM v$process a, v$session b, v$sqlarea c WHERE a.addr = b.paddr AND b.sql_hash_valu

oracle 查看锁表情况与解表

oracle 查看锁表情况与解表 CreateTime--2018年4月27日17:24:37 Author:Marydon 1.锁表查询 --锁表查询 SELECT OBJECT_NAME AS TABLE_NAME, MACHINE, S.SID, S.SERIAL# FROM GV$LOCKED_OBJECT L, DBA_OBJECTS O, GV$SESSION S WHERE L.OBJECT_ID = O.OBJECT_ID AND L.SESSION_ID = S.SID; 2.

Oracle 查看表空间的大小及使用情况sql语句

SQL1: --1.查看表空间的名称及大小 SELECT t.tablespace_name, round(SUM(bytes / (1024 * 1024)), 0) ts_size FROM dba_tablespaces t, dba_data_files d WHERE t.tablespace_name = d.tablespace_name GROUP BY t.tablespace_name; --2.查看表空间物理文件的名称及大小 SELECT tablespace_name,

zbb20170816 oracle Oracle 查看表空间、数据文件的大小及使用情况sql语句

oracle Oracle 查看表空间.数据文件的大小及使用情况sql语句 --表空间 --1G=1024MB --1M=1024KB --1K=1024Bytes --1M=11048576Bytes --1G=1024*11048576Bytes=11313741824Bytes SELECT a.tablespace_name "表空间名", total "表空间大小", free "表空间剩余大小", (total - free) &qu