expdp导出时报错ORA-31634 31664

Oracle · newbie_l · 于 10个月前发布 · 725 次阅读

云吞信息--风轻云淡

故障描述

在使用expdp FULL全导出数据库遇到ORA-31634,ORA-31664报错,而使用SCHEMAS导出正常。

报错内容如下:

ORA-31634: job already exists

ORA-31664: unable to construct unique job name when defaulted

故障分析

从报错来看,该错误由于JOB名字已存在,不能创建出相同名字的JOB而导致。由于Oracle在进行datapump操作时, 数据库会在该用户下生成一张对应导出JOB的表。如果在JOB_NAME不指定的情况下, 则自动使用其命名规则:SYSEXPORT_NN(NN最大值为99)。 全导出自动命名规则为SYS_EXPORT_FULL_NN。 全导出自动命名规则为SYS_EXPORT_SCHEMAS_NN。 那么由于故障现象为FULL导出失败,SCHEMAS导出成功,初步判断存在99个RUNNING或NOT RUNNING的FULL导出JOB在数据库中, 导致新的FULL导出失败。 检查dba_datapump_jobs视图进行确认:

SQL>SELECT COUNT(*),STATE FROM DBA_DATAPUMP_JOBS GROUP BY STATE;

COUNT(*) STATE

99 NOT RUNNING

确实存在99个NOT RUNNING的datapump job。

进一步进行确认JOB名字:

JOB_NAME

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

...

SYS_EXPORT_FULL_91

SYS_EXPORT_FULL_92

SYS_EXPORT_FULL_93

SYS_EXPORT_FULL_94

SYS_EXPORT_FULL_95

SYS_EXPORT_FULL_96

SYS_EXPORT_FULL_97

SYS_EXPORT_FULL_98

SYS_EXPORT_FULL_99

99 ROWS SELECTED

可以看到均为FULL导出,同时达到上限数字99。

那么此时已经可以判断出导致该故障的原因为数据库中存在大量FULL导出的NOT RUNNING的历史JOB没有进行清理。

故障处理

1.删除NOT RUNNING的JOB: 方式有两种:

1.1使用sql语句:SELECT 'DROP TABLE ' || OWNER_NAME ||'.'|| JOB_NAME ||';' FROM DBA_DATAPUMP_JOBS WHERE STATE='NOT RUNNING'; 然后运行上述SQL语句的结果删除相关表即可.

1.2使用存储过程删除: EXEC DBMS_DATAPUMP.STOP_JOB(DBMS_DATAPUMP_ATTACH(‘SYS_EXPORT_FULL_01’,’SYS’));

2.删除完毕后进行确认是否在dba_datapump_jobs是否还存在NOT RUNNING的job.

3.重新进行expdp FULL导出,成功.

故障建议

1.对于在ORACLE数据库用使用datapump功能进行导出以及导入工作时。如果在中途发生错误,或人为的进行CRTL+C操作,不一定会在数据库中把该JOB删除。频繁的进行这类操作可能会导致大量的NOT RUNNING JOB在数据库中堆积,从而引发该报错。一般我们要求使用正确的方式停止datapump job,或手工的进行该JOB的删除工作。

2.在条件许可的情况下可以为datapump工作定义一个唯一的JOB_NAME,从而避免JOB名字重复问题的发生。

官方参考文档:

Running DataPump Jobs Results In ORA-31634 ORA-31664 (文档 ID 1384163.1)

本文由 newbie_l 创作,采用 知识共享署名 3.0 中国大陆许可协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出处。


共收到 0 条回复
没有找到数据。
回复本帖 (需要登录)