【发布时间】:2011-04-16 07:50:10
【问题描述】:
我正在尝试编写一个 shell 脚本来检查数据库连接。在我的脚本中,我正在使用命令
sqlplus uid/pwd@database-schemaname
连接到我的 Oracle 数据库。
现在我想将此命令生成的输出(在它下降到 SQL 提示符之前)保存在一个临时文件中,然后 grep / 从该文件中查找字符串“已连接到”以查看连接是否正常。
谁能帮我捕捉输出并摆脱该提示并测试连接是否正常?
【问题讨论】:
我正在尝试编写一个 shell 脚本来检查数据库连接。在我的脚本中,我正在使用命令
sqlplus uid/pwd@database-schemaname
连接到我的 Oracle 数据库。
现在我想将此命令生成的输出(在它下降到 SQL 提示符之前)保存在一个临时文件中,然后 grep / 从该文件中查找字符串“已连接到”以查看连接是否正常。
谁能帮我捕捉输出并摆脱该提示并测试连接是否正常?
【问题讨论】:
#!/bin/sh
echo "exit" | sqlplus -S -L uid/pwd@dbname
if [ $? -eq 0 ]
then
echo "OK"
else
echo "NOT OK"
fi
对于连接验证,-S 就足够了。
“静默”模式不会阻止终端输出。它所做的只是:
-S Sets silent mode which suppresses the display of
the SQL*Plus banner, prompts, and echoing of
commands.
如果您想抑制所有终端输出,那么您需要执行以下操作:
sqlplus ... > /dev/null 2>&1
【讨论】:
这是我的 docker 容器等到 DB 准备就绪的单线:
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
所以它基本上使用幻数进行选择并检查是否实际返回了正确的数字。
【讨论】:
建议的解决方案都不适合我,因为我的脚本是在运行多个国家/地区的机器上执行的,具有不同的语言环境,我不能简单地检查一个字符串,因为另一台机器上的这个字符串被翻译成另一种语言.作为解决方案,我正在使用 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"
【讨论】:
使用这样的脚本:
#!/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 的输出,我们不需要,因为在这种情况下,结果是通过 $? 访问的)
【讨论】:
这是一个不错的选择,它不会在命令行上公开密码
#!/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
【讨论】:
#! /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。
【讨论】:
#!/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
【讨论】:
您可以通过以下方式避免 SQL 提示:
sqlplus uid/pwd@database-schemaname < /dev/null
SqlPlus 立即退出。
现在只需将上面的输出 grep 为:
if sqlplus uid/pwd@database-schemaname < /dev/null | grep 'Connected to'; then
# have connectivity to Oracle
else
# No connectivity
fi
【讨论】: