这是将Oracle Recovery Manager与Oracle Job Scheduler一起使用的有效方法吗?

时间:2009-12-08 18:24:06

标签: oracle rman

首先,我正在创建一个可执行的作业:

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接收我尝试发送的命令?

2 个答案:

答案 0 :(得分:1)

我认为你不能使用DBMS_PIPE。它是一个PL / SQL'东西',而不是RMAN可以处理的东西,而不是像STDIN的unix管道。

您可以使用DBMS_SCHEDULER执行参数。您可能需要一个介入的shell脚本。

[补充] 我有一个带有一个或多个参数的shell脚本

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');

shell脚本将调用RMAN并通过STDIN将参数传递给它。

答案 1 :(得分:1)

之前看起来我错了,RMAN可以与DBMS_PIPE一起使用。 第here条。不要自己理解,但对博客的评论可能会提供更多细节