我有一个Oracle调度程序作业,它在Solaris环境中运行可执行shell脚本。作业每个月的第2个星期日运行,它在调度程序作业日志中运行状态失败,错误代码为:ORA-27369
这是我的shell脚本:
#!/bin/bash
ORACLE_HOME=/app/oracle/10g;
export ORACLE_HOME;
ORACLE_SID=IBSDB;
export ORACLE_SID;
edate=`date "+%Y%m%d"`; export edate;
$ORACLE_HOME/bin/sqlplus "/ as sysdba" @/app/oracle/script/alter_all_index.sql
这个shell脚本运行sqlplus并执行alter_all_index.sql。 alter_all_index.sql通过spool命令创建2个文件。首先是ALTER_INDEX_REBUILD.sql,这个文件包含重建所有索引的查询。第二个文件是LOG_ALTER_INDEX_REBUILD.txt来存储执行ALTER_INDEX_REBUILD.sql时发生的任何错误这里是alter_all_index.sql的代码
set wrap off
set linesize 1000
set feedback off
set pagesize 0
set verify off
set termout off
spool ALTER_INDEX_REBUILD.sql;
prompt set linesize 1000
prompt set pagesize 0
prompt spool LOG_ALTER_INDEX_REBUILD.txt
PROMPT ------------------ START FROM HERE ---------------
--prompt varID nvarchar2(40):=sys_guid();;
--prompt insert into PCB_AGCM.QUERY_HK_MONITOR (ID, TASK_NAME, START_TIME, END_TIME, STATUS) values(varID, 'REBUILD INDEX', to_char(sysdate, 'Dy DD-Mon-YYYY HH24:MI:SS'), null, 'STARTING');;
--prompt commit;;
prompt ------------------ execute GCM_AGCM --------------
select 'ALTER INDEX '||owner||'.'||INDEX_NAME||' REBUILD ONLINE;'
from all_indexes where owner like 'PCB_AGCM%';
PROMPT ------------------ END OF SCRIPT ----------------------
--prompt update PCB_AGCM.QUERY_HK_MONITOR set end_time=to_char(sysdate, 'Dy DD-Mon-YYYY HH24:MI:SS'), status='COMPLETED' where ID = varID;;
prompt commit;;
prompt exec PCB_AGCM.GATHER_SCHEMA_STATS();;
PROMPT /
PROMPT ------------------- END OF SCRIPT ----------------------
prompt spool off
SPOOL OFF;
@@ALTER_INDEX_REBUILD.sql
在作业运行之前,ALTER_INDEX_REBUILD.sql和LOG_ALTER_INDEX_REBUILD.txt都存在于先前手动运行中生成的。 当我通过Oracle Scheduler Job进行测试时。首先它运行良好,我通过TOAD->会话浏览器查看其会话,它运行良好,查询重建索引正在运行,但在最后一个索引完成后,作业以错误ORA-27369结束:EXECUTABLE类型的作业失败并退出代码:不是所有者。
我检查了所有的脚本。 ALTER_INDEX_REBUILD.sql和LOG_ALTER_INDEX_REBUILD.txt都没有更新,如果默认存在,Spool命令将创建和替换,它们的最后修改日期是2013年4月13日。它应该已经更改为2013年5月9日。
我得出一个结论,即spool命令存在问题,但我不知道如何解决这个问题,我认为它可能涉及到他们的所有权和权限,但这两个文件都归oracle所有。任何人都知道为什么以及如何解决这个问题?
我浏览了ORA-27369,但到目前为止没有给我任何提示。
真诚地
答案 0 :(得分:2)
有几个大问题要问这个问题:
像索引重建这样的代码应该是一个带有代码的过程,例如:
for indexes in (select owner,
index_name
from all_indexes
where owner like 'PCB_AGCM%'
order by owner,
table_name)
loop
sql := 'alter index '||indexes.owner||'.'||indexes.index_name||' rebuild online';
execute immediate sql;
end loop
答案 1 :(得分:1)
据我所知,DBMS_SCHEDULER启动的外部程序作为低权限用户帐户运行(通常没有人,请参阅Oracle forums)。
要调试此问题,您可以:
此外,我建议您指定SPOOL文件的绝对路径而不仅仅是文件名,或者在SQL / Plus调用之前使用cd
来确保在正确的目录中创建SPOOL文件。