我有几台 linux 机器,每台机器都有几个 Oracle 数据库。在每台机器上,我们有 2 个 shell 脚本来运行备份。TSM 调度程序调用一个脚本,该脚本为机器上的每个 DB 调用不同的备份脚本。
问题是,如果我创建一个 SID 数组并通过 SID 创建一个循环,备份将失败。
#!/bin/bash
LEVEL="$1"
declare -a SIDS=('SID1' 'SID2' 'SID3')
su - oracle
for SID in ${SIDS[@]}
do
ORACLE_SID=$SID; export ORACLE_SID
export ORACLE_HOME='/u01/app/oracle/product/10.2.0.2'
ORAENV_ASK=NO
. /usr/local/bin/oraenv
LD_LIBRARY_PATH=$ORACLE_HOME/lib; export LD_LIBRARY_PATH
/usr/local/adm/backup-incrn.sh $LEVEL $SID 35
done
TSM 服务器上的日志中没有错误,几乎就像从未调用过脚本一样。机器上的日志不会更新任何错误消息。
如果我使用这种语法备份工作完美
su - oracle -c "/usr/local/adm/backup-incrn.sh $LEVEL SID1 35"
su - oracle -c "/usr/local/adm/backup-incrn.sh $LEVEL SID2 35"
我认为这一定是我的脚本中的一个错误,一些变量没有正确设置。
任何人都可以看到我犯的明显错误并向我指出吗?
吉斯利
我猜想因为您要发出登录名,所以您的 SIDS 声明不会传输到由 su 命令启动的 shell。您可以在发出“su - oracle”后通过检查 SIDS 的值来对此进行测试
从脚本中删除该行。您可以在实际运行脚本之前切换用户。如果您在 shell 脚本中切换用户,那么它会为您提供新的 shell 环境,从而失去更多的 shell 指令。(还有其他方法可以做到)