问题现象: 在某次使用expdp进行全库导出时,任务长时间停滞在 99% 进度,日志无新输出,且数据库整体性能显著下降,部分会话登录延迟较高。 问题排查 1.确认 Data Pump 作业状态
SELECT * FROM dba_datapump_jobs WHERE job_name = 'SYS_EXPORT_FULL_01';
通过 dba_datapump_jobs 查询发现导出作业状态为 EXECUTING,但无进展 2.检查会话等待事件与锁定 -- 查找持有锁的会话
SELECT vs.sid, vs.event, vp.spid, lo.object_id FROM v$session vs, v$process vp, dba_datapump_sessions dp, v$locked_object lo WHERE vs.paddr = vp.addr AND vs.saddr = dp.saddr AND lo.session_id = vs.sid;
发现部分会话等待事件为 enq: TM - contention(表级锁争用)或 wait for unread message on broadcast channel(进程通信阻塞) -- 定位锁定对象
SELECT owner, object_name FROM dba_objects WHERE object_id = 52663;
结果显示会话 156 对表 XXX 持有 Row Share 锁 3.分析 Data Pump 进程活动 -- 跟踪 Data Pump 进程的 SQL 操作
oradebug setospid 18136 -- 对应进程 ID oradebug dump errorstack 3
发现 Data Pump 尝试执行 LOCK TABLE XXX IN ROW SHARE MODE,但被阻塞 4.检查资源使用情况 磁盘 I/O:通过 iostat 确认导出目录无 I/O 瓶颈。 内存与交换空间:top 显示 Oracle 进程未频繁使用交换空间,排除内存不足问题 问题处理 表级锁争用:156会会话对表XXX 执行了DML操作,但一直未提交,导致 Data Pump 在导出时因锁争用挂起 确认该会话可以kill后,执行sql终止该会话
ALTER SYSTEM KILL SESSION '156,18652';
会话处理后导出正常完成。
