ORA-31623: a job is not attached to this session via the specified handle

    在使用Oracel Datapump API时碰到ORA-31623(a job is not attached to this session via the specified handle)错误,从故障描述来
看提示 job并没有成功附加到当前session指定的handle。该package的导入导出一直正常运行究竟是什么原因导致的呢?我们拭目以待......

1、故障环境
SQL> select * from v$version where rownum<2;

BANNER
----------------------------------------------------------------
Oracle Database 10g Release 10.2.0.4.0 - 64bit Production

2、异常方式与异常现象
	当前package的使用情况是使用schema为goex_admin执行时正常,而使用goex_webuser执行时收到错误提示。
	即使用不同的用户来执行时存储过程异常.而在此之前类似的问题并不存在,即无论用哪个schema来实现datapump都成功执行。
	被调用的存储过程为:goex_admin.FNO_SYS_DATAPUMP_PKG.export_dump  

-->下面是调用时出现的异常现象
SQL> DECLARE
  2    dump_name_in VARCHAR2(32767);
  3    overwrite_existing_in CHAR(1);
  4    handle_out NUMBER;
  5    err_num NUMBER;
  6    err_msg VARCHAR2(32767);
  7
  8  BEGIN
  9    dump_name_in := 'TEST_EXP';
 10    overwrite_existing_in := 'N';
 11    handle_out := NULL;
 12    err_num := NULL;
 13    err_msg := NULL;
 14
 15    FNO_SYS_DATAPUMP_PKG.export_dump ( dump_name_in, overwrite_existing_in, handle_out, err_num, err_msg );
 16    DBMS_OUTPUT.Put_Line('HANDLE_OUT = ' || TO_CHAR(handle_out));
 17    DBMS_OUTPUT.Put_Line('ERR_NUM = ' || TO_CHAR(err_num));
 18    DBMS_OUTPUT.Put_Line('ERR_MSG = ' || err_msg);
 19
 20    DBMS_OUTPUT.Put_Line('');
 21    COMMIT;
 22  END;
 23  /
DECLARE
*
ERROR at line 1:
ORA-20001: FNO_SYS_DATAPUMP_PKG.export_dump debugpos=210 (dumpname = TEST_EXP, -->这段信息给出了代码中错误所在的位置为210
handle = null)
ORA-06512: at "GOEX_ADMIN.FNO_SYS_DATAPUMP_PKG", line 738
ORA-06512: at line 15

3、分析异常
-->初步判断有可能是存在权限问题,但以前适用goex_webuser也一直正常,我们来看看代码中的210处位置
BEGIN
   -- Drop table  'Go_Data_Dumping_Job '
   debugpos    := 200;
   drop_db_table( tbl_in => c_db_dump_job_name );    -->此为同一package的过程用于删除已经存在的job
   debugpos    := 210;
   -- Create Datapump Job
   hand        :=                                    -->从210位置来判断,应该是job没有被open,然后就跳到exception的others部分
      DBMS_DATAPUMP.open( operation   => 'EXPORT'    -->由于给出的error 信息不够详细很难以发现到底问题出在哪里
                        , job_mode    => 'SCHEMA'
                        , job_name    => c_db_dump_job_name
                        , version     => 'LATEST' );
EXCEPTION
   WHEN DBMS_DATAPUMP.job_exists THEN
      debugpos    := 220;

      EXECUTE IMMEDIATE   'drop table '
                       || c_db_dump_job_name;

      debugpos    := 230;
      hand        :=
         DBMS_DATAPUMP.open( operation   => 'EXPORT'
                           , job_mode    => 'SCHEMA'
                           , job_name    => c_db_dump_job_name
                           , version     => 'LATEST' );
   WHEN OTHERS THEN
      raise_application_error( -20001,    myspname
                                       || ' debugpos='
                                       || TO_CHAR( debugpos )
                                       || ' (dumpname = '
                                       || dump_name_in
                                       || ', handle = '
                                       || NVL( TO_CHAR( hand ), 'null' )
                                       || ')' );
END;
-->修改EXCEPTION的WHEN OTHERS THEN部分,以便能抛出未知异常.使用下面的代码来替换(v_err_code,v_err_msg声明部分略)
   v_err_code  := SQLCODE;
   v_err_msg   := SUBSTR( SQLERRM, 1, 200 );
   DBMS_OUTPUT.put_line( 'Error code: '|| v_err_code );
   DBMS_OUTPUT.put_line( 'Error message: '|| v_err_msg );

SQL> show user;
USER is "GOEX_WEBUSER"
SQL> alter package goex_admin.FNO_SYS_DATAPUMP_PKG compile;

Package altered.

SQL> alter package goex_admin.FNO_SYS_DATAPUMP_PKG compile body;

Package body altered.

-->再次执行则ORA-31623错误出现,为故障的解决提供了线索
SQL> DECLARE
  2    dump_name_in VARCHAR2(32767);
  3    overwrite_existing_in CHAR(1);
  4    handle_out NUMBER;
  5    err_num NUMBER;
  6    err_msg VARCHAR2(32767);
  7
  8  BEGIN
  9    dump_name_in := 'X';
 10    overwrite_existing_in := 'N';
 11    handle_out := NULL;
 12    err_num := NULL;
 13    err_msg := NULL;
 14
 15    goex_admin.FNO_SYS_DATAPUMP_PKG.export_dump ( dump_name_in, overwrite_existing_in, handle_out, err_num, err_msg );
 16    COMMIT;
 17  END;
 18  /
DECLARE
*
ERROR at line 1:
ORA-31623: a job is not attached to this session via the specified handle
ORA-06512: at "GOEX_ADMIN.FNO_SYS_DATAPUMP_PKG", line 709
ORA-06512: at line 15

SQL> ho oerr ora 31623
31623, 00000, "a job is not attached to this session via the specified handle"
// *Cause:  An attempt to reference a job using a handle which is invalid or
//          no longer valid for the current session.
// *Action: Select a handle corresponding to a valid active job or start a
//          new job.

-->分析上面的ORA描述job不能附加到指定的handle.其Action是选择一个有效的handle或启动一个新的job.
-->Google了一下该ORA,有个关于这个问题的描述是由于当前schema(goex_webuser)没有创建表的权限.
-->于是按下面的方式授予goex_webuser建表权限,当时并没有检查该权限是否授予,而是直接为其授予.
SQL> conn sys / as sysdba
Enter password:
Connected.
SQL> grant create any table to goex_webuser;

Grant succeeded.

SQL> conn goex_webuser/goex_webuser;
Error accessing PRODUCT_USER_PROFILE
Warning:  Product user profile information not loaded!
You may need to run PUPBLD.SQL as SYSTEM
Connected.
SQL> DECLARE
  2    dump_name_in VARCHAR2(32767);
  3    overwrite_existing_in CHAR(1);
  4    handle_out NUMBER;
  err_num NUMBER;
  5    6    err_msg VARCHAR2(32767);
  7
  8  BEGIN
  9    dump_name_in := 'X';
 10    overwrite_existing_in := 'N';
 11    handle_out := NULL;
 12    err_num := NULL;
 13    err_msg := NULL;
 14
 15    goex_admin.FNO_SYS_DATAPUMP_PKG.export_dump ( dump_name_in, overwrite_existing_in, handle_out, err_num, err_msg );
 16    COMMIT;
 17  END;
 18  /

PL/SQL procedure successfully completed.   -->授予create any table权限之后存储过程成功执行了

4、故障再现
-->后续再次使用GOEX_WEBUSER执行时故障依旧
SQL> show user;
USER is "GOEX_WEBUSER"
SQL> DECLARE
  2    dump_name_in VARCHAR2(32767);
  3    overwrite_existing_in CHAR(1);
  4    handle_out NUMBER;
  5    err_num NUMBER;
  6    err_msg VARCHAR2(32767);
  7
  8  BEGIN
  9    dump_name_in := 'N';
 10    overwrite_existing_in := 'N';
 11    handle_out := NULL;
 12    err_num := NULL;
 13    err_msg := NULL;
 14
 15    goex_admin.FNO_SYS_DATAPUMP_PKG.export_dump ( dump_name_in, overwrite_existing_in, handle_out, err_num, err_msg );
 16    COMMIT;
 17  END;
 18  /
DECLARE
*
ERROR at line 1:
ORA-31623: a job is not attached to this session via the specified handle
ORA-06512: at "GOEX_ADMIN.FNO_SYS_DATAPUMP_PKG", line 709
ORA-06512: at line 15

SQL> /
DECLARE
*
ERROR at line 1:
ORA-31623: a job is not attached to this session via the specified handle
ORA-06512: at "GOEX_ADMIN.FNO_SYS_DATAPUMP_PKG", line 709
ORA-06512: at line 15

SQL> /
DECLARE
*
ERROR at line 1:
ORA-31623: a job is not attached to this session via the specified handle
ORA-06512: at "GOEX_ADMIN.FNO_SYS_DATAPUMP_PKG", line 709
ORA-06512: at line 15

5、进一步分析
-->检查alert log file发现下列提示信息,且不论是使用GOEX_WEBUSER还是使用GOEX_ADMIN都出现该提示
kupprdp: master process DM00 started with pid=28, OS id=6858
         to execute - SYS.KUPM$MCP.MAIN('Go_Data_Dumping_Job', 'GOEX_WEBUSER',
             'KUPC$C_1_20120321131105', 'KUPC$S_1_20120321131105', 0);
kupprdp: worker process DW01 started with worker id=1, pid=29, OS id=6862
         to execute - SYS.KUPW$WORKER.MAIN('Go_Data_Dumping_Job', 'GOEX_WEBUSER');
Wed Mar 21 13:13:00 2012
The value (30) of MAXTRANS parameter ignored.
Wed Mar 21 13:13:10 2012
The value (30) of MAXTRANS parameter ignored. -->这个提示每执行一次就提示一次,对应上面执行语句时使用 “/”来再次执行PL/SQL
The value (30) of MAXTRANS parameter ignored.
The value (30) of MAXTRANS parameter ignored.

Wed Mar 21 14:13:46 2012
The value (30) of MAXTRANS parameter ignored.
kupprdp: master process DM00 started with pid=30, OS id=12040
         to execute - SYS.KUPM$MCP.MAIN('Go_Data_Dumping_Job', 'GOEX_ADMIN', 'KUPC$C_1_20120321141346',
              'KUPC$S_1_20120321141346', 0);
kupprdp: worker process DW01 started with worker id=1, pid=31, OS id=12042
         to execute - SYS.KUPW$WORKER.MAIN('Go_Data_Dumping_Job', 'GOEX_ADMIN');

-->关于从alert log file得到的错误信息,Metalink给出了BUG号为:6347775
-->此提示信息是由于在创建备份主表时使用了如下语句:
-->CREATE TABLE <table_name> (<columns_list>) INITRANS 10 MAXTRANS 30
-->由于Maxtrans参数在10gR1时已经废弃,所以在告警日志中出现提示,不影响数据的导入导出,仅仅是增大告警日志文件的大小
-->由此可知告警日志获得的信息无助于当前故障的解决
-->Metalink上[ID 308388.1]描述ORA-31623为由于流池和Java池导致该故障发生,然使用GOEX_ADMIN导出正常,因此排除这个原因.

6、彻底解决
-->使用sys登陆到数据库,查看视图DBA_DATAPUMP_JOBS 

DBA_DATAPUMP_JOBS:
  Identifies all active Data Pump jobs in the database, regardless of their state, on an instance (or on all instances
for Real Application Clusters). It also show all Data Pump master tables not currently associated with an active job.

-->视图DBA_DATAPUMP_JOBS给出了当前活动JOB相关的一些信息

SQL> conn / as sysdba
Connected.

-->下面的查询发现有一个名为Go_Data_Dumping_Job的job_name且其owner为GOEX_WEBUSER
-->实际上该job_name对应于一个以job_name命名的临时表名
SQL> select owner_name, job_name from dba_datapump_jobs;

OWNER_NAME                     JOB_NAME
------------------------------ ------------------------------
GOEX_WEBUSER                   Go_Data_Dumping_Job

SQL> drop table GOEX_WEBUSER.Go_Data_Dumping_Job purge;
drop table GOEX_WEBUSER.Go_Data_Dumping_Job purge
                        *
ERROR at line 1:
ORA-00942: table or view does not exist

SQL> drop table GOEX_WEBUSER."Go_Data_Dumping_Job" purge;   -->删除该临时表名

Table dropped.

SQL> conn goex_webuser/goex_webuser;
Error accessing PRODUCT_USER_PROFILE
Warning:  Product user profile information not loaded!
You may need to run PUPBLD.SQL as SYSTEM
Connected.
SQL> DECLARE                                   -->再次调用datapump存储过程被成功执行
  2    dump_name_in VARCHAR2(32767);
  3    overwrite_existing_in CHAR(1);
  handle_out NUMBER;
  4    5    err_num NUMBER;
  6    err_msg VARCHAR2(32767);
  7
  8  BEGIN
  9    dump_name_in := NULL;
 10    overwrite_existing_in := 'N';
 11    handle_out := NULL;
 12    err_num := NULL;
 13    err_msg := NULL;
 14
 15    goex_admin.FNO_SYS_DATAPUMP_PKG.export_dump ( dump_name_in, overwrite_existing_in, handle_out, err_num, err_msg );
 16    COMMIT;
 17  END;
 18  /

PL/SQL procedure successfully completed.

-->Author:Robinson Cheng
-->Blog: http://blog.csdn.net/robinson_0612

6、修正代码段
	 -->为原来的procedure添加如下代码段以生成schema的名字,以避免在删除由于job产生的表名时错误(v_schema应先声明)
	 SELECT SYS_CONTEXT( 'USERENV', 'CURRENT_USER' ) INTO v_schema FROM dual;
	 -->原来的schema能够导出自身的所有对象,且能够删除导出故障时生成的临时表,因此没有报错
   WHEN DBMS_DATAPUMP.job_exists THEN
            debugpos    := 220;
            EXECUTE IMMEDIATE   'drop table '
                             || v_schema
                             || '.'
                             || c_db_dump_job_name;
   -->同理procedure drop_db_table也应当添加一个schema参数传入,此处不再演示

7、总结
a、在使用Oracle Datapump API时应注意如果定义了job_name则任意导致job失败或挂起的情形都将导致以job_name命名的table存在.
b、对于当前失败的job,再次执行时会碰到job(ORA-31634)已经存在的提示,此时应删除对应表名再使用原来的job_name再次实现Datapump.
c、对于出现的故障一般的建议是不要使用自定义的Job_name,由Oracle自动生成Job_name以自动销毁异常的job.
d、本文的例子得到的是ORA-31623错误而不是ORA-31634,貌似与ORA-31634 毫不相干,但删除job_name后一切正常.
e、在PL/SQL代码中,应尽可能的使用SQLCODE,SQLERRM来抛出不可预知的故障.

更多参考:

数据泵 EXPDP 导出工具的使用

数据泵 IMPDP 导入工具的使用

expdp impdp中 exclude/include 的使用

使用 Oracle Datapump API 实现数据导出

dbms_xplan之display_cursor函数的使用

dbms_xplan之display函数的使用

执行计划中各字段各模块描述

使用 EXPLAIN PLAN 获取SQL语句执行计划

启用 AUTOTRACE 功能

函数使得索引列失效

Oracle 绑定变量窥探

PL/SQL 联合数组与嵌套表

 

时间: 2024-10-23 23:53:26

ORA-31623: a job is not attached to this session via the specified handle的相关文章

ORA—00904:“某个参数或者变量名”:标识符无效

点击打开链接

PHP:IE下的iframe跨域导致session丢失问题解决方法

今天搞的一个登录页面,被别的网站用iframe嵌进去后,死活无法登录(只在IE中存在这种情况). 很明显,session无法被保存.但是直接在地址栏打开那个登录页面,一切都正常啊.真是奇怪啊. 在网上搜索了一下.发现这个问题还真有不少人提及到.最后的解决方法是在那个登录页面里加上以下代码: 代码如下: <span style="font-family:Microsoft YaHei; font-size:14px">header('P3P: CP="ALL ADM

艾伟_转载:你知道吗?——ASP.NET的Session会导致的性能问题

你的站点有被客户投诉很慢吗?是不是查了很多遍还是没有完全解决?是不是数据库没有发现异常,CPU也没有异常,内存占用量没有异常,GC计数没有异常,硬盘IO也没有异常,带宽没有异常,线路没有异常,没有丢包,但就是被投诉?而且还是阵发性的,有某个用户投诉慢的时候,你访问却很快,本地又复现不出来?今天你访问了博客园真是太幸运了,也许这里就有你想要的一个答案--假如你的站点动态处理了图片或者其他原本不会动态处理的非网页资源的话.没想到吧,这是Session惹的祸! 我们公司某个站点访问量一直很大,几年前就

12c expdp ORA-31623 -又遇到BUG

一.环境描述 12.1.0.2 RAC 二.详细过程 昨天做了一个12c RAC环境的expdp备份操作,结果出现报错,查看了官网竟然是BUG. 1.报错信息 UDE-31623: operation generated ORACLE error 31623 ORA-31623: a job is not attached to this session via the specified handle ORA-06512: at "SYS.DBMS_DATAPUMP", line 3

Oracle RAC:HA简介

RAC的HA是它的一大卖点,Oracle也常那它来宣传,但实际上,RAC称不上真正的HA,因为 它是share-disk的架构,只能做到实例级的HA.RAC实例级HA的技术基础是Failover,它是指 集群中任何一个节点的故障都不会影响用户的正常使用,之前连接在故障节点上的用户会被 自动转移到健康节点,这样的切换对用户来说是透明的. RAC的Failover可以细分为 以下3种: 1)Client-Side Connect Time Failover 2)TAF (Transparent Ap

Oracle的网络三大配置文件(sqlnet.ora、tnsnames.ora、listener.ora)

Oracle的网络三大配置文件(sqlnet.ora.tnsnames.ora.listener.ora)   blog文档结构图: 1  说明 为了使得外部进程能够访问Oracle 数据库则必须配置Oracle 网络服务器环境配置, Oracle 网络服务器环境是通过配置listener.ora .sqlnet.ora 和 tnsnames.ora 共三个文件来进行的.由于oracle数据库是一个客户端服务器的软件,所以,首先需要接收来自客户端的连接请求,服务器就必须配置监听器:其次,客户端要

问题集锦:Servlets/JSP开发技术问答

js|servlet|问题 为什么GenericServlet在init(ServletConfig config)基础上增加了一个init()方法? init()方法被GenericServlet.init(ServletConfig config)方法调用. init()方法方便了开发人员定制Servlet的初始化,而无须去维护ServletConfig对象的存储工作. 重写GenericServlet.init(ServletConfig config)必须要显示的调用super.init

ASP功能:让用户一访问就转向指定界面

访问     一个网站有许多页面,如果用户知道某个页面的链接,可以在浏览器中直接输入URL访问它.但这在一个要求有安全性的站点上是不允许的.我们要求用户必须登录以后才能访问各级页面,有时也确实希望用户总是先看到站点的主页.这两种要求可以通过在ASP的GLOBAL.ASA中对SESSION对象编程来实现. 1.用户必须从主页开始浏览 如果仅希望用户每次上站都先访问站点主页,可以在Session的SESSION_ONSTART事件中加入RESPONSE.REDIRECT "URL"来实现.

技巧:最大限度优化你的Asp程序的性能

程序|技巧|性能|优化 ASP 能快速执行你的动态网页,但你还可以通过紧缩代码和数据库连接以使它们执行更快.这是一篇关于怎样精简代码和Asp 特征以获得最快执行速度的详细文章.对于一个急燥的用户来说,任何在按下用户按钮到结果出现在它们的屏幕之间的延迟可能意味着它们会转到浏览其它的站点?假如你的是商业站点,这有可能意味着失去潜在的销售. 我们没有任何办法控制用户的带宽,但我们的确能通过优化Asp 站点来获得最佳的性能.大部分潜在性能的提升是通过系统改变而不是紧缩代码,一个不合适的想法是,一旦遇到系