【发布时间】:2016-04-01 10:08:53
【问题描述】:
我想确定哪个进程锁定了我的表 TABLE1,以及锁定时的时间戳。
我想我应该使用dba_locks 和gv$session 之类的表,但我是Oracle 新手,对系统表了解不多。
谁能帮我解决这个问题?
【问题讨论】:
我想确定哪个进程锁定了我的表 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.
);
这不一定与“上次锁定表是什么时候”相同。表或表中的一行可能已被锁定,但没有会话等待它。并且有可能会话确实在等待它,但不是在示例期间。
但是,如果某些事情发生的频率不足以出现在会话历史记录表中,那么通常不必担心它的重要性。
【讨论】:
GV$ACTIVE_SESSION_HISTORY 是历史性的,阻塞会话可能会立即消失。此外,如果您使用的是集群数据库,请确保您与GV$SESSION 进行比较,而不仅仅是V$SESSION。 (抱歉重播晚了。)
您可以查询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 以获取有关锁定会话的信息,而不是锁定的表。
【讨论】: