Welcome 微信登录

首页 / 数据库 / MySQL / 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的导入导出一直正常运行究竟是什么原因导致的呢?我们拭目以待......更多Oracle相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12
  1. 1、故障环境  
  2. SQL> select * from v$version where rownum<2;  
  3.   
  4. BANNER  
  5. ----------------------------------------------------------------   
  6. Oracle Database 10g Release 10.2.0.4.0 - 64bit Production  
  7.   
  8. 2、异常方式与异常现象  
  9.     当前package的使用情况是使用schema为goex_admin执行时正常,而使用goex_webuser执行时收到错误提示。  
  10.     即使用不同的用户来执行时存储过程异常.而在此之前类似的问题并不存在,即无论用哪个schema来实现datapump都成功执行。  
  11.     被调用的存储过程为:goex_admin.FNO_SYS_DATAPUMP_PKG.export_dump    
  12.   
  13. -->下面是调用时出现的异常现象   
  14. SQL> DECLARE   
  15.   2    dump_name_in VARCHAR2(32767);  
  16.   3    overwrite_existing_in CHAR(1);  
  17.   4    handle_out NUMBER;  
  18.   5    err_num NUMBER;  
  19.   6    err_msg VARCHAR2(32767);  
  20.   7    
  21.   8  BEGIN   
  22.   9    dump_name_in := "TEST_EXP";  
  23.  10    overwrite_existing_in := "N";  
  24.  11    handle_out := NULL;  
  25.  12    err_num := NULL;  
  26.  13    err_msg := NULL;  
  27.  14    
  28.  15    FNO_SYS_DATAPUMP_PKG.export_dump ( dump_name_in, overwrite_existing_in, handle_out, err_num, err_msg );  
  29.  16    DBMS_OUTPUT.Put_Line("HANDLE_OUT = " || TO_CHAR(handle_out));  
  30.  17    DBMS_OUTPUT.Put_Line("ERR_NUM = " || TO_CHAR(err_num));  
  31.  18    DBMS_OUTPUT.Put_Line("ERR_MSG = " || err_msg);  
  32.  19    
  33.  20    DBMS_OUTPUT.Put_Line("");  
  34.  21    COMMIT;   
  35.  22  END;   
  36.  23  /  
  37. DECLARE  
  38. *  
  39. ERROR at line 1:  
  40. ORA-20001: FNO_SYS_DATAPUMP_PKG.export_dump debugpos=210 (dumpname = TEST_EXP, -->这段信息给出了代码中错误所在的位置为210   
  41. handle = null)  
  42. ORA-06512: at "GOEX_ADMIN.FNO_SYS_DATAPUMP_PKG", line 738  
  43. ORA-06512: at line 15  
  44.   
  45. 3、分析异常  
  46. -->初步判断有可能是存在权限问题,但以前适用goex_webuser也一直正常,我们来看看代码中的210处位置   
  47. BEGIN  
  48.    -- Drop table  "Go_Data_Dumping_Job "   
  49.    debugpos    := 200;  
  50.    drop_db_table( tbl_in => c_db_dump_job_name );    -->此为同一package的过程用于删除已经存在的job   
  51.    debugpos    := 210;  
  52.    -- Create Datapump Job   
  53.    hand        :=                                    -->从210位置来判断,应该是job没有被open,然后就跳到exception的others部分   
  54.       DBMS_DATAPUMP.open( operation   => "EXPORT"    -->由于给出的error 信息不够详细很难以发现到底问题出在哪里   
  55.                         , job_mode    => "SCHEMA"  
  56.                         , job_name    => c_db_dump_job_name  
  57.                         , version     => "LATEST" );  
  58. EXCEPTION  
  59.    WHEN DBMS_DATAPUMP.job_exists THEN  
  60.       debugpos    := 220;  
  61.   
  62.       EXECUTE IMMEDIATE   "drop table "  
  63.                        || c_db_dump_job_name;  
  64.   
  65.       debugpos    := 230;  
  66.       hand        :=  
  67.          DBMS_DATAPUMP.open( operation   => "EXPORT"  
  68.                            , job_mode    => "SCHEMA"  
  69.                            , job_name    => c_db_dump_job_name  
  70.                            , version     => "LATEST" );  
  71.    WHEN OTHERS THEN  
  72.       raise_application_error( -20001,    myspname              
  73.                                        || " debugpos="         
  74.                                        || TO_CHAR( debugpos )  
  75.                                        || " (dumpname = "  
  76.                                        || dump_name_in  
  77.                                        || ", handle = "  
  78.                                        || NVL( TO_CHAR( hand ), "null" )  
  79.                                        || ")" );  
  80. END;  
  81. -->修改EXCEPTION的WHEN OTHERS THEN部分,以便能抛出未知异常.使用下面的代码来替换(v_err_code,v_err_msg声明部分略)   
  82.    v_err_code  := SQLCODE;  
  83.    v_err_msg   := SUBSTR( SQLERRM, 1, 200 );  
  84.    DBMS_OUTPUT.put_line( "Error code: "|| v_err_code );  
  85.    DBMS_OUTPUT.put_line( "Error message: "|| v_err_msg );  
  86.        
  87. SQL> show user;  
  88. USER is "GOEX_WEBUSER"  
  89. SQL> alter package goex_admin.FNO_SYS_DATAPUMP_PKG compile;  
  90.   
  91. Package altered.  
  92.   
  93. SQL> alter package goex_admin.FNO_SYS_DATAPUMP_PKG compile body;  
  94.   
  95. Package body altered.  
  96.   
  97. -->再次执行则ORA-31623错误出现,为故障的解决提供了线索   
  98. SQL> DECLARE   
  99.   2    dump_name_in VARCHAR2(32767);  
  100.   3    overwrite_existing_in CHAR(1);  
  101.   4    handle_out NUMBER;  
  102.   5    err_num NUMBER;  
  103.   6    err_msg VARCHAR2(32767);  
  104.   7    
  105.   8  BEGIN   
  106.   9    dump_name_in := "X";  
  107.  10    overwrite_existing_in := "N";  
  108.  11    handle_out := NULL;  
  109.  12    err_num := NULL;  
  110.  13    err_msg := NULL;  
  111.  14    
  112.  15    goex_admin.FNO_SYS_DATAPUMP_PKG.export_dump ( dump_name_in, overwrite_existing_in, handle_out, err_num, err_msg );  
  113.  16    COMMIT;   
  114.  17  END;   
  115.  18  /  
  116. DECLARE  
  117. *  
  118. ERROR at line 1:  
  119. ORA-31623: a job is not attached to this session via the specified handle     
  120. ORA-06512: at "GOEX_ADMIN.FNO_SYS_DATAPUMP_PKG", line 709  
  121. ORA-06512: at line 15  
  122.   
  123. SQL> ho oerr ora 31623  
  124. 31623, 00000, "a job is not attached to this session via the specified handle"  
  125. // *Cause:  An attempt to reference a job using a handle which is invalid or  
  126. //          no longer valid for the current session.  
  127. // *ActionSelect a handle corresponding to a valid active job or start a  
  128. //          new job.  
  129.   
  130. -->分析上面的ORA描述job不能附加到指定的handle.其Action是选择一个有效的handle或启动一个新的job.   
  131. -->Google了一下该ORA,有个关于这个问题的描述是由于当前schema(goex_webuser)没有创建表的权限.   
  132. -->于是按下面的方式授予goex_webuser建表权限,当时并没有检查该权限是否授予,而是直接为其授予.   
  133. SQL> conn sys / as sysdba  
  134. Enter password:   
  135. Connected.  
  136. SQL> grant create any table to goex_webuser;  
  137.   
  138. Grant succeeded.  
  139.   
  140. SQL> conn goex_webuser/goex_webuser;  
  141. Error accessing PRODUCT_USER_PROFILE  
  142. Warning:  Product user profile information not loaded!  
  143. You may need to run PUPBLD.SQL as SYSTEM  
  144. Connected.  
  145. SQL> DECLARE   
  146.   2    dump_name_in VARCHAR2(32767);  
  147.   3    overwrite_existing_in CHAR(1);  
  148.   4    handle_out NUMBER;  
  149.   err_num NUMBER;  
  150.   5    6    err_msg VARCHAR2(32767);  
  151.   7    
  152.   8  BEGIN   
  153.   9    dump_name_in := "X";  
  154.  10    overwrite_existing_in := "N";  
  155.  11    handle_out := NULL;  
  156.  12    err_num := NULL;  
  157.  13    err_msg := NULL;  
  158.  14    
  159.  15    goex_admin.FNO_SYS_DATAPUMP_PKG.export_dump ( dump_name_in, overwrite_existing_in, handle_out, err_num, err_msg );  
  160.  16    COMMIT;   
  161.  17  END;   
  162.  18  /  
  163.   
  164. PL/SQL procedure successfully completed.   -->授予create any table权限之后存储过程成功执行了   
  165.   
  166. 4、故障再现  
  167. -->后续再次使用GOEX_WEBUSER执行时故障依旧   
  168. SQL> show user;  
  169. USER is "GOEX_WEBUSER"  
  170. SQL> DECLARE   
  171.   2    dump_name_in VARCHAR2(32767);  
  172.   3    overwrite_existing_in CHAR(1);  
  173.   4    handle_out NUMBER;  
  174.   5    err_num NUMBER;  
  175.   6    err_msg VARCHAR2(32767);  
  176.   7    
  177.   8  BEGIN   
  178.   9    dump_name_in := "N";  
  179.  10    overwrite_existing_in := "N";  
  180.  11    handle_out := NULL;  
  181.  12    err_num := NULL;  
  182.  13    err_msg := NULL;  
  183.  14    
  184.  15    goex_admin.FNO_SYS_DATAPUMP_PKG.export_dump ( dump_name_in, overwrite_existing_in, handle_out, err_num, err_msg );  
  185.  16    COMMIT;   
  186.  17  END;   
  187.  18  /  
  188. DECLARE  
  189. *  
  190. ERROR at line 1:  
  191. ORA-31623: a job is not attached to this session via the specified handle  
  192. ORA-06512: at "GOEX_ADMIN.FNO_SYS_DATAPUMP_PKG", line 709  
  193. ORA-06512: at line 15  
  194.   
  195. SQL> /  
  196. DECLARE  
  197. *  
  198. ERROR at line 1:  
  199. ORA-31623: a job is not attached to this session via the specified handle  
  200. ORA-06512: at "GOEX_ADMIN.FNO_SYS_DATAPUMP_PKG", line 709  
  201. ORA-06512: at line 15  
  202.   
  203. SQL> /  
  204. DECLARE  
  205. *  
  206. ERROR at line 1:  
  207. ORA-31623: a job is not attached to this session via the specified handle  
  208. ORA-06512: at "GOEX_ADMIN.FNO_SYS_DATAPUMP_PKG", line 709  
  209. ORA-06512: at line 15  
  210.   
  211. 5、进一步分析  
  212. -->检查alert log file发现下列提示信息,且不论是使用GOEX_WEBUSER还是使用GOEX_ADMIN都出现该提示   
  213. kupprdp: master process DM00 started with pid=28, OS id=6858  
  214.          to execute - SYS.KUPM$MCP.MAIN("Go_Data_Dumping_Job""GOEX_WEBUSER",   
  215.              "KUPC$C_1_20120321131105""KUPC$S_1_20120321131105", 0);  
  216. kupprdp: worker process DW01 started with worker id=1, pid=29, OS id=6862  
  217.          to execute - SYS.KUPW$WORKER.MAIN("Go_Data_Dumping_Job""GOEX_WEBUSER");  
  218. Wed Mar 21 13:13:00 2012  
  219. The value (30) of MAXTRANS parameter ignored.  
  220. Wed Mar 21 13:13:10 2012  
  221. The value (30) of MAXTRANS parameter ignored. -->这个提示每执行一次就提示一次,对应上面执行语句时使用 “/”来再次执行PL/SQL   
  222. The value (30) of MAXTRANS parameter ignored.  
  223. The value (30) of MAXTRANS parameter ignored.  
  224.   
  225. Wed Mar 21 14:13:46 2012  
  226. The value (30) of MAXTRANS parameter ignored.  
  227. kupprdp: master process DM00 started with pid=30, OS id=12040  
  228.          to execute - SYS.KUPM$MCP.MAIN("Go_Data_Dumping_Job""GOEX_ADMIN""KUPC$C_1_20120321141346",  
  229.               "KUPC$S_1_20120321141346", 0);  
  230. kupprdp: worker process DW01 started with worker id=1, pid=31, OS id=12042  
  231.          to execute - SYS.KUPW$WORKER.MAIN("Go_Data_Dumping_Job""GOEX_ADMIN");  
  232.   
  233. -->关于从alert log file得到的错误信息,Metalink给出了BUG号为:6347775   
  234. -->此提示???息是由于在创建备份主表时使用了如下语句:   
  235. -->CREATE TABLE <table_name> (<columns_list>) INITRANS 10 MAXTRANS 30   
  236. -->由于Maxtrans参数在10gR1时已经废弃,所以在告警日志中出现提示,不影响数据的导入导出,仅仅是增大告警日志文件的大小   
  237. -->由此可知告警日志获得的信息无助于当前故障的解决   
  238. -->Metalink上[ID 308388.1]描述ORA-31623为由于流池和Java池导致该故障发生,然使用GOEX_ADMIN导出正常,因此排除这个原因.   
  239.                     
  240. 6、彻底解决  
  241. -->使用sys登陆到数据库,查看视图DBA_DATAPUMP_JOBS    
  242.   
  243. DBA_DATAPUMP_JOBS:  
  244.   Identifies all active Data Pump jobs in the database, regardless of their state, on an instance (or on all instances  
  245. for Real Application Clusters). It also show all Data Pump master tables not currently associated with an active job.  
  246.   
  247. -->视图DBA_DATAPUMP_JOBS给出了当前活动JOB相关的一些信息   
  248.   
  249. SQL> conn / as sysdba  
  250. Connected.  
  251.   
  252. -->下面的查询发现有一个名为Go_Data_Dumping_Job的job_name且其owner为GOEX_WEBUSER   
  253. -->实际上该job_name对应于一个以job_name命名的临时表名   
  254. SQL> select owner_name, job_name from dba_datapump_jobs;  
  255.   
  256. OWNER_NAME                     JOB_NAME  
  257. ------------------------------ ------------------------------   
  258. GOEX_WEBUSER                   Go_Data_Dumping_Job  
  259.   
  260. SQL> drop table GOEX_WEBUSER.Go_Data_Dumping_Job purge;  
  261. drop table GOEX_WEBUSER.Go_Data_Dumping_Job purge  
  262.                         *  
  263. ERROR at line 1:  
  264. ORA-00942: table or view does not exist  
  265.   
  266. SQL> drop table GOEX_WEBUSER."Go_Data_Dumping_Job" purge;   -->删除该临时表名   
  267.   
  268. Table dropped.  
  269.   
  270. SQL> conn goex_webuser/goex_webuser;  
  271. Error accessing PRODUCT_USER_PROFILE  
  272. Warning:  Product user profile information not loaded!  
  273. You may need to run PUPBLD.SQL as SYSTEM  
  274. Connected.  
  275. SQL> DECLARE                                   -->再次调用datapump存储过程被成功执行   
  276.   2    dump_name_in VARCHAR2(32767);  
  277.   3    overwrite_existing_in CHAR(1);  
  278.   handle_out NUMBER;  
  279.   4    5    err_num NUMBER;  
  280.   6    err_msg VARCHAR2(32767);  
  281.   7    
  282.   8  BEGIN   
  283.   9    dump_name_in := NULL;  
  284.  10    overwrite_existing_in := "N";  
  285.  11    handle_out := NULL;  
  286.  12    err_num := NULL;  
  287.  13    err_msg := NULL;  
  288.  14    
  289.  15    goex_admin.FNO_SYS_DATAPUMP_PKG.export_dump ( dump_name_in, overwrite_existing_in, handle_out, err_num, err_msg );  
  290.  16    COMMIT;   
  291.  17  END;   
  292.  18  /  
  293.   
  294. PL/SQL procedure successfully completed.  
  295.   
  296. -->Author:Robinson Cheng   
  297. -->Blog: http://blog.csdn.net/robinson_0612   
  298.   
  299. 6、修正代码段  
  300.      -->为原来的procedure添加如下代码段以生成schema的名字,以避免在删除由于job产生的表名时错误(v_schema应先声明)   
  301.      SELECT SYS_CONTEXT( "USERENV""CURRENT_USER" ) INTO v_schema FROM dual;  
  302.      -->原来的schema能够导出自身的所有对象,且能够删除导出故障时生成的临时表,因此没有报错   
  303.    WHEN DBMS_DATAPUMP.job_exists THEN  
  304.             debugpos    := 220;  
  305.             EXECUTE IMMEDIATE   "drop table "  
  306.                              || v_schema  
  307.                              || "."  
  308.                              || c_db_dump_job_name;       
  309.    -->同理procedure drop_db_table也应当添加一个schema参数传入,此处不再演示   
  310.      
  311. 7、总结  
  312. a、在使用Oracle Datapump API时应注意如果定义了job_name则任意导致job失败或挂起的情形都将导致以job_name命名的table存在.  
  313. b、对于当前失败的job,再次执行时会碰到job(ORA-31634)已经存在的提示,此时应删除对应表名再使用原来的job_name再次实现Datapump.  
  314. c、对于出现的故障一般的建议是不要使用自定义的Job_name,由Oracle自动生成Job_name以自动销毁异常的job.  
  315. d、本文的例子得到的是ORA-31623错误而不是ORA-31634,貌似与ORA-31634 毫不相干,但删除job_name后一切正常.  
  316. e、在PL/SQL代码中,应尽可能的使用SQLCODE,SQLERRM来抛出不可预知的故障.  
Oracle SQL tuning 步骤ORA-01618: redo thread 2 is not enabled - cannot mount 错误相关资讯      Oracel数据库入门教程 
  • ORA-01618: redo thread 2 is not   (04/03/2012 15:11:44)
本文评论 查看全部评论 (0)
表情: 姓名: 字数 <