作为IT工程师,掌握Oracle数据库表锁状态的查询方法对于性能调优和故障排查至关重要。以下是一些实用的查询技巧:
SELECT
l.session_id sid,
s.serial#,
l.locked_mode,
l.oracle_username,
l.os_user_name,
s.machine,
s.terminal,
o.object_name,
o.object_type,
s.logon_time
FROM
v$locked_object l,
dba_objects o,
v$session s
WHERE
l.object_id = o.object_id
AND l.session_id = s.sid
ORDER BY
sid, s.serial#;
SELECT
l1.sid || ' is blocking ' || l2.sid blocking_sessions,
s1.username blocker,
s1.terminal blocker_terminal,
s2.username waiter,
s2.terminal waiter_terminal,
s1.sql_id blocker_sql_id,
s2.sql_id waiter_sql_id
FROM
v$lock l1,
v$session s1,
v$lock l2,
v$session s2
WHERE
s1.sid = l1.sid
AND s2.sid = l2.sid
AND l1.block = 1
AND l2.request > 0
AND l1.id1 = l2.id1
AND l1.id2 = l2.id2;
SELECT
s.sid,
s.serial#,
s.username,
s.osuser,
s.machine,
s.program,
s.module,
s.status,
s.logon_time,
l.type,
l.lmode,
l.request,
l.block,
o.object_name
FROM
v$session s,
v$lock l,
dba_objects o
WHERE
s.sid = l.sid
AND l.id1 = o.object_id(+)
AND o.object_name = 'YOUR_TABLE_NAME'
ORDER BY
s.sid;
Oracle锁模式数字含义: - 0:none - 1:null (NULL) - 2:row-S (SS) - 3:row-X (SX) - 4:share (S) - 5:S/Row-X (SSX) - 6:exclusive (X)
SELECT
s.sid,
s.serial#,
s.username,
s.status,
q.sql_text
FROM
v$session s,
v$sql q
WHERE
s.sql_id = q.sql_id
AND s.sid IN (SELECT sid FROM v$lock WHERE block = 1);
SELECT
s.sid,
s.serial#,
s.username,
s.status,
s.last_call_et/3600 hours_waited,
s.blocking_session,
s.event,
s.sql_id,
s.prev_sql_id
FROM
v$session s
WHERE
s.blocking_session IS NOT NULL
OR s.sid IN (SELECT blocking_session FROM v$session)
ORDER BY
hours_waited DESC;
-- 先查询会话信息
SELECT sid, serial#, username FROM v$session WHERE sid = &sid;
-- 然后终止会话
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
SELECT
session_id,
owner,
name,
type,
mode_held,
mode_requested
FROM
dba_ddl_locks;
掌握这些查询技巧可以帮助您快速定位和解决Oracle数据库中的锁问题,提高系统性能和可用性。