oracle 查询锁住的表并解锁

本文详细介绍了在使用 SQL Plus 操作时遇到表被锁无法使用的常见问题,并提供了查询锁定表、查看锁定、杀死会话及检查表大小的方法,帮助解决实际操作中的困扰。

在操作sqlplus 的时候,有的时候不小心的操作就会把表锁上,无法在对表 进行操作。

1.查询被锁住的表

select t2.username,t2.sid,t2.serial#,t2.logon_time
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid order by t2.logon_time;

--查看锁
--alter system kill session 'sid,serial#';
--把锁给KILL掉
alter system kill session '140,30'; --查看表大小
selet bytes from dba_segment where segment_name='table_name'

Oracle 数据库中,当某个会话(Session)长时间持有(如行),可能会导致其他会话被阻塞。这时需要查询当前的情况,根据需要手动解锁。 以下是常用的 **Oracle 查询解锁** 的 SQL 语句。 --- ### ✅ 一、查询当前被定的对象(信息) ```sql SELECT lo.object_name AS locked_object, lo.session_id AS sid, s.serial#, s.username, s.osuser, s.machine, s.program, s.status, s.logon_time, lo.locked_mode, lo.oracle_username, lo.os_user_name FROM v$locked_object lo JOIN dba_objects do ON lo.object_id = do.object_id JOIN v$session s ON lo.session_id = s.sid ORDER BY s.logon_time; ``` #### 🔍 字段说明: - `locked_object`: 被的数据库对象(名) - `sid`: 操作系统的会话 ID - `serial#`: 必须与 SID 一起使用来终止会话 - `username`: Oracle 用户名 - `osuser`: 操作系统用户 - `machine`: 客户端机器名 - `program`: 启动该会话的应用程序(如 JDBC、PL/SQL Developer 等) - `locked_mode`: 模式(1~6,6 是排他 X) - `logon_time`: 登录时间(可用于判断是否为长期未释放的会话) --- ### ✅ 二、查看哪些会话正在阻塞其他会话 ```sql SELECT blocking_session, sid, serial#, wait_class, seconds_in_wait, status, username, program, sql_id FROM v$session WHERE blocking_session IS NOT NULL ORDER BY blocking_session; ``` 这可以查出“谁在被阻塞”以及“谁是罪魁祸首”。 --- ### ✅ 三、查看具体 SQL 内容(通过 SQL_ID) 如果想查看某个会话执行的 SQL 语句: ```sql SELECT sql_text FROM v$sql WHERE sql_id = 'your_sql_id_here'; ``` 或者结合上面的结果: ```sql SELECT s.sql_text FROM v$session ses JOIN v$sql s ON ses.sql_id = s.sql_id WHERE ses.sid = 123; -- 替换为目标 SID ``` --- ### ✅ 四、解锁:终止会话(Kill Session) 找到要解锁的 `SID` 和 `SERIAL#` 后,执行: ```sql ALTER SYSTEM KILL SESSION 'sid,serial#'; ``` #### 示例: ```sql ALTER SYSTEM KILL SESSION '123,4567'; ``` > ⚠️ 注意:替换 `123` 为实际的 SID,`4567` 为实际的 SERIAL# - 这条命令会立即断开对应会话,释放其持有的所有。 - 如果提示会话无法立即终止,状态可能变为 `KILLED`,但资源仍需一段时间才完全释放。 --- ### ✅ 五、补充:查看类型详情 ```sql SELECT s.sid, s.serial#, s.username, s.wait_class, s.event, l.type AS lock_type, l.id1, l.id2, l.lmode, l.request FROM v$session s, v$lock l WHERE s.sid = l.sid AND s.blocking_session IS NOT NULL ORDER BY s.sid; ``` 常见类型: - `TM`: (Table Manager) - `TX`: 事务(Transaction),最常见的是行 --- ### 🧩 小贴士 | 场景 | 建议 | |------|------| | 开发环境卡住 | 直接 kill session | | 生产环境 | 先联系用户或排查原因,避免误杀重要事务 | | 经常出现 | 检查应用是否有长事务、未提交、异常未回滚等问题 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值