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 可以处理的东西,也不像标准输入的 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 将参数传递给它。

于 2009-12-09T23:33:14.923 回答
1

看起来我之前错了,RMAN 可以与 DBMS_PIPE 一起使用。文章在这里。自己看不太懂,但是博客上的评论可能会提供更多细节

于 2009-12-16T03:12:24.327 回答