Проверьте подключение к базе данных с помощью сценария Shell - PullRequest
8 голосов
/ 23 сентября 2010

Я пытаюсь написать сценарий оболочки для проверки подключения к базе данных. В моем сценарии я использую команду

sqlplus uid/pwd@database-schemaname

для подключения к моей базе данных Oracle.

Теперь я хочу сохранить выходные данные, сгенерированные этой командой (перед тем, как она перейдет к приглашению SQL), во временный файл, а затем grep / найти строку «Connected to» из этого файла, чтобы проверить, нормально ли подключение

Может кто-нибудь помочь мне перехватить вывод и выйти из этого приглашения и проверить, в порядке ли связь?

Ответы [ 7 ]

26 голосов
/ 23 сентября 2010

Используйте скрипт, подобный следующему:

#!/bin/sh
echo "exit" | sqlplus -L uid/pwd@dbname | grep Connected > /dev/null
if [ $? -eq 0 ] 
then
   echo "OK"
else
   echo "NOT OK"
fi

echo "exit" гарантирует, что ваша программа завершается немедленно (это передается в sqlplus).-L гарантирует, что sqlplus не будет запрашивать пароль, если учетные данные не в порядке (что также может привести к зависанию).

(> / dev / null просто скрывает вывод из grep, который мы ненужно, потому что результаты доступны через $? в этом случае)

2 голосов
/ 23 сентября 2010

Вы можете избежать запроса SQL, выполнив:

sqlplus uid/pwd@database-schemaname < /dev/null

SqlPlus немедленно завершает работу.

Теперь просто сгенерируйте выходные данные выше как:

if sqlplus uid/pwd@database-schemaname < /dev/null | grep 'Connected to'; then
   # have connectivity to Oracle
else
   # No connectivity
fi
1 голос
/ 23 сентября 2010
#! /bin/sh  

if echo "exit;" | sqlplus UID/PWD@database-schemaname 2>&1 | grep -q "Connected to"
then echo connected OK
else echo connection FAIL
fi

Не зная, выводится ли сообщение «Подключено» на стандартный вывод или стандартная ошибка, проверяется и то и другое. «qrep -q» вместо «grep ...> / dev / null» предполагает Linux.

1 голос
/ 23 сентября 2010
#!/bin/bash
output=`sqlplus -s "user/pass@POLIGON.TEST " <<EOF
           set heading off feedback off verify off
           select distinct machine from v\\$session;
           exit
EOF
`

echo $output
if [[ $output =~ ERROR ]]; then
     echo "ERROR"
else

     echo "OK"
fi 
0 голосов
/ 17 апреля 2019

Это был мой однострочник для контейнера докера, который ждал, пока БД не будет готова:

until sqlplus -s sys/Oracle18@oracledbxe/XE as sysdba <<< "SELECT 13376411 FROM DUAL; exit;" | grep "13376411"; do echo "Could not connect to oracle... sleep for a while"; sleep 3; done

И то же в нескольких строках:

until sqlplus -s sys/Oracle18@oracledbxe/XE as sysdba <<< "SELECT 13376411 FROM DUAL; exit;" | grep "13376411"; 
do 
  echo "Could not connect to oracle... sleep for a while"; 
  sleep 3; 
done

Таким образом, он выбирает магическое число и проверяет, действительно ли вернулось правильное число.

0 голосов
/ 27 ноября 2018

ни одно из предложенных решений не работает для меня, так как мой сценарий выполняется на машинах, работающих в нескольких странах, с разными локалями, я не могу просто проверить одну строку просто потому, что эта строка на другой машине переведена на другой язык,В качестве решения я использую SQLcl

https://www.oracle.com/database/technologies/appdev/sqlcl.html

, который совместим со всеми сценариями sql * plus и позволяет тестировать подключение к базе данных следующим образом:

echo "disconnect" | sql -L $DB_CONNECTION_STRING > /dev/null || fail "cannot check connectivity with the database, check your settings"
0 голосов
/ 18 августа 2015

Вот хороший вариант, который не выставляет пароль в командной строке

#!/bin/bash
CONNECT_STRING=<USERNAME>/<PASS>@<SID>
sqlplus -s -L /NOLOG <<EOF
whenever sqlerror exit 1
whenever oserror exit 1
CONNECT $CONNECT_STRING
exit
EOF

SQLPLUS_RC=$?
echo "RC=$SQLPLUS_RC"
[ $SQLPLUS_RC -eq 0 ] && echo "Connected successfully"
[ $SQLPLUS_RC -ne 0 ] && echo "Failed to connect"

exit SQLPLUS_RC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...