Làm thế nào để xác định xem một bảng Oracle có bị khóa hay không?


22

Chúng tôi đã sử dụng phần mềm BI và cơ sở dữ liệu kho lưu trữ được cài đặt trên Oracle Enterprise 11gR2.

Một số báo cáo hàng loạt này sẽ cố gắng truy cập vào bảng cơ sở dữ liệu vẫn có thể bị khóa. Làm thế nào tôi có thể tìm ra nếu một bảng Oracle bị khóa hay không? Có câu lệnh SQL nào hiển thị như chi tiết lịch sử để phân tích không?


Ý tôi là tôi muốn hiển thị mọi thứ trong khoảng thời gian cụ thể.
Selahattin

Ví dụ: Tôi muốn liệt kê tất cả các bảng bị khóa trong khoảng từ 02:00:00 PM - 05:00:00 PM để phân tích thêm.
Selahattin

Nói chung tôi muốn tìm các bảng bị khóa trong orory?
Selahattin

1
@Selahattin Bạn đang nói về khóa cấp độ ứng dụng? Oracle thường không thực hiện khóa bảng do mức độ tuần tự hóa và thiết kế của nó
Phil

Câu trả lời:


32

Truy vấn sau đây cung cấp chi tiết của tất cả các khóa.

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

Tập lệnh sau có thể được sử dụng để nhanh chóng xác định tất cả các đối tượng khóa trong hệ thống Oracle của bạn.

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;

Tham khảo: -Những lời khuyên của Burleson Consulting http://www.dba-oracle.com/t_find_oracle_locked_objects.htmlm


2

Bạn có thể truy vấn các đối tượng hiện đang bị khóa từ V $ LOCKED_OB DỰ ÁN .

Không có lịch sử cho các khóa mặc dù, việc ghi nhật ký tất cả các khóa sẽ có hiệu suất quá lớn và rất nhiều dữ liệu sẽ được lưu trữ.

Cơ sở dữ liệu gần nhất có lịch sử Phiên hoạt động V $ ACTIVE_SESSION_HISTORY , DBA_HIST_ACTIVE_SESS_HISTORY (nếu bạn có giấy phép phù hợp để sử dụng nó), nơi bạn có thể xem các phiên chặn, câu lệnh và thông tin khác, nhưng không bị khóa bảng. Nếu không, bạn có thể cố gắng truy vấn các chế độ xem phù hợp và lưu dữ liệu cần thiết với tập lệnh tùy chỉnh của riêng bạn.


2

Sử dụng truy vấn dưới đây, bạn có thể tìm ra các khóa trên bảng.

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;

Khóa chặn


0

Nếu bạn muốn giải phóng khóa trên đối tượng bị khóa, sau đó hủy phiên tương ứng.

-- 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

Bạn có thể kiểm tra khóa bảng từ v$lockdba_objectsxem. Dưới đây truy vấn sẽ cung cấp cho bạn các chi tiết khóa.

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');

SỐ 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;

Bạn có thể sử dụng truy vấn dưới đây sẽ cung cấp cho bạn chi tiết hơn. Khóa bàn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.