一 问题描述

每天有个备份oracle(expdp)的定时任务,今天发现备份报错:

ORA-31634: 作业已存在
ORA-31664: 如果采用默认值, 将无法构造唯一的作业名

查看最近一天的备份日志,发现写入到了SYSTEM.SYS_EXPORT_SCHEMA_99。

执行SELECT  JOB_NAME FROM DBA_DATAPUMP_JOBS WHERE STATE='NOT RUNNING' order by job_name;输出结果有99个这样的表SYSTEM.SYS_EXPORT_SCHEMA_*

二 出错原因

估计是job队列满了。

三 解决办法

清理not running的job:

① SELECT 'DROP TABLE ' || OWNER_NAME ||'.'|| JOB_NAME ||';' FROM DBA_DATAPUMP_JOBS WHERE STATE='NOT RUNNING' order by job_name;

② 执行上述sql查询出来的drop table语句,如:

DROP TABLE SYSTEM.SYS_EXPORT_SCHEMA_01;

DROP TABLE SYSTEM.SYS_EXPORT_SCHEMA_02;

……

DROP TABLE SYSTEM.SYS_EXPORT_SCHEMA_99;

为了避免再次出现该问题,这里创建个定期清理的定时任务:

由于有时备份会报如下错误,导致无法备份成功:

ORA-31634: 作业已存在
ORA-31664: 如果采用默认值, 将无法构造唯一的作业名

四 后续处理

因此这里写了定期清理无用作业的脚本,避免以后出现此错误。

一 创建清理脚本

1.1 创建相关目录

su - oracle

mkdir delJob

cd delJob

一共需要创建四个脚本。

1.2 创建清理脚本

1.2.1 创建selectJob.sql

vi selectJob.sql

添加:

SELECT 'DROP TABLE ' || OWNER_NAME ||'.'|| JOB_NAME ||';' FROM DBA_DATAPUMP_JOBS WHERE STATE='NOT RUNNING' order by job_name;

exit;

1.2.2 创建selectJob.sh

vi selectJob.sh

添加:

username='system'

passwd='oracle'

file1='/home/oracle/delJob/selectJob.sql'

/u01/app/oracle/product/11.2.0.4/db_1/bin/sqlplus -Sl ${username}/${passwd} @${file1}

注意修改passwd变量值为自己system用户的密码

1.2.3 创建dealTxt.sh

vi dealTxt.sh

添加:

file1='/home/oracle/delJob/selectJob.txt'

cat $file1 | grep -v 'OWNER_NAME' | grep -v '\-\-\-'

cat $file1 | grep -v '已选择' | grep -v '\-\-\-'
cat $file1 | grep -v 'rows selected' | grep -v '\-\-\-'

1.2.4 创建DelExportJob.sh

vi DelExportJob.sh

添加:

username='system'

passwd='oracle'

dir1='/home/oracle/delJob'

file1=${dir1}'/selectJob.sh'

file2=${dir1}'/selectJob.txt'

file3=${dir1}'/dealTxt.sh'

file4=${dir1}'/dealTxt.txt'

date=`date "+%Y%m%d%H%M"`

echo $date':'

export ORACLE_HOME=/u01/app/oracle/product/11.2.0.4/db_1

source /home/oracle/.bash_profile

#查询出需要删除的not running的job

sh $file1 > $file2

str1=$(cat $file2 | grep 'no rows selected')

str2=$(cat $file2 | grep '未选定行')

#如果没有需要删除的job,则直接退出,若有,则进行删除

if [ "$str1" != "" ] || [ "$str2" != "" ]

then

  echo '没有not running的export job,无需删除.'

  exit

else

  echo '开始删除not running的export job...'

  #去除无用信息

  sh $file3 > $file4

  echo 'exit;' >> $file4

  #开始删除not running的export job

  /u01/app/oracle/product/11.2.0.4/db_1/bin/sqlplus -Sl ${username}/${passwd} @${file4}

fi

注意修改passwd变量值为自己system用户的密码

1.3 给执行脚本赋予执行权限

[oracle@PC delJob]$ pwd

/home/oracle/delJob

chmod +x *.sh

二 创建定时任务

用root用户创建定时任务

执行crontab  -e

添加:

#清理not running的export job

0 0 * * * /home/oracle/delJob/DelExportJob.sh > /home/oracle/delJob/DelExportJob.log 2>&1

--本篇文章转自http://dfreedom.net/2020/05/oracle-expdp-ora-31634-job-already-exists.html

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐