我想确定哪个进程锁定了我的表TABLE1,以及锁定它时的时间戳。
我想我应该使用像dba_locks
和gv$session
这样的表,但我是Oracle的新手,我对系统表不太了解。
有人可以帮我解决这个问题吗?
答案 0 :(得分:3)
使用此查询查找上次阻止会话等待访问特定表的时间:
select max(sample_time) last_block_time
from gv$active_session_history
--Or use this table for further back.
--from dba_hist_active_sess_history
where blocking_session is not null
and current_obj# =
(
select object_id
from dba_objects
where owner = 'JHELLER' --Enter the object owner here.
and object_name = 'TEST1' --Enter the object name here.
);
这与&#34不一样;最后一次锁定表时是什么时候#34;。可能表格或表格中的一行被锁定但没有会话等待它。并且会话确实可以等待它,但不是在样本期间。
但是,如果某些事情发生的频率不足以出现在会话历史记录表中,那么它通常不够重要而无法担心。
答案 1 :(得分:1)
您可以查询V$LOCKED_OBJECT
以获取有关当前锁定对象的信息。
SQL> desc v$locked_object;
Name Null? Type
-------------------- -------- ----------------------------
XIDUSN NUMBER
XIDSLOT NUMBER
XIDSQN NUMBER
OBJECT_ID NUMBER
SESSION_ID NUMBER
ORACLE_USERNAME VARCHAR2(30)
OS_USER_NAME VARCHAR2(30)
PROCESS VARCHAR2(24)
LOCKED_MODE NUMBER
Oracle不会保留锁定历史记录。但是,您可以查询DBA_HIST_ACTIVE_SESS_HISTORY
amd V$ACTIVE_SESSION_HISTORY
以获取有关锁定会话的信息,但不能获取锁定的表格。