我想确定哪个进程锁定了我的表TABLE1,以及锁定时的时间戳。
我想我应该使用像dba_locks
和gv$session
这样的表,但我是Oracle的新手,对系统表了解不多。
有人能帮我解决这个问题吗?
使用此查询查找会话上次被阻止等待访问特定表的时间:
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.
);
这与"上一次锁定桌子是什么时候"不一定是一回事。可能是表或表中的一行被锁定,但没有会话在上面等待。也可能是会话确实在上面等待,但在采样期间没有。
然而,如果某件事发生的频率不足以出现在会话历史记录表中,那么它通常就不那么重要了。
您可以查询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
和V$ACTIVE_SESSION_HISTORY
来获得关于锁定会话的信息,但不能查询锁定的表。