ORACEL查看用户锁表信息

本文介绍了一次解决Oracle数据库中订单归档异常的过程。通过分析日志发现更新操作超时,进一步排查发现表被锁定。通过特定SQL语句找到锁表用户并成功解锁,揭示了使用FOR UPDATE可能带来的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一天,测试的同事发来日志说订单归档异常,发来日志看到在执行update操作时出现超时。
Log

该SQL语句没有问题,于是就怀疑是不是有人锁了表。使用sql一查果然是,于是想用解锁语句解锁但是发现没有权限
由于查看锁表sql把锁表的用户也查出来了,所有就直接喊就锁了。

----① 查看用户锁表
select sess.sid, 
sess.serial#, 
lo.oracle_username, 
lo.os_user_name, 
ao.object_name, --表名
lo.locked_mode 
from v$locked_object lo, 
dba_objects ao, 
v$session sess 
where ao.object_id = lo.object_id and lo.session_id = sess.sid

----② 解锁语句
alter system kill session 'sid,serial#'

锁表信息

后来测试同事告诉我,她在查表时后面加了for update.
但是她不知道。

在使用oracel数据库时,一般不要用for update,容易锁表。
如果需要改数据,可以使用
: select t.*,rowid from kpn_interface_log t order by created_date desc;

<think>我们被要求查看Oracle数据库中事务的方法或命令。根据引用内容,我们可以整合多个查询语句来查看信息,包括会话ID、序列号、被名、定模式等。关键点:1.使用DBA视图(如v$locked_object,dba_objects,v$session,v$process等)来查询信息。2.定模式(locked_mode)的数字示不同的类型(如0-6)。3.可以查看阻塞会话的信息(通过v$lock视图中的blocking_session)。根据引用[3]和[5],我们可以使用以下查询来获取详细的信息:```sqlSELECTsess.sid,sess.serial#,lo.oracle_usernameAS登录账号,lo.os_user_nameAS操作系统用户,ao.object_nameAS被名,lo.locked_modeAS模式,CASElo.locked_modeWHEN0THEN'none'WHEN1THEN'null(NULL)'WHEN2THEN'row-S(SS)'WHEN3THEN'row-X(SX)'WHEN4THEN'share(S)'WHEN5THEN'S/Row-X(SSX)'WHEN6THEN'exclusive(X)'ELSE'未知模式'ENDAS模式描述FROMv$locked_objectloJOINdba_objectsaoONao.object_id=lo.object_idJOINv$sessionsessONlo.session_id=sess.sid;```此外,引用[4]提供了一个包含进程ID(spid)的查询,这对于定位操作系统进程很有帮助:```sqlSELECTo.object_name,s.sid,s.serial#,p.spidAS系统进程ID,s.username,s.programFROMv$locked_objectlJOINdba_objectsoONl.object_id=o.object_idJOINv$sessionsONl.session_id=s.sidLEFTJOINv$processpONp.addr=s.paddr;```如果我们需要查看哪些正在阻塞其他会话,可以使用引用[2]中的方法:```sqlSELECT*FROMv$lockWHEREblocking_sessionISNOTNULL;```另外,引用[3]还提供了查看引起SQL语句的方法:```sqlSELECTA.USERNAME,A.MACHINE,A.PROGRAM,A.SID,A.SERIAL#,A.STATUS,C.PIECE,C.SQL_TEXTFROMV$SESSIONA,V$SQLTEXTCWHEREA.SIDIN(SELECTDISTINCTT2.SIDFROMV$LOCKED_OBJECTT1,V$SESSIONT2WHERET1.SESSION_ID=T2.SID)ANDA.SQL_ADDRESS=C.ADDRESS(+)ORDERBYC.PIECE;```注意事项:-执行这些查询需要具有访问动态性能视图(如v$session,v$locked_object)的权限,通常需要DBA权限。-在RAC环境中,可能需要使用gv$开头的全局视图(如gv$locked_object,gv$session)来查看所有实例的信息。解方法(如果需要):根据引用[1]和[3],可以使用:```sqlALTERSYSTEMKILLSESSION'sid,serial#';```例如,如果查询结果中sid=123,serial#=456,则执行:```sqlALTERSYSTEMKILLSESSION'123,456';```在回答中,我们将整合这些查询,并提供详细的步骤说明。</think>### Oracle 查看事务的完整方法 在 Oracle 数据库中查看事务信息,可通过以下方法操作: #### 1. **基本查询** ```sql SELECT sess.sid AS 会话ID, sess.serial# AS 序列号, lo.oracle_username AS 数据库用户, ao.object_name AS 被名, lo.locked_mode AS 模式, CASE lo.locked_mode WHEN 0 THEN 'none' WHEN 1 THEN 'null (NULL)' WHEN 2 THEN 'row-S (SS) 行共享' WHEN 3 THEN 'row-X (SX) 行排他' WHEN 4 THEN 'share (S) 共享' WHEN 5 THEN 'S/Row-X (SSX) 共享行排他' WHEN 6 THEN 'exclusive (X) 排他' ELSE '未知模式' END AS 模式描述 FROM v$locked_object lo JOIN dba_objects ao ON ao.object_id = lo.object_id JOIN v$session sess ON lo.session_id = sess.sid; ``` [^3][^5] #### 2. **查看阻塞(关键事务)** ```sql SELECT l.sid AS 阻塞会话ID, s.serial# AS 序列号, s.username AS 用户, s.status AS 状态, l.type AS 类型, o.object_name AS 被名 FROM v$lock l JOIN v$session s ON l.sid = s.sid LEFT JOIN dba_objects o ON l.id1 = o.object_id WHERE l.block > 0; -- 只显示阻塞其他会话的 ``` [^2] #### 3. **查看完整事务信息(含SQL语句)** ```sql SELECT s.sid, s.serial#, s.username, s.osuser, s.machine, s.program, l.object_name AS 对象, sq.sql_text AS 执行SQL FROM v$session s JOIN v$locked_object lo ON s.sid = lo.session_id JOIN dba_objects l ON lo.object_id = l.object_id LEFT JOIN v$sql sq ON s.sql_id = sq.sql_id; ``` [^3][^4] #### 4. **查看等待链(RAC环境适用)** ```sql SELECT w.session_id AS 等待会话, h.session_id AS 持有会话, o.object_name AS 名, w.lock_type AS 等待类型 FROM dba_waiters w JOIN dba_blockers h ON w.holding_session = h.session_id JOIN dba_objects o ON w.locked_object = o.object_id; ``` --- ### 关键说明: 1. **模式含义**: - **2 (Row-S)**:共享行,允许多个会话读取 - **3 (Row-X)**:排他行,用于数据修改 - **4 (Share)**:共享,阻止DDL操作 - **6 (Exclusive)**:最高级别,阻止所有操作[^3] 2. **事务状态分析**: - 检查`v$session.status`:`ACTIVE`示事务进行中 - 阻塞会话的`v$lock.block`值大于0 3. **操作权限要求**: - 需`SELECT`权限访问`v$`动态视图 - 最佳实践:使用`SYSDBA`账户执行查询 > ⚠️ 注意:生产环境解前需确认事务状态,避免数据丢失。使用`ALTER SYSTEM KILL SESSION 'sid,serial#'`解[^1]。 --- ### 示例诊断流程: 1. 运行基础查询 → 识别被名和会话ID 2. 检查阻塞 → 定位源头事务 3. 查看关联SQL → 分析原因 4. 联系会话用户 → 确认事务状态 5. 必要时终止会话 → `ALTER SYSTEM KILL SESSION '123,4567'` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值