ORA-31634: 作业已存在
一 问题描述每天有个备份oracle(expdp)的定时任务,今天发现备份报错:ORA-31634: 作业已存在ORA-31664: 如果采用默认值, 将无法构造唯一的作业名查看最近一天的备份日志,发现写入到了SYSTEM.SYS_EXPORT_SCHEMA_99。执行SELECT JOB_NAME FROM DBA_DATAPUMP_JOBS WHERE STATE='NOT RUNNING';
一 问题描述
每天有个备份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
更多推荐
所有评论(0)