本地--Oracle表被锁了该如何处理
Oracle PDB 数据库锁表处理流程
⚙️ 步骤一:连接并切换至目标 PDB
当您使用 sysdba
权限登录 Oracle 12c 或更高版本时,默认会进入根容器 (CDB)。锁通常发生在具体的业务数据库 (PDB) 中,因此第一步必须切换到正确的 PDB。
-- 将 <PDB_NAME> 替换成您实际的 PDB 名称
ALTER SESSION SET CONTAINER = <PDB_NAME>;-- 根据我们的示例:
ALTER SESSION SET CONTAINER = devdb;
🔍 步骤二:查找并分析锁信息
切换到 PDB 后,执行以下查询来找出是哪个数据表被哪个会话锁住。
SELECTdo.object_name, -- 被锁的数据表lo.session_id, -- 会话 ID (SID)vs.serial#, -- 会话序列号lo.oracle_username, -- 锁表的用户vs.status, -- 会话状态 (INACTIVE 很常见)vs.machine, -- 来源电脑vs.program -- 来源程序
FROMv$locked_object lo
JOINdba_objects do ON lo.object_id = do.object_id
JOINv$session vs ON lo.session_id = vs.sid;
执行后,请务必记下结果中的 SESSION_ID
(SID) 和 SERIAL#
(序列号)。
✅ 步骤三:解决锁问题
根据上一步的分析结果,采取相应措施。
方案 A(推荐优先):联系用户
这是最安全的方式。根据查询到的 MACHINE
和 PROGRAM
信息,找到操作者,请他/她自行 COMMIT(提交)或 ROLLBACK(回滚)事务。
方案 B(强制手段):终止会话 (Kill Session)
若无法联系到用户或情况紧急,可强制终止其会话。请注意,这会导致该会话中所有未提交的工作全部丢失(被回滚)。
-- 将 <SID> 和 <SERIAL#> 替换为步骤二查到的实际值
ALTER SYSTEM KILL SESSION '<SID>,<SERIAL#>' IMMEDIATE;-- 示例:
ALTER SYSTEM KILL SESSION '1242,44817' IMMEDIATE;