【问题标题】:Check database connectivity检查数据库连接
【发布时间】:2021-08-17 01:55:10
【问题描述】:

我正在编写一个 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

【问题讨论】:

  • 那么,它挂了多长时间? 10秒? 10分钟?这里有几个关于检查Oracle数据库状态的问题;他们中的大多数人基本上说“这并不容易”但是您可以通过tnsping 命令进行快速但不完全准确的检查。这只是说明数据库的侦听器是否可访问。
  • 即使一个简单的连接工作正常,数据库也可能有任何问题。但是对于一个简单的检查来说就足够了,这取决于要求。我对unix批处理知之甚少,但您至少需要两个进程:一个作为观察者,它需要时间并在需要时杀死另一个,另一个尝试连接。我会在 python、lazarus 或类似的东西中这样做。但可能也可以通过批处理。
  • @Mark Stewart 我希望在数据库未连接超过 5 分钟时触发邮件。我应该如何修改我的代码??
  • 您使用哪种风格的 Unix/Linux shell 脚本语言? kshbash 或其他?请edit您的问题并将 [unix] 标记替换为适当的脚本语言,或将该信息添加到您的问题文本中。

标签: database oracle shell unix scripting


【解决方案1】:

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

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

【讨论】:

  • 你能给我我应该实现的代码吗??
【解决方案2】:

如果你使用的是 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 脚本发送电子邮件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 2012-08-17
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多