1

Solaris 環境で実行可能なシェル スクリプトを実行する Oracle スケジューラ ジョブがあります。ジョブは毎月第 2 日曜日に実行され、スケジューラ ジョブ ログでエラー コード ORA-27369 の状態で実行されます。

ここに私のシェルスクリプトがあります:

#!/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

このシェル スクリプトは、sqlplus を実行し、alter_all_index.sql を実行します。alter_all_index.sql は、spool コマンドを介して 2 つのファイルを作成します。最初は ALTER_INDEX_REBUILD.sql です。このファイルには、すべてのインデックスを再構築するためのクエリが含まれています。2 番目のファイルは 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 の両方が更新されていません。デフォルトで存在する場合は、スプール コマンドによって作成および置換されます。最終更新日は 2013 年 4 月 13 日です。2013 年 5 月 9 日に変更されているはずです。

スプールコマンドに問題があるという結論に達しましたが、これを解決する方法がわかりませんでした。所有権と許可に関係している可能性があると思いましたが、両方のファイルがオラクルによって所有されています。誰もがこれを解決する理由と方法を知っていますか?

所有権と許可

私はORA-27369について閲覧しましたが、これまでのところヒントはありません。

心から

4

2 に答える 2

2

これについていくつかの重要な質問があります。

  • pl/sql プロシージャとして実行できる sql*plus スクリプトを外部ジョブとして実行するのはなぜですか? 原則として、タスクにオペレーティング システムを関与させる必要がない場合は、関与させないでください。ファイル システムに保存されているコードは、データベースにバックアップされず、接続の問題や一部のくそったれの削除によるエラーが発生しやすくなります。

インデックスの再構築のようなコードは、次のようなコードを含む手順である必要があります。

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
  • すべてのインデックスを定期的に再構築するのはなぜですか? すぐに測定可能な利点が得られる場合は、インデックスを圧縮したためですが、インデックスが元のサイズに戻るため、より多くのオーバーヘッドが発生します。詳細については、Richard Foote のブログの多くのエントリを参照してください。
于 2013-05-13T10:58:43.423 に答える
1

私の知る限り、DBMS_SCHEDULER によって起動される外部プログラムは、権限の低いユーザー アカウントとして実行されます (通常は誰もいません。Oracle フォーラムを参照してください)。

この問題をデバッグするには、次の方法があります。

  • UID を出力する簡単なスクリプトを実行する
  • このユーザーが /app/oracle/script/ でファイルの作成/上書きを許可されているかどうかを確認します

また、ファイル名だけでなく SPOOL ファイルの絶対パスを指定するかcd、SQL/Plus 呼び出しの前に使用して、SPOOL ファイルが正しいディレクトリに作成されるようにすることをお勧めします。

于 2013-05-13T10:41:26.387 に答える