【问题标题】:Running Shell Script on Different Linux Server using oracle PL/SQL SP使用 oracle PL/SQL SP 在不同的 Linux 服务器上运行 Shell 脚本
【发布时间】:2019-01-28 14:35:12
【问题描述】:

我想在调用存储过程时运行放置在 Linux 服务器上的 shell 脚本。

如果将脚本放置在安装了数据库的同一台服务器上,例如“Linux 服务器 A”,则下面的代码就像一个魅力。

数据库版本:Oracle 数据库 12c Linux 版本:红帽 Linux 7

begin
  dbms_scheduler.create_credential
  (
    credential_name => 'my_credential',
    username        => 'user',
    password        => 'pass'
  );
end;
/
create or replace procedure RunShell
as
begin
  dbms_scheduler.create_job
  (
    job_name             => 'shell_scripts_job',
    job_type             => 'executable',
    number_of_arguments  => 1,
    job_action           => '/usr/bin/sh',
    auto_drop            => true,
    credential_name      => 'my_credential'
  );
  dbms_scheduler.set_job_argument_value(job_name=>'shell_scripts_job', argument_position=>1, argument_value=>'/u01/Script.sh');
  dbms_scheduler.enable('shell_scripts_job');
  dbms_scheduler.run_job(job_name=>'shell_scripts_job');
END;
/
EXECUTE RunShell;

问题是,我的数据库安装在“Linux 服务器 A”上,而我要运行的 shell 脚本在“Linux 服务器 B”上。

此脚本执行一些必须在“Linux 服务器 B”中完成的操作。其中一个主要功能是它启动/停止驻留在“Linux Server B”上的另一个应用程序。

我怎样才能做到这一点?

【问题讨论】:

  • 将 shell 脚本从“Linux 服务器 B”复制到“Linux 服务器 A”。
  • 作为工作的一部分,您能否通过 ssh 从 A 到 B 远程调用脚本? (表示已配置密钥访问权限,没有密码...)
  • @Littlefoot:但是在复制之后,PL/SQL Stored Proc RunShell 怎么会知道在“Linux 服务器 B”上运行 /u01/Script.sh 而不是在“Linux 服务器 A”上运行?跨度>
  • 创建一个指向脚本所在位置的 NFS 共享,并在调用时引用该共享。
  • 如您所说:PL/SQL 过程运行位于数据库服务器(即“Linux 服务器 A”)上的脚本。因此,如果您将脚本从“Linux 服务器 B”复制到“Linux 服务器 A”,您的 PL/SQL 代码将可以访问该脚本并执行该脚本。正是您已经说过的:“如果将脚本放在安装数据库的同一台服务器上,代码就像一个魅力”

标签: linux oracle shell plsql dbms-scheduler


【解决方案1】:

您可以在远程机器上创建一个 NFS 共享,然后将该共享挂载到本地机器上。被共享的远程目录可以被称为本地目录。

例如,如果您在远程目录“/u01”上创建一个共享并将该共享称为“remote_scripts”,则可以将其挂载到 /mnt/remote_scripts。

您代码中的 argument_value 将是

argument_value=>'/remote_scripts/Script.sh'

设置共享和权限需要考虑更多细节,但原则上这是可行的。

以下页面对设置进行了很好的概述,但请让您的 SYSADMIN 参与进来,因为他们了解您的网络。 (https://www.tecmint.com/how-to-setup-nfs-server-in-linux/)

【讨论】:

  • 脚本将存在于远程服务器(B)上,但仍会在本地服务器(A)上执行;所以它不能在远程服务器上执行操作(除非它们直接影响 NFS 共享上的文件);它无法启动/停止驻留在远程服务器上的另一个应用程序 - 可以吗?
  • @AlexPoole - 啊,我误会了。那么它可能会变得有点“笨拙”。听起来像“ssh”将是答案。
  • 公平地说,当您回答 *8-) 时,该要求已隐藏在评论中
  • 感谢大家帮助我,我认为现在唯一的方法是让我的存储过程在“Linux 服务器 A”上运行一个脚本,然后它会对“Linux 服务器 B”进行 ssh 和将调用“Linux Server B”上的脚本
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-30
  • 2012-10-20
  • 1970-01-01
  • 2019-07-11
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
相关资源
最近更新 更多