【问题标题】:Check database connectivity using Shell script使用 Shell 脚本检查数据库连接
【发布时间】:2011-04-16 07:50:10
【问题描述】:

我正在尝试编写一个 shell 脚本来检查数据库连接。在我的脚本中,我正在使用命令

sqlplus uid/pwd@database-schemaname

连接到我的 Oracle 数据库。

现在我想将此命令生成的输出(在它下降到 SQL 提示符之前)保存在一个临时文件中,然后 grep / 从该文件中查找字符串“已连接到”以查看连接是否正常。

谁能帮我捕捉输出并摆脱该提示并测试连接是否正常?

【问题讨论】:

    标签: database linux shell


    【解决方案1】:
    #!/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
    

    【讨论】:

      【解决方案2】:

      这是我的 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
      

      所以它基本上使用幻数进行选择并检查是否实际返回了正确的数字。

      【讨论】:

        【解决方案3】:

        建议的解决方案都不适合我,因为我的脚本是在运行多个国家/地区的机器上执行的,具有不同的语言环境,我不能简单地检查一个字符串,因为另一台机器上的这个字符串被翻译成另一种语言.作为解决方案,我正在使用 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"
        

        【讨论】:

          【解决方案4】:

          使用这样的脚本:

          #!/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 的输出,我们不需要,因为在这种情况下,结果是通过 $? 访问的)

          【讨论】:

          • 非常感谢大家的意见......是的,我那天自己试过了,但是回复有点晚了。
          【解决方案5】:

          这是一个不错的选择,它不会在命令行上公开密码

          #!/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
          

          【讨论】:

            【解决方案6】:
            #! /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。

            【讨论】:

            • 感谢 Frayser 的回答。
            【解决方案7】:
            #!/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 
            

            【讨论】:

            • 感谢 iddqd 的回答。
            【解决方案8】:

            您可以通过以下方式避免 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
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-05-18
              • 2015-03-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-08-17
              相关资源
              最近更新 更多