Oracle Enterprise 11gR2にインストールされているBIソフトウェアとリポジトリデータベースを使用しています。
これらのバッチレポートの一部は、まだロックされている可能性のあるデータベーステーブルにアクセスしようとします。 Oracleテーブルがロックされているかどうかを確認するにはどうすればよいですか?分析のように履歴の詳細のように表示されるSQLステートメントはありますか?
次のクエリは、すべてのロックの詳細を示します。
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
次のスクリプトは、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
V $ LOCKED_OBJECT からcurrentlyロックされたオブジェクトをクエリできます。
ただし、ロックの履歴はありません。すべてのロックをログに記録すると、パフォーマンスのオーバーヘッドが大きくなり、大量のデータが保存されます。
データベースに最も近いのはアクティブセッション履歴です V $ ACTIVE_SESSION_HISTORY 、 DBA_HIST_ACTIVE_SESS_HISTORY (使用する適切なライセンスがある場合)。ブロッキングセッション、ステートメント、およびその他の情報。ただし、ロックされたテーブルは含まれません。それ以外の場合は、適切なビューをクエリして、必要なデータを独自のカスタムスクリプトで保存してみてください。
以下のクエリを使用すると、テーブルのロックを確認できます。
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;
v$lock
およびdba_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;
以下のクエリを使用して、詳細を確認できます。 テーブルロック
ロックされたオブジェクトのロックを解除する場合は、対応するセッションを終了してください。
-- 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';