2017-02-21 6 views
0
#!/bin/bash 
#Oracle DB Info for NEXT 
HOST="1.2.3.4" 
PORT="5678" 
SERVICE="MYDB" 
DB_USER=$(whoami) 
DB_PASS=$(base64 -d ~/.passwd) 
DB_SCHEMA="my_db" 

#Section for all of our functions. 
function SQLConnection(){ 
sqlplus "$DB_USER"/"$DB_PASS"@"$HOST":"$PORT"/"$SERVICE" 
} 

function Connected(){ 
SQLConnection <<EOF 
select sys_context('USERENV','SERVER_HOST') from dual; 
EOF 
} 

function GetJMS(){ 
SQLConnection <<EOF 
set echo on timing on lines 200 pages 100 
select pd.destination from ${DB_SCHEMA}.pd_notification pd where pd.org_id = '$ORGID'; 
EOF 
} 
TODAY=$(date +"%A %B %d, %Y") 
read -r -p $'\n\nWhat is the ORG ID? ' ORGID 
read -r -p $'\n\nWhat is the REMOTE QUEUE MANAGER NAME? ' RQM 
read -r -p $'\n\nWhat is the IP address of the REMOTE QUEUE MANAGER? ' CONN 
read -r -p $'\n\nWhat is the PORT of the REMOTE QUEUE MANAGER? ' PORT 
echo -en "* $(whoami)\n* $TODAY\n* MQ Setup $ORGID\n\nDEFINE +\n\tCHANNEL('$RQM.LQML') +\n\tCHLTYPE(SDR) +\n\tCONNAME('$CONN($PORT)') +\n\tXMITQ('BUF.2.$ORGID.XMQ')\n\tCHAUTH(TLS_RSA_WITH_AES_256_CBC_SHA256)\n\nDEFINE +\n\tCHANNEL('LQML.$RQM') +\n\tCHLTYPE(RCVR) +\n\tTRPTYPE(TCP)\n\nDEFINE +\n\tQLOCAL('$RQM') +\n\tTRIGDATA('LQML.$RQM') +\n\tINITQ('SYSTEM.CHANNEL.INITQ') +\n\tTRIGGER USAGE(XMITQ)\n\n" > ~/mqsetup.mqsc 

CONNECTED=$(Connected | awk 'NR==16') 
echo -en "\n\nHello From: $CONNECTED\n\n" 

for JMSDESTINATION in $(GetJMS | awk 'NR>=16&&NR<=24{print $1}') 
    do 
     read -r -p $'\n\nWhich REMOTE QUEUE NAME matches with this ${JMSDESTINATION}?' RNAME 
     QDESC=$(echo "$JMSDESTINATION" | tr '.' ' ' | tr '[[:upper:]]' '[[:lower:]]') 
     echo -en "\n\nDEFINE +\n\tQR($JMSDESTINATION) +\n\t\tREPLACE DESCR('$ORGID $QDESC Queue') +\n\t\tREPLACE MAXDEPTH(5000) +\n\t\tXMITQ('BUF.2.$ORGID.XMQ') +\n\t\tRNAME('$RNAME') +\n\t\tRQMNAME('$RQM')" >> ~/mqsetup.mqsc 
    done 

ここには、IBM MQキューとチャネルの設定を自動化するためのスクリプトがあります。私の問題は、このスクリプトの外では、スクリプトに見られる変数を入力すれば、シェルから直接問題なくSQLセッションを確立できます。私は機能を呼び出すことができ、私はそれが望むようにすべてが返されます。スクリプト内からまったく同じものを実行すると、タイムアウトエラーが発生します...「Hello From」は空白で、DB接続がないことを示します。BASHスクリプト内からOracle SQLセッションを確立できません。

なぜ私はそれがスクリプトの外側からすべてうまくいくのかが分かりませんが、その内部はタイムアウトします。

私は目と助けを感謝します!

+1

接続部分は正常に動作しているようです。あなたは単にConnectedと呼ぶなら何を見ますか?タイムアウトエラーはどこで確認できますか? (接続しても、あなたのawkパターンは私のために何も表示されないので、その周りにデバッグをしたいかもしれません) –

+0

この行の$記号をエスケープする必要はありません:select pd.destination from $ {DB_SCHEMA} .pd_notification pd pd.org_id = '$ ORGID'; – BobC

+0

@AlexPooleはい、変数と関数をシェルに直接ロードしたと仮定すると、関数 "Connected"を呼び出すことができ、SQLPlusヘッダー、db-serverホスト名、およびすべての既存のクレジットを即座に出力します。私はAWKを使ってそれをホスト名だけに整えます。スクリプトを実行してセッションにすべてをロードすると、スクリプトはDB接続を確立しようとするようにフリーズしますが、「Hello From:」という空白を印刷するとエラーが表示されないため、失敗しますホスト名は)。 – misteralexander

答えて

1

変数値を上書きしています。あなたは、スクリプトの先頭でこれを持っている:

PORT="5678" 

が、その後、後であなたにん:

が入力されているものを使用して5678値を上書き
read -r -p $'\n\nWhat is the PORT of the REMOTE QUEUE MANAGER? ' PORT 

。そのポートはDBサーバーをまったくリッスンしていないか、何か他のことを行っている可能性があります。値を入力しないと、接続時にポート1521がデフォルトになります。しかし、どちらの方法でも、ポートの状態に応じて、接続が迅速にまたは遅く(たとえば、ファイアウォールがブロックすると遅くなるなど)失敗する可能性があります。

Connectedコールをreadコールの前に追加して接続をテストすると(最初のように)、正常に動作しているようです。接続しようとするポートの値が間違っているため、読み取り後の接続は機能しません。

2つの変数に異なる名前を使用します(例: readコマンドとそれに続く~/mqsetup.mqscファイルの作成の両方で、2番目のものについてはRQ_PORTとなります。

-lフラグをSQL * Plusコールに追加すると便利です。何らかの理由で接続が失敗した場合、資格情報の再入力が行われない場合があります。あなたが数回Enterを押すまでハングアップします。


ない問題に直接関連するが、私は通常、(環境の間で異なります)バナーを抑制するために-sフラグを使用して、このようなものを自動化します。問合せの出力をキャプチャすることにのみ関心がある場合は、見出しやページ区切りをオフにしてフィードバックをオフにし、SQL * Plusをできるだけ小さなノイズを発生させるように設定するのが一般的です。 。

+0

これはまさに正しいことでした!ああ、私はそれを直視して信じられない!それを捕まえてくれてありがとう。また、オプション "-S"と "-L"について知らなかった...それらはトンを助けるだろう。ありがとう! – misteralexander

関連する問題