美文网首页
[oracle][疑难问题]ORA-00031:标记要终止的会话

[oracle][疑难问题]ORA-00031:标记要终止的会话

作者: 纵横叹 | 来源:发表于2018-09-18 10:28 被阅读72次

    问题场景:在操作大数据量的时候,会出现种种问题导致数据不正确导致需要重新处理数据,如果这个时候删除表数据会无法删除成功,然后手动终止会话可能会提示“标记要终止的会话”,这是因为手动终止会话后,进程的状态被设置为“killed”,但是锁定的资源很长时间没有被释放,那么可以在OS级再杀死相应的进程(线程),详细操作如下:

    1,查询临时会话的session:

    --查找sql执行的会话session id, 用session id 这一栏的数据进行kill掉会话

    SELECT B.SID,

          B.OBJECT,

          A.SQL_ID,

          A.LOGON_TIME,

          A.SQL_EXEC_START,

          A.MODULE,

          C.SQL_TEXT,

          C.SQL_FULLTEXT,

          A.OSUSER,

          A.EVENT#,

          A.EVENT,

          A.INST_ID,

          A.ACTION,

          A.PROCESS,

          A.STATUS,

          'alter system kill session ''' || a.sid || ', ' || a.serial# ||

          ', @' || a.inst_id || ''' IMMEDIATE;' kill_session,

          A.*

      FROM GV$SESSION A, GV$ACCESS B,GV$SQL C

    WHERE A.SID = B.SID

      AND A.INST_ID = B.INST_ID

      AND A.SQL_ID = C.SQL_ID(+)

      AND A.INST_ID = C.INST_ID(+)

      --AND A.TYPE <> 'BACKGROUND'

      --AND A.STATUS = 'ACTIVE'

      AND B.OWNER = 'BI_DM'

      --AND A.INST_ID =1

      --AND A.ACTION IN ('ORA$AT_SA_SPC_SY_4630','ORA$AT_OS_OPT_SY_4629')

      AND B.OBJECT = 'TMP_T_JOBNAME'

      --AND A.USERNAME LIKE 'DEV%'

      --AND A.MACHINE IN (/*'infor',*/'winitdb')

      ORDER BY A.SQL_EXEC_START;

    2,执行session id 里面是语句

    alter system kill session '2761, 65372, @2' IMMEDIATE;

    在kill session的时候,当提示RA-00031:标记要终止的会话 时

    按如下操作:

    1,select a.spid,b.sid,b.serial#,b.username from v$process a,v$session b where a.addr=b.paddr and b.status='KILLED';

    2,如果利用上面的命令杀死一个进程后,进程状态被置为"killed",但是锁定的资源很长时间没有被释放,那么可以在OS级再杀死相应的进程(线程),首先执行下面的语句获得进程(线程)号: 

    select b.spid,a.osuser,b.program from v$session a,v$process b where a.paddr=b.addr  and a.sid=9065     --9065就是上面的sid

    .在OS上杀死这个进程(线程)

    1)、在unix上,用root身份执行命令:#kill -9 9065(即第2步查询出的spid) 

    2)、在windows(unix也适用)用orakill杀死线程,orakill是oracle提供的一个可执行命令,语法为:orakill sid thread 

    其中:

    sid:表示要杀死的进程属于的实例名 。可以用select name from v$database;查询

    thread:是要杀掉的线程号,即第2步查询出的spid。 

            例:c:>orakill system 9065

    注意:这里要注意的是kill OS进程是在服务端操作,而不是你程序所在客户机

    相关文章

      网友评论

          本文标题:[oracle][疑难问题]ORA-00031:标记要终止的会话

          本文链接:https://www.haomeiwen.com/subject/kxvynftx.html