如何确定Oracle表是否被锁定?


22

我们一直在使用安装在Oracle Enterprise 11gR2上的BI软件和一个存储库数据库。

这些批处理报告中的一些将尝试访问可能仍被锁定的数据库表。如何确定Oracle表是否被锁定?是否有任何SQL语句显示类似历史记录的详细信息以进行分析?


我的意思是我想显示特定时间间隔内的内容。
Selahattin 2014年

例如:我想列出02:00:00 PM-05:00:00 PM之间的所有锁定表,以进行进一步分析。
Selahattin 2014年

通常我想在oracle中找到锁定表?
Selahattin

1
@Selahattin您在谈论应用程序级别锁定吗?Oracle不一般,因为它的序列水平上进行表锁定和设计
Philᵀᴹ

Answers:


32

以下查询给出了所有锁的详细信息。

SELECT B.Owner, B.Object_Name, A.Oracle_Username, A.OS_User_Name  
FROM V$Locked_Object A, All_Objects B
WHERE A.Object_ID = B.Object_ID

10

可以使用以下脚本来快速识别Oracle系统中的所有锁定对象。

select
   c.owner,
   c.object_name,
   c.object_type,
   b.sid,
   b.serial#,
   b.status,
   b.osuser,
   b.machine
from
   v$locked_object a ,
   v$session b,
   dba_objects c
where
   b.sid = a.session_id
and
   a.object_id = c.object_id;

参考:-Burleson Consulting的Oracle技巧http://www.dba-oracle.com/t_find_oracle_locked_objects.htm


2

您可以从V $ LOCKED_OBJECT查询当前锁定的对象。

虽然没有锁的历史记录,但记录所有锁将导致巨大的性能开销和大量数据要存储。

数据库最接近的是活动会话历史记录V $ ACTIVE_SESSION_HISTORYDBA_HIST_ACTIVE_SESS_HISTORY(如果您具有使用它的适当许可证),您可以在其中查看阻止的会话,语句和其他信息,但不能查看锁定的表。否则,您可以尝试查询适当的视图,并使用自己的自定义脚本保存所需的数据。


2

使用以下查询,您可以找到表上的锁。

column oracle_username format a15;
column os_user_name format a15;
column object_name format a37;
column object_type format a37;
select a.session_id,a.oracle_username, a.os_user_name, b.owner "OBJECT OWNER", b.object_name,b.object_type,a.locked_mode from 
(select object_id, SESSION_ID, ORACLE_USERNAME, OS_USER_NAME, LOCKED_MODE from v$locked_object) a, 
(select object_id, owner, object_name,object_type from dba_objects) b
where a.object_id=b.object_id;

锁块


0

如果您希望释放对锁定对象的锁定,请终止相应的会话。

-- Query to Get List of all locked objects
SELECT B.Owner, B.Object_Name, A.Oracle_Username, A.OS_User_Name  
FROM V$Locked_Object A, All_Objects B
WHERE A.Object_ID = B.Object_ID ; 
-- and A.OS_USER_NAME = 'mahendar' 

-- Query to Get List of locked sessions        
select SID,SERIAL#,INST_ID from gv$session a  where schemaname = 'SYSTEM';
-- and osuser =  'mahendar';
-- o/p: 314 26513   1

-- Statement to Kill the session [pass values in the same order and append @ for inst_id]
alter system kill session '314,26513,@1';

0

您可以从v$lockdba_objects查看表锁定。下面的查询将为您提供锁的详细信息。

select a.sid||'|'|| a.serial#||'|'|| a.process
from v$session a, v$locked_object b, dba_objects c
where b.object_id = c.object_id
and a.sid = b.session_id
and OBJECT_NAME=upper('&TABLE_NAME');

查询2:

select
(select username from v$session where sid=a.sid) blocker,
a.sid,
' is blocking ',
(select username from v$session where sid=b.sid) blockee,
b.sid
from
v$lock a,
v$lock b
where
a.block = 1
and
b.request > 0
and
a.id1 = b.id1
and
a.id2 = b.id2;

您可以使用下面的查询,它会给您更多细节。 餐桌锁

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.