oracle的锁表和解锁

本文深入探讨了Oracle数据库中会话管理及锁操作的原理与实践,包括如何查询锁定对象的会话信息、锁定表的会话详情、锁定类型与模式等,并详细解释了使用killsession命令终结会话的过程及其区别。通过实例展示了在不同场景下使用killsession命令时的状态变化,以及在没有immediate参数的情况下会话状态的持久性和恢复过程。
 SELECT /*+ rule */ s.username,
 decode(l.type,'TM','TABLE LOCK',
 'TX','ROW LOCK',
 NULL) LOCK_LEVEL,
 o.owner,o.object_name,o.object_type,
 s.sid as sid,s.serial# as serial#,s.terminal,s.machine,s.program,s.osuser
 FROM v$session s,v$lock l,dba_objects o
 WHERE l.sid = s.sid
 AND l.id1 = o.object_id(+)
 AND s.username is NOT NULL
 
--kill session语句alter system kill session'sid,serial#' immediate;
 alter system kill session'10,46004' immediate;
 --以下几个为相关表
 SELECT * FROM v$lock;
 SELECT * FROM v$sqlarea;
 SELECT * FROM v$session;
 SELECT * FROM v$process ;
 SELECT * FROM v$locked_object;
 SELECT * FROM all_objects;
 SELECT * FROM v$session_wait;
--1.查出锁定object的session的信息以及被锁定的object名
SELECT l.session_id sid, s.serial# as serial#, l.locked_mode,l.oracle_username,
 l.os_user_name,s.machine, s.terminal, o.object_name, s.logon_time
 FROM v$locked_object l, all_objects o, v$session s
 WHERE l.object_id = o.object_id
 AND l.session_id = s.sid
 ORDER BY sid, s.serial# ;
 --2.查出锁定表的session的sid, serial#,os_user_name, machine name, terminal和执行的语句
 --比上面那段多出sql_text和action
 SELECT l.session_id sid, s.serial#, l.locked_mode, l.oracle_username, s.user#,
 l.os_user_name,s.machine, s.terminal,a.sql_text, a.action
 FROM v$sqlarea a,v$session s, v$locked_object l
 WHERE l.session_id = s.sid
 AND s.prev_sql_addr = a.address
 ORDER BY sid, s.serial#;
 --3.查出锁定表的sid, serial#,os_user_name, machine_name, terminal,锁的type,mode
 SELECT s.sid, s.serial#, s.username, s.schemaname, s.osuser, s.process, s.machine,
 s.terminal, s.logon_time, l.type
 FROM v$session s, v$lock l
 WHERE s.sid = l.sid
 AND s.username IS NOT NULL
 ORDER BY sid;
 
--这个语句将查找到数据库中所有的DML语句产生的锁,还可以发现,
 --任何DML语句其实产生了两个锁,一个是表锁,一个是行锁。
 --杀锁命令
 alter system kill session 'sid,serial#'
 SELECT /*+ rule */ s.username,
 decode(l.type,'TM','TABLE LOCK',
 'TX','ROW LOCK',
 NULL) LOCK_LEVEL,
 o.owner,o.object_name,o.object_type,
 s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser
 FROM v$session s,v$lock l,dba_objects o
 WHERE l.sid = s.sid
 AND l.id1 = o.object_id(+)
 AND s.username is NOT NULL
 --以上查询结果是一个树状结构,如果有子节点,则表示有等待发生。
 --如果想知道锁用了哪个回滚段,还可以关联到V$rollname,其中xidusn就是回滚段的USN
 col user_name format a10
 col owner format a10
 col object_name format a10
 col object_type format a10
  --如果发生了锁等待,我们可能更想知道是谁锁了表而引起谁的等待
 --以下的语句可以查询到谁锁了表,而谁在等待。
 SELECT /*+ rule */ lpad(' ',decode(l.xidusn ,0,3,0))||l.oracle_username User_name,
 o.owner,o.object_name,o.object_type,s.sid,s.serial#
 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 o.object_id,xidusn DESC

 ===================================

SYS >select sid,serial#,status,server,inst_id from gv$session where username='APP';

       SID    SERIAL# STATUS   SERVER       INST_ID
---------- ---------- -------- --------- ----------
        20       1925 INACTIVE DEDICATED          1



不加immedate,kill session后查询gv$session,该会话记录STATUS是KILLED。

SYS >alter system kill session '20,1925,@1';
SYS >select sid,serial#,status,server,inst_id from gv$session where username='APP';

       SID    SERIAL# STATUS   SERVER       INST_ID
---------- ---------- -------- --------- ----------
        20       1925 KILLED   PSEUDO             1


在用户app的会话中操作,提示如下:
APP >select * from tab;
select * from tab
*
ERROR at line 1:
ORA-00028: your session has been killed


再查询gv$session,该会话记录已经没有了。
SYS >select sid,serial#,status,server,inst_id from gv$session where username='APP';

no rows selected




用app用户重新登录,再加上immediate子句操作:
SYS >select sid,serial#,status,server,inst_id from gv$session where username='APP';

       SID    SERIAL# STATUS   SERVER       INST_ID
---------- ---------- -------- --------- ----------
       243      15622 INACTIVE DEDICATED          1


SYS >alter system kill session '243,15622,@1' immediate;

再查询gv$session
SYS >select sid,serial#,status,server,inst_id from gv$session where username='APP';

no rows selected

这是可以看到gv$session已经没有记录了。


而app用户查询,直接提示连接断开了。
APP >select * from tab;
select * from tab
*
ERROR at line 1:
ORA-03135: connection lost contact
Process ID: 10189
Session ID: 243 Serial number: 15622



Whether or not the session has an ongoing transaction, Oracle Database does not
recover the entire session state until the session user issues a request to the session and
receives a message that the session has been terminated.

IMMEDIATE Specify IMMEDIATE to instruct Oracle Database to roll back ongoing
transactions, release all session locks, recover the entire session state, and return
control to you immediately.

根据oracle的文档,在没有immediate字句情况下,oracle终结会话后,直到会话用户发起请求并提示会话终结后,才会恢复该会话状态。而immediate子句的作用是终结会话后,马上恢复该会话状态,所以前面例子操作后查询gv$session,已经没有该会话状态。

<think>首先,用户的问题是基于提供的引用内容:"我想查找Oracle数据库解锁的方法"。我需要参考系统指令用户提供的信息来构建回答。 系统指令关键点: - 所有行内数学达式使用$...$格式(但这个问题不涉及数学,所以可能不适用)。 - 独立公式使用$$...$$并单独成段(同样,不适用)。 - LaTeX语法正确(这里没有LaTeX)。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾添加引用标识,例如[^1]。 - 回答结构清晰,帮助用户逐步解决问题,保证真实可靠。 - 参考站内引用:[^1]、[^2]、[^3]、[^4],这些是关于Oracle数据库解锁的方法。 用户提供的引用摘要: - [^1]:包括查询的代码、查看哪个、session信息杀掉进程的命令。 - [^2]:类似,添加了查找session详细信息。 - [^3]:查询哪些对象被的语句。 - [^4]:更详细的查询方法包括用户名、进程等。 我的回答需要整合这些信息,提供一个清晰的逐步指南。既然用户问“解锁的方法”,我应该覆盖: 1. 如何查询信息。 2. 如何解锁(杀掉相关进程)。 结构化回答: - **开头**:简要介绍解锁的重要性。 - **步骤**:分步解释查询解锁的方法。 - **结尾**:添加相关问题以鼓励深入学习。 引用处理: - 在每个引用的信息末尾添加引用标识。例如,如果我提到某个查询语句来自[^1],则在末尾加[^1]。 - 确保引用自然融入文本。 生成相关问题: - 在回答结束后,添加“相关问题”部分,类似示例中的格式。 - 问题应基于主题,如Oracle机制、预防、最佳实践等确保真实可靠。 完整结构: 1. **回答主体**: - 解释的原因(简要)。 - 查询信息的步骤(使用提供的SQL)。 - 解锁的步骤(使用alter system kill session)。 2. **引用标识**:在适当的地方添加[^1]等。 3. **相关问题**:列出2-3个相关问题。 相关问题建议: 1. 如何预防Oracle数据库中的问题? 2. 查询中的v$locked_object其他视图的区别? 3. 解锁操作失败时如何处理? 最终回答: - 使用中文。 - 清晰、逐步。 </think>### Oracle数据库解锁方法 在Oracle数据库操作中,Table Lock)可能导致数据访问阻塞,影响系统性能。常见原因包括长时间运行的未提交事务或并发操作冲突。后,需要及时查询定对象并解锁以避免系统停滞。以下方法基于Oracle官方文档最佳实践整理,我将逐步解释查询信息解锁的完整流程。操作时,请确保您具有DBA权限(如SYSDBA或SYSOPER),否则某些命令可能失败[^1][^2][^3][^4]。 #### 步骤1: 查询信息 首先,通过SQL语句识别哪些以及相关会话信息。以下是推荐的几种查询方法(可根据需求选择一种): - **基础查询:检查对象总数详细信息** 运行以下语句查看对象列(包括名、定模式等): ```sql -- 查看定对象总数 SELECT COUNT(*) FROM v$locked_object; [^1] -- 查看所有详细信息(包括名、定模式) SELECT b.owner, b.object_name, a.session_id, a.locked_mode FROM v$locked_object a, dba_objects b WHERE b.object_id = a.object_id; [^1][^3] ``` 此查询将返回的拥有者(owner)、名(object_name)、会话ID(session_id)定模式(locked_mode)。定模式值强度,例如2示行级共享,3示排他[^1][^4]。 - **进阶查询:识别引起的会话** 如果需要更详细的信息(如用户名、登录时间),使用以下语句: ```sql -- 查找引起的会话(包括用户名、SID、SERIAL#等) SELECT b.username, b.sid, b.serial#, b.logon_time FROM v$locked_object a, v$session b WHERE a.session_id = b.sid ORDER BY b.logon_time; [^1][^2] -- 扩展查询(包括进程、程序信息) SELECT dba_objects.object_name, v$locked_object.oracle_username, v$locked_object.os_user_name, v$locked_object.locked_mode, v$session.process, v$session.program, v$session.sid, v$session.serial# FROM v$locked_object, dba_objects, v$session WHERE v$locked_object.object_id = dba_objects.object_id AND v$locked_object.session_id = v$session.sid; [^4] ``` 此步骤帮助您确定哪个用户或程序导致了。记录输出的SID(会话ID)SERIAL#(序列号),它们用于解锁操作[^2][^4]。 #### 步骤2: 解锁 确认会话后,通过终止相关会话来解锁。使用`ALTER SYSTEM KILL SESSION`命令: - **执行解锁命令** 替换查询到的SIDSERIAL#值: ```sql ALTER SYSTEM KILL SESSION 'sid,serial#'; [^1][^2] ``` 例如,如果查询到SID=1025、SERIAL#=41,命令为: ```sql ALTER SYSTEM KILL SESSION '1025,41'; [^1] ``` **注意**: - 此命令立即终止会话,释放资源。但需谨慎执行,因为它会中断会话中的事务(可能导致数据回滚)[^2]。 - 如果提示“权限不足”,请以SYSDBA身份登录(如`sqlplus / as sysdba`)再操作。 - 解锁后,建议重新运行步骤1的查询验证是否解除[^2][^4]。 #### 额外提示 - **原因预防**:常由未提交事务或长时间查询引起。优化SQL语句、设置合理事务超时(如`ALTER SESSION SET idle_timeout`)或使用超时参数(如`DDL_LOCK_TIMEOUT`)可减少风险[^1][^3]。 - **权限问题**:如果无法查询视图(如v$locked_object),确保用户拥有SELECT权限(需DBA授权)[^2]。 通过以上步骤,您可以高效识别处理Oracle问题。如果操作后仍未解除,可能是系统级死,建议检查AWR报告或联系Oracle支持[^1][^4]。 ### 相关问题 1. 如何预防Oracle数据库中的问题? 2. Oracle视图(如v$locked_objectdba_objects)的区别使用场景? 3. 解锁操作失败(如权限错误或会话无法终止)时,有哪些应急处理方法?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值