0

まず、実行可能なジョブを作成しています。

BEGIN
  DBMS_SCHEDULER.CREATE_JOB(job_name => 'PIPE_JOB', job_type => 'EXECUTABLE', job_action => 'RMAN PIPE TEST_PIPE_1 target / TIMEOUT = 60');
END;

次に、次の一連の Oracle コマンドを使用してジョブを実行しようとしています。

DECLARE
  pipename CONSTANT VARCHAR2(100) := 'TEST_PIPE_1';
  create_result INTEGER;
  send_result INTEGER;
BEGIN
  create_result := DBMS_PIPE.CREATE_PIPE(pipename);
  DBMS_PIPE.PACK_MESSAGE('BACKUP INCREMENTAL LEVEL 1 CUMULATIVE DEVICE TYPE DISK DATABASE INCLUDE CURRENT CONTROLFILE;');
  send_result := DBMS_PIPE.SEND_MESSAGE(pipename);
  DBMS_SCHEDULER.RUN_JOB(job_name => 'PIPE_JOB', use_current_session => false);
END;

ここで、RUN_JOB を呼び出すと、サーバー上で RMAN 実行可能ファイルが起動しますが、すぐに終了します。おそらく、パイプにパックしようとしているコマンドを受信しないためです。

パイプを正しく使用して、送信しようとしているコマンドを RMAN に受信させるにはどうすればよいですか?

4

2 に答える 2

1

これにはDBMS_PIPEを使用できないと思います。これはPL/SQLの「もの」であり、RMANが処理できるものではなく、STDINへのunixパイプとは異なります。

ただし、DBMS_SCHEDULERを使用してパラメーターを実行できます。介在するシェルスクリプトが必要になる場合があります。

[追加]1つ以上のパラメーターを受け取るシェルスクリプトがあります

dbms_scheduler.create_job
(
job_name => 'job1',
job_type => 'EXECUTABLE',
job_action => '/somewhere/rman_script.sh',
enabled => false,
number_of_arguments => 2,
comments => 'Run shell-script'
);
dbms_scheduler.set_job_argument_value(SHELL || jobidx,1,'blah');
dbms_scheduler.set_job_argument_value(SHELL || jobidx,2,'blah');
dbms_scheduler.enable('job1');

シェルスクリプトはRMANを呼び出し、STDINを介してパラメータをパイプします。

于 2009-12-09T23:33:14.923 に答える
1

以前は間違っていたようですが、RMAN は DBMS_PIPE で使用できます。記事はこちら。自分ではよくわかりませんが、ブログのコメントで詳細がわかるかもしれません

于 2009-12-16T03:12:24.327 に答える