检查数据库连通性

问题描述

我正在编写一个 unix 脚本来检查服务器中的数据库连接。当我的数据库连接出错或连接到数据库时观察到延迟时,我希望输出为“未连接”。如果它已连接,我的输出应为“已连接”。这是一个 Oracle 数据库

数据库连接出现延迟时,我的代码无法运行并且我的脚本挂起。我应该对我的代码进行哪些更改,以便它能够处理这两种情况(当我连接到数据库时出现错误时以及在连接到数据库时观察到延迟时)??

if sqlplus $DB_USER/$DB_PASS@$DB_INSTANCE< /dev/null | grep 'Connected to'; then
echo "Connectivity is OK"
else
echo "No Connectivity"
fi

解决方法

添加到代码中的第一件事是超时。检查数据库连接并不容易,连接经过的各个层中可能存在各种问题。超时使您可以选择中断挂起的会话并继续执行任务并报告连接失败。

googleFu 给了我几个很好的例子: Timeout a command in bash without unnecessary delay

,

如果您使用的是 Linux,则可以使用 timeout 命令执行您想要的操作。所以下面会有三个结果,设置变量RC如下:

  1. “连接到”成功:RC 设置为 0
  2. 未找到“已连接到”:RC 设置为 1
  3. sqlplus 命令在 5 分钟后超时:RC 设置为 124
WAIT_MINUTES=5
SP_OUTPUT=$(timeout ${WAIT_MINUTES}m sqlplus $DB_USER/$DB_PASS@$DB_INSTANCE < /dev/null )
CMD_RC=$?
    
if [ $CMD_RC -eq 124 ]
then
        ERR_MSG="Connection attempt timed out after $WAIT_MINUES minutes"
        RC=$CMD_RC
else
        echo $SP_OUTPUT | grep -q 'Connected to'
        GREP_RC=$?
        if [ $GREP_RC -eq 0 ]
        then
            echo "Connectivity is OK"
            RC=0
        else
            ERR_MSG="Connectivity or user information is bad"
            RC=1
        fi
fi

if [ $RC -gt 0 ]
then
        # Add code to send email with subject of $ERR_MSG and body of $SP_OUTPUT
        echo Need to email someone about $ERR_MSG
fi

exit $RC

我确信这方面有一些改进,但这会让你开始。

简而言之,我们使用timeout命令来等待sqlplus命令运行的指定时间。我将 grep 作为单独的命令分开,以允许使用 timeout 并允许更灵活地检查其他文本消息。

StackOverflow 上有 several examples 关于从 Linux 脚本发送电子邮件的内容。