【问题标题】:sqlplus connection error on crontab but works directlycrontab 上的 sqlplus 连接错误,但可以直接工作
【发布时间】:2015-10-19 10:29:03
【问题描述】:

我正在使用以下脚本来创建带有 oracle 查询输出的文本文件。当我手动尝试时,脚本工作正常。但是当我将它放置到 crontab 时,它永远无法获得连接。通过自动化访问sqlplus有什么限制吗?

rm /export/home/oracle/out.csv 
INC=0


while : ; do    

INC=$(($INC+1))
if [[ "$INC" -eq 10 ]]; then
    echo "Exit after multiple failed attempt to connect to the DB."
    break
fi

sqlplus -s username/password@hostname.com:1552/servicename << EOF
set pagesize 10000

set feedback off
set heading off
set echo off

spool /export/home/oracle/out.csv 
SET LINESIZE 10000
SET PAGESIZE 50
SELECT TRIM(COUNT(*)) FROM users;
SPOOL OFF
EXIT;
EOF

[[ -f "/export/home/oracle/out.csv" ]] && break
echo "Failed to connect to DB and retrying."
sleep 5

done

【问题讨论】:

  • 你确定能找到sqlplus吗?这个 cron 作业使用哪个 shell?
  • sqlplus 在那里。当我通过控制台“./report.sh”运行时,相同的脚本工作正常,但仅在 crontab 中出现。两者都使用相同的用户。
  • 能否将 crontab 的内容添加到您的问题中?
  • 您的 PATH 环境变量在从 crontab 运行时可能会有所不同,当您指定 sqlplus 的完整路径时它是否有效?

标签: oracle shell crontab sqlplus


【解决方案1】:

Cron 实用程序使用“/bin/sh”作为默认 shell,因此您需要相应地设置 Oracle 环境。

你可以:

1.- 有一个包含必要变量的配置文件。 (*)

2.- 在脚本中硬编码必要的 Oracle 环境变量。

在你的情况下:

对于解决方案“1”,您可以创建具有以下内容的 $HOME/profile.12cR2 文件:

export ORACLE_BASE=/oraclebin/app/oracle/product/databaseR2/base
export ORACLE_HOME=/oraclebin/app/oracle/product/databaseR2/12cR2

export PATH=$ORACLE_HOME/bin:$PATH

export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib

export ORACLE_SID=db02

export EDITOR=vi

并按如下方式更新您的脚本:

. $HOME/profile.12cR2

rm /export/home/oracle/out.csv 
INC=0


while : ; do    

INC=$(($INC+1))
if [[ "$INC" -eq 10 ]]; then
    echo "Exit after multiple failed attempt to connect to the DB."
    break
fi
...

(*) 根据您的 Oracle 数据库基础架构更新此配置文件。

【讨论】:

  • 出色的答案。第一个带有环境变量的块解决了这个问题。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-10
  • 2019-12-10
  • 2012-02-26
  • 2017-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多