我有一个 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;
}
谢谢
这是
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
}
旁注:
您确实不应该有 OEM 代理的 /etc/oratab 条目。
我强烈建议您从 /etc/oratab.conf 中删除该行。
拥有 OEM-Agent 条目确实是很糟糕的做法,可能会在 $PATH(库等)中弄乱其他 Oracle 产品
相信我,我在 Oracle 担任首席 OEM 讲师近十年,直到 2020 年离开。