在Oracle中调用操作系统命令

1、准备工作
修改当前用户的权限,可以创建JOB、创建外部命令的JOB

GRANT CREATE ANY JOB TO user_name;
GRANT CREATE EXTERNAL JOB TO user_name;

设置执行操作系统命令的用户

vi $ORACLE_HOME/rdbms/admin/externaljob.ora

将run_user和run_group设置为oracle所在的用户和组

参考资料:
Guide to External Jobs on 10g with dbms_scheduler

2、创建JOB

  v_job_name := 'JOB_'
    || to_char(SYSDATE, 'YYYYMMDD_HH24MISS');
  dbms_scheduler.create_job(
    job_name  => v_job_name,
    job_type  => 'EXECUTABLE',
    number_of_arguments => 2,
    job_action => '/home/oracle/bin/run_etl_session.sh',
    auto_drop  => TRUE
  );

  dbms_scheduler.set_attribute(
    name     => v_job_name,
    attribute => 'MAX_RUNS',
    value    => 1
  );

注意:JOB_NAME不能有特殊字符,建议为字母、数字或下划线,实际测试中不允许名字中包含横线。

3、JOB设置参数

  dbms_scheduler.set_job_argument_value(
    job_name  => v_job_name,
    argument_position => 1,
    argument_value => in_session_name
  );

  dbms_scheduler.set_job_argument_value(
    job_name  => v_job_name,
    argument_position => 2,
    argument_value => in_workflow_name
  );

4、运行JOB

  dbms_scheduler.run_job(
    job_name => v_job_name
  );

5、如何执行另外一台服务器上的命令
首先需要设置可以通过证书直接登录目标服务器:

ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub remote-host

通过SSH执行远程服务器上的命令

ssh ${ETL_SERVER} "${command} ${param...}"

注意:远程登录后用户的参数文件未加载,相关的环境变量不正确;为保证调用脚本可以正常运行,建议在目标服务器上将执行的命令封装为脚本,在脚本中将bash_profile中相关的环境变量在脚本中重新设置。

6、查询JOB的运行情况

SELECT * FROM user_scheduler_jobs;
SELECT * FROM user_scheduler_job_run_details;

Comments are closed.