RE: Map database to running instance from oratab?

From: Rivenes, Andy <rivenes1_at_llnl.gov>
Date: Mon, 30 Jul 2012 16:57:29 -0700
Message-ID: <55AE4F6513A6DC46A3652D716B7DD7C5010DA8556D83_at_NSPEXMBX-A.the-lab.llnl.gov>



Cheesy fix for the variable problem:

#!/bin/bash  

set -x
export INSTANCE=  

echo "Instance variable BEFORE loop: $INSTANCE"  

grep -vE '(^#|^$)' oratab > /tmp/myout
while read DATABASE; do

   export INSTANCE=`echo $DATABASE | cut -d':' -f1`    echo "Instance variable IN loop: $INSTANCE"    break
done < /tmp/myout  

echo "Instance variable AFTER loop: $INSTANCE"

bash-3.2$ ./env_test1.sh
+ export INSTANCE=
+ INSTANCE=
+ echo 'Instance variable BEFORE loop: '
Instance variable BEFORE loop:
+ grep -vE '(^#|^$)' oratab
+ read DATABASE

++ echo grid:/app/local/11.2.0.3/grid:N
++ cut -d: -f1

+ export INSTANCE=grid
+ INSTANCE=grid
+ echo 'Instance variable IN loop: grid'
Instance variable IN loop: grid
+ break
+ echo 'Instance variable AFTER loop: grid'
Instance variable AFTER loop: grid
bash-3.2$

-----Original Message-----
From: oracle-l-bounce_at_freelists.org [mailto:oracle-l-bounce_at_freelists.org] On Behalf Of Herring Dave - dherri Sent: Sunday, July 29, 2012 12:28 PM
To: post.ethan_at_gmail.com; Radoulov, Dimitre Cc: oracle-l
Subject: RE: Map database to running instance from oratab?

Ethan,

As has been raised previously, the db_unique_name doesn't have to be tied to the instance name. Data Guard adds a nice twist. Throw in RAC and DG with mulitple standbys and you get all sorts of fun.

As for your script, be VERY careful what shell you run it in. Only ksh allows you to change variables in a while-loop and have those changed values visible outside of the loop. In other words if you run that code in Borne or Bash it won't work (I haven't tested csh). I researched this a bit a number of years ago when we first shifted from ksh to bash and now can't remember to reason for this situation. All I can remember is the OS folks not understanding why I'd code so much in shell. If I find details I'll make sure to share. Anyway, below is a test showing this behavior. Take the same script and change "#!/bin/bash" to "#/bin/ksh" and it'll work as you expect:

% cat env_test.sh
#!/bin/bash

set -x
export INSTANCE=

echo "Instance variable BEFORE loop: $INSTANCE" grep -vE '(^#|^$)' /etc/oratab | while read DATABASE do

   export INSTANCE=`echo $DATABASE | cut -d':' -f1`    echo "Instance variable IN loop: $INSTANCE"    break
done

echo "Instance variable AFTER loop: $INSTANCE"

% env_test.sh
+ export INSTANCE=
+ INSTANCE=
+ echo 'Instance variable BEFORE loop: '
Instance variable BEFORE loop:
+ grep -vE '(^#|^$)' /etc/oratab
+ read DATABASE

++ echo +ASM1:/grid/app/11.2.0/oracle:N
++ cut -d: -f1

+ export INSTANCE=+ASM1
+ INSTANCE=+ASM1
+ echo 'Instance variable IN loop: +ASM1'
Instance variable IN loop: +ASM1
+ break
+ echo 'Instance variable AFTER loop: '

Instance variable AFTER loop:

DAVID HERRING
DBA
Acxiom Corporation

EML   dave.herring_at_acxiom.com
TEL    630.944.4762
MBL   630.430.5988

1501 Opus Pl, Downers Grove, IL 60515, USA WWW.ACXIOM.COM
--
http://www.freelists.org/webpage/oracle-l
Received on Mon Jul 30 2012 - 18:57:29 CDT

Original text of this message