2017-02-21 41 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» пуст, который говорит мне, что нет соединения с БД.Не удалось установить сеанс Oracle SQL из сценария BASH

Я полностью в тупике относительно того, почему все это прекрасно работает вне сценария, но внутри него не хватает времени.

Я ценю глаза и помощь!

+1

Соединительная часть работает нормально; что вы видите, если вы просто вызываете Connected? Где вы видите ошибки таймаута? (Даже при подключении, ваш шаблон awk ничего не показывает для меня, так что вы можете сделать некоторую отладку вокруг этого?) –

+0

Вам не нужно скрывать знак $ в этой строке: выберите pd.destination from $ {DB_SCHEMA} .pd_notification pd где pd.org_id = '$ ORGID'; – BobC

+0

@AlexPoole Да, предполагая, что я непосредственно загрузил переменные и функции в оболочку, я могу вызвать функцию «Подключено», и я получаю немедленный вывод заголовков SQLPlus, имя узла db-сервера и все оставшиеся кредиты. Я использую AWK, чтобы обрезать это только до имени хоста. Когда я запускаю скрипт и он загружает все в свой сеанс, скрипт зависает, как его пытается установить соединение с db, но он терпит неудачу, потому что заявление echo, которое я вставляю в качестве проверки, не удается, напечатав «Hello From:» (пустое место, где hostname будет). – misteralexander

ответ

1

Вы перезаписываете переменное значение. У вас есть это в верхней части сценария:

PORT="5678" 

, но потом на вас сделать:

read -r -p $'\n\nWhat is the PORT of the REMOTE QUEUE MANAGER? ' PORT 

который перезаписывает 5678 значение с любой вводится там. Этот порт может вообще не прослушиваться на сервере БД или может делать что-то еще, или если вы не вводите значение, которое по умолчанию будет установлено на порт 1521 при подключении. Но в любом случае соединение будет терпеть неудачу, быстро или медленно в зависимости от состояния порта (например, медленнее, если брандмауэр блокирует его).

Если вы проверили соединение, добавив Connected звонок перед вызовами read (как я изначально сделал), то он, кажется, работает нормально; но соединения после чтения не работают, потому что значение порта, к которому он пытается подключиться, теперь ошибочно.

Используйте другое имя для двух переменных, например. RQ_PORT для второго - как в команде read, так и после создания файла ~/mqsetup.mqsc.

Возможно, вам будет полезно добавить флаг -l к вашему вызову SQL * Plus, чтобы, если соединение по какой-либо причине не вызвало ошибку, оно не будет запрашивать учетные данные, что в некоторых случаях может привести к появлению сценария пока не нажмете несколько раз.


не имеет прямое отношение к этой проблеме, но при автоматизации ничего подобного я обычно также использовать -s флаг для подавления баннеров (которые могут варьироваться в зависимости от условий); и если вы заинтересованы только в захвате вывода запросов, я обычно устанавливаю заголовки и/или разбивку на страницы, а также обратную связь и обычно устанавливаю SQL * Plus для создания как можно меньшего количества шума - это упрощает анализ интересных битов ,

+0

Это было точно! Боже, я не могу поверить, что я смотрел прямо мимо этого! Большое спасибо за это. Кроме того, не знал о вариантах «-S» и «-L» ... это поможет тонну. Благодаря! – misteralexander