插件窝 干货文章 Oracle查询表锁状态的实用技巧

Oracle查询表锁状态的实用技巧

session sid sql SELECT 241    来源:    2025-04-09

Oracle查询表锁状态的实用技巧

作为IT工程师,掌握Oracle数据库表锁状态的查询方法对于性能调优和故障排查至关重要。以下是一些实用的查询技巧:

1. 基本锁状态查询

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

2. 查看锁等待情况

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;

3. 查看特定表的锁信息

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;

4. 查看锁模式说明

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)

5. 查看锁定的SQL语句

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

6. 查看长时间持有锁的会话

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;

7. 解锁会话的方法

-- 先查询会话信息
SELECT sid, serial#, username FROM v$session WHERE sid = &sid;

-- 然后终止会话
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;

8. 查看DDL锁

SELECT 
    session_id,
    owner,
    name,
    type,
    mode_held,
    mode_requested
FROM 
    dba_ddl_locks;

实用建议

  1. 定期监控锁等待情况,特别是生产环境
  2. 对于长时间持有锁的会话,优先考虑优化SQL而非直接终止
  3. 使用AWR/ASH报告分析历史锁问题
  4. 考虑使用Oracle的Application Continuity特性处理锁超时
  5. 对于关键业务表,合理设计事务大小和提交频率

掌握这些查询技巧可以帮助您快速定位和解决Oracle数据库中的锁问题,提高系统性能和可用性。