专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

生产环境中imp导入强制中断问题解决

ins518 2024-10-29 15:09:21 技术文章 17 ℃ 0 评论

概述

记录一次生产环境中同事在做imp导入某张表的时候窗口不小心关闭了,导致imp进程中断。在针对该表的操作提示资源繁忙,下面主要提供下整体的解决思路。


误操作命令:

imp xx/xx file=t_ksgl_sjmbtxglb.dmp ignore=y full=y

问题:由于在imp导入某个表的时候会话窗口不小心关了,然后想要drop表重来,但是数据库会话级别删不了。


解决过程:

1、查询数据库中的锁

select /*+rule*/s.sid,p.spid,l.type,round(max(l.ctime)/60,0) lock_min,s.sql_id,s.USERNAME,b.owner,b.object_type,b.object_name from v$session s, v$process p,v$lock l,v$locked_object o,dba_objects b where o.SESSION_ID=s.sid and s.sid=l.sid and o.OBJECT_ID=b.OBJECT_ID and s.paddr = p.addr and l.ctime >100 and l.type in ('TX','TM','FB') group by s.sid,p.spid,l.type,s.sql_id,s.USERNAME,b.owner,b.object_type,b.object_name order by 9,1,3,4;

这里可以发现sid是3570,spid是118034(实际上操作系统进程就是118034)

2、查看相关信息

SELECT 'kill -9 ' || p.spid, /*p.spid,p.pid,*/
 s.sid,
 s.username,
 s.machine,
 s.sql_hash_value,
 s.last_call_et 秒,
 s.last_call_et / 60 运行时间,
 s.client_info,
 p.program "OSProgram",
 'alter system kill session ''' || s.SID || ',' || s.SERIAL# || ''';',
 s.MACHINE
 FROM v$session s, v$process p
 where (s.status = 'ACTIVE' ) AND ((s.username IS NOT NULL)
AND (NVL (s.osuser, 'x') <> 'SYSTEM') AND (s.TYPE <> 'BACKGROUND')) AND (p.addr(+) = s.paddr)
and s.sid = '3570'

3、操作系统层面删除会话

数据库层面无法删除会话:alter system kill session '3570,16331';

操作系统层面删除:kill -9 118034


另一个解决方法:

上面实际上是通过查数据库锁来定位到相关进程,实际上也可以在操作系统层面去查询进程:

ps -ef|grep LOCAL=NO|grep ORACLE_SID|grep -v grep

说明:

LOCAL=NO :非本地连接,即网络连接。 它是通过Listener 连接到服务器的。 客户端的应用通过客户端的监听向服务器的监听发送请求,服务器的监听接收后,在与数据库连接,执行相关操作,在把结果返回给客户端。 这是通过监听的流程。 所以在客户端需要配置监听,即配置tnsnames.ora。

LOCAL=YES:本地连接。 本地连接不走监听,所以在服务监听没有启动的情况下,通过本地的sqlplus 还是可以连上数据库的。

因为imp是直接在操作系统上运行的,所以实际上从操作系统去查询就可以知道是哪个进程了。


这里主要是提供两个解决思路去处理关于imp中断方面的问题,后面会分享更多关于DBA方面的内容,感兴趣的朋友可以关注下!!

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表