shell 脚本从 ORATAB 文件中排除 +ASM、AGENT、-MGMTDB 条目并仅验证 DBSID

问题描述 投票:0回答:2

我有一个 SQL 脚本,它获取有关 FRA(ORACLE 中的闪回恢复区域)的详细信息,该脚本仅需要在数据库中运行,而不是在任何其他 oratab 条目中运行。因此,在下面的情况下,我需要它仅在 dbname1 和 dbname2 中执行,并在找到时忽略其余条目。

oratab 文件示例:

dbname1:/u01/app/oracle/11.2.0.4/db_1:Y
dbname2:/u01/app/oracle/12.2.0.1/db_2:Y
+ASM:/u01/app/grid:N
MGMTDB:/u01/app/grid:N
AGENT:/u01/app/agent_home:N

我编写了一个当前正在使用的函数,但无法按照我的要求正常工作。非常感谢任何更改。

checkORATAB()
{
ORATAB=/etc/oratab
SID=`egrep -i ":Y|:N" $ORATAB | cut -d":" -f1 |grep -v "\#"|grep -v "\*"`
export $SID
if [[ `echo "$ORACLE_SID" | cut -b 1` != '+' ]] && [[ "$ORACLE_SID" != "AGENT" ]] && [[ "$ORACLE_SID" != "GRID" ]] && [[ "$ORACLE_SID" != "-MGMTDB" ]] && [[ "$ORACLE_SID" != "+ASM" ]]; then
for i in $SID; do
runscript;
fi
done
exit;
}

谢谢

shell sh ksh
2个回答
0
投票

这是

awk
sed
的工作,尽管
grep
cut
的组合也可以工作。

checkORATAB() {
    ORATAB=/etc/oratab
    for sid in $(awk -F: '$1 !~ /(+ASM|MGMTDB|AGENT)/ {print $1}' $ORATAB)
    do
        export ORACLE_SID=$sid
        runscript
    done
}

或使用

sed
:

checkORATAB() {
    ORATAB=/etc/oratab
    for sid in $(sed -n '/^\(+ASM\|MGMTDB\|AGENT\)/b;s/:.*//p' $ORATAB)
    do
        export ORACLE_SID=$sid
        runscript
    done
}

0
投票

旁注:
您确实不应该有 OEM 代理的 /etc/oratab 条目。
我强烈建议您从 /etc/oratab.conf 中删除该行。 拥有 OEM-Agent 条目确实是很糟糕的做法,可能会在 $PATH(库等)中弄乱其他 Oracle 产品

相信我,我在 Oracle 担任首席 OEM 讲师近十年,直到 2020 年离开。

© www.soinside.com 2019 - 2024. All rights reserved.