ORA-31623 When Submitting a Datapump Job [ID 308388.1]

ORA-31623 When Submitting a Datapump Job [ID 308388.1]


 

Modified 24-SEP-2010     Type PROBLEM     Status PUBLISHED

 

In this Document
  Symptoms
  Cause
  Solution
  References


Applies to:

Oracle Server - Enterprise Edition - Version: 10.1.0.2 to 10.2.0.3 - Release: 10.1 to 10.2
Information in this document applies to any platform.

Symptoms

When we are trying to take an export using datapump utility we are getting the following errors:

UDE-00008: 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 2315
ORA-06512: at "SYS.DBMS_DATAPUMP", line 3185
ORA-06512: at line 1

Cause

For submitting an export job with datapump utility, we use queues, streams and java objects.
SQL tracing confirms that.

If we see any component is not valid in the database, we will see these errors.
By querying dba_registry we find the different component and their status.

SELECT comp_name, status, version
FROM dba_registry;

Solution

We can validate different components in the database by running $ORACLE_HOME/rdbms/admin/catpatch.sql via SQL*Plus:

spool catpatch.log
connect / as sysdba
shutdown immediate
startup migrate
SELECT comp_name, version, status
FROM dba_registry;
spool off

If you are on 10g Release 2, then perform:

connect / as sysdba
spool dictreload.log
startup restrict
alter system set shared_pool_size = 512M scope=spfile;
alter system set java_pool_size = 150M scope=spfile;
alter system set aq_tm_processes = 1 scope=spfile;
alter system set cluster_database = false scope=spfile; -- If on RAC
shutdown immediate
startup upgrade
spool off
alter system set cluster_database = true scope=spfile; -- If on RAC
shutdown immediate
startup

References

NOTE:330138.1 - catpatch.sql Has Been Renamed to c1002000.sql For 10gR2 Database

 

 

 

------------------------------------------------------------------------------

QQ:492913789

Email:ahdba@qq.com

Blog: http://www.cndba.cn/dave 


网上资源: http://tianlesoftware.download.csdn.net

相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx

DBA1 群:62697716(); DBA2 群:62697977()

DBA3 群:62697850   DBA 超级群:63306533;    

聊天 群:40132017

--加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请

<think>我们正在解决Oracle数据泵导出时出现的UDE-31623ORA-31623错误。根据用户提供的引用(特别是文档ID1907256.1),这个错误的具体描述是:“a jobis notattached tothis sessionvia thespecified handle”(作业没有通过指定的句柄附加到当前会话)。这通常发生在尝试控制(如停止、重启或监控)一个数据泵作业时,但当前会话并没有附加到这个作业。错误原因分析:1.会话未附加作业:可能因为之前的会话已经断开,而作业在后台继续运行,此时在新的会话中尝试重新附加该作业就会失败。2.作业句柄无效:在数据泵操作中,作业句柄(handle)是唯一标识作业的。如果句柄不正确或已失效,就会导致此错误。3.作业已完成或失败:如果作业已经完成(成功或失败)而用户仍尝试附加,也会出现此错误。 解决方案: 根据Oracle官方文档(文档ID1907256.1)[^1][^2],我们可以采取以下步骤:步骤1:检查数据泵作业的状态使用以下SQL查询当前数据库中的数据泵作业状态:```sqlSELECTowner_name, job_name,operation,job_mode, stateFROM dba_datapump_jobs; ```或者(如果没有DBA权限): ```sqlSELECT *FROM user_datapump_jobs; ```步骤2:根据作业状态采取相应措施-如果作业状态(STATE)为`NOTRUNNING`、`FAILED`或`COMPLETED`,则说明作业已经结束,无法重新附加。此时,如果需要重新运行,应该使用新的作业名重新启动导出。-如果作业状态为`EXECUTING`,说明作业正在运行,但当前会话无法附加。这时,我们可以尝试重新附加到作业(见步骤3)。 步骤3:重新附加到运行中的作业(如果作业仍在运行) 在数据泵导出命令中,使用`attach`参数附加到现有作业:```bashexpdp username/passwordATTACH=<job_name> ```其中`<job_name>`是步骤1中查询到的作业名。 步骤4:如果附加成功,则可以在交互模式下控制作业(如停止、重启等)。如果附加失败(例如作业名错误或作业已不存在),则考虑终止该作业并重新启动。 步骤5:终止无法附加的作业(如果作业已挂起且无法附加) 如果作业确实存在但无法附加,且需要停止它,可以使用以下PL/SQL命令(以SYS或拥有权限的用户执行):```sqlDECLAREhdlNUMBER;BEGINhdl :=DBMS_DATAPUMP.ATTACH('<job_name>', '<owner_name>'); --作业名和所有者(从步骤1中获取)DBMS_DATAPUMP.STOP_JOB(hdl,1,0); --立即停止作业END; /``` 注意:如果作业所有者不是当前用户,需要指定所有者。步骤6:重新启动导出作业在清理了无效作业后,使用新的作业名重新启动导出: ```bashexpdpusername/password DIRECTORY=dpump_dirDUMPFILE=export.dmp LOGFILE=export.logJOB_NAME=new_job_name ...``` 预防措施:1.在脚本中使用数据泵时,确保作业名唯一(例如包含时间戳)。 2.在会话中断(如网络断开)后,先检查作业状态再尝试重新附加。3.定期清理已完成的数据泵作业。注意事项: -如果作业已经完成(成功或失败),则不需要终止,直接重新运行即可。-如果作业状态为`DEFINING`,表示作业正在创建,可以稍等片刻再尝试附加。如果上述步骤无法解决问题,可能需要检查数据泵的日志文件(通常位于DIRECTORY参数指定的目录中)以获取更多信息。 相关问题: 1.如何查看Oracle数据泵作业的详细日志?2.如何永久删除Oracle数据泵作业? 3.Oracle数据泵中,如何从网络故障中恢复导出作业?</think>### 解决 Oracle 数据泵导出错误 UDE-31623 ORA-31623 "job not attached to session handle" 根据您提供的引用文档 ID 1907256.1[^1][^2],这个错误的核心是数据泵作业未能正确附加到当前会话句柄。以下是针对此错误的完整解决方案: #### 错误原因分析 ```mermaid graph TD A[UDE-31623/ORA-31623] --> B[会话句柄丢失] B --> C1[网络中断] B --> C2[会话超时] B --> C3[客户端异常退出] B --> C4[并行操作冲突] B --> C5[作业名重复] A --> D[作业状态不一致] D --> E1[作业仍在运行] D --> E2[作业已停止但未清除] ``` 主要触发场景: 1. **会话中断**:导出过程中网络断开或客户端异常关闭 2. **作业状态残留**:作业仍在数据库后台运行,但会话句柄丢失[^1] 3. **句柄冲突**:多个会话尝试附加同名作业(常见于脚本重复执行) 4. **权限问题**:用户权限变更导致会话无法重新附加作业 #### 解决方案步骤 ##### 1. 检查作业状态(关键步骤) ```sql -- 查询所有数据泵作业状态 SELECT owner_name, job_name, operation, job_mode, state, attached_sessions FROM dba_datapump_jobs WHERE job_name = '<your_job_name>'; -- 替换为实际作业名 -- 若无作业名,查询所有运行中作业 SELECT * FROM dba_datapump_jobs WHERE state = 'EXECUTING'; ``` - ✅ **正常状态**:`STATE = 'EXECUTING'` 且 `ATTACHED_SESSIONS > 0` - ❌ **错误状态**:`STATE = 'NOT RUNNING'` 但作业实际在运行(需强制清理) ##### 2. 重新附加作业(首选方案) ```bash expdp username/password@db \ ATTACH=<job_name> # 从步骤1获取的作业名 ``` - 成功附加后进入交互模式,可选择: - `CONTINUE_CLIENT` 恢复作业 - `STOP_JOB` 安全停止 - 若附加失败,继续下一步 ##### 3. 强制清理残留作业 ```sql DECLARE hdl NUMBER; BEGIN -- 尝试附加作业 hdl := DBMS_DATAPUMP.ATTACH('<job_name>', '<owner_name>'); -- 立即停止并删除作业 DBMS_DATAPUMP.STOP_JOB(hdl, 1, 0); EXCEPTION WHEN OTHERS THEN -- 当附加失败时直接删除作业 DBMS_DATAPUMP.DETACH('<job_name>'); END; / ``` ##### 4. 重启导出作业(预防措施) ```bash expdp username/password@db \ DIRECTORY=dpump_dir \ DUMPFILE=export_%U.dmp \ LOGFILE=export.log \ JOB_NAME=exp_$(date +%s) \ # 使用时间戳确保唯一性 PARALLEL=4 \ CLUSTER=N # 禁用集群选项(规避常见Bug) ``` 关键参数优化: - `JOB_NAME`:添加时间戳保证唯一性(避免 ORA-31623- `CLUSTER=N`:禁用集群模式(解决引用[2]提到的并发Bug) - `PARALLEL`:根据 CPU 核心数设置(公式:$ \text{parallel} \leq \text{CPU\_cores}/2 $) ##### 5. 网络中断处理 若错误由网络中断引起: ```bash # 使用mosh替代ssh(防止会话超时) mosh user@dbserver # 在tmux/screen中启动导出 tmux new-session -s expdp expdp ... # 按Ctrl+B D脱离会话 ``` #### 预防措施 1. **会话管理**: - 使用 `nohup expdp ... &` 或 `tmux` 启动作业 - 设置 SQLNET.EXPIRE_TIME=10(分钟级心跳检测) 2. **作业监控脚本**: ```bash #!/bin/bash # 自动检测并重新附加作业 if ! expdp attach=<job_name>; then echo "Reattaching failed, restarting job..." expdp ... JOB_NAME=exp_$(date +%s) fi ``` 3. **参数优化**(`expdp` 命令行): ```bash COMPRESSION=ALL # 减少网络传输量 NETWORK_LINK=db_link # 远程导出避免客户端中断 ENCRYPTION_PASSWORD=pass # 防止凭据失效 ``` > **重要提示**:如果问题反复出现,请检查 Oracle 集群配置。引用[2]指出该错误常与 Bug 5663241/4173696 相关(集群环境下的句柄同步问题),需应用补丁或设置 `CLUSTER=N`[^2]。 #### 故障排除流程图 ```mermaid graph LR A[出现 ORA-31623] --> B{作业是否存在?} B -->|Yes| C[尝试ATTACH] B -->|No| D[重启新作业] C -->|成功| E[交互控制] C -->|失败| F[强制清理] F --> G[重启新作业] G --> H[添加唯一JOB_NAME] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值