Ad Widget

Collapse

Проверка доступности базы данных на хост

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • zerstroer
    Junior Member
    • Jul 2009
    • 22

    #1

    Проверка доступности базы данных на хост

    Добрый день.
    Следующий вопрос:
    Имеется хост без установленного на него Zabbix Agent, на этом хосте есть СУБД с открытым портом для внешних подключений. Так же есть в наличии логин и пароль для доступа к базе данных.
    Можно ли в этом случае без установленного Zabbix-агента мониторить доступность базы данных?
  • Jimson
    Senior Member
    • Jan 2008
    • 1327

    #2
    Если "доступность" это возможность залогиниться, то воспользуйтесь "внешними проверками".

    Comment

    • yukra
      Senior Member
      • Apr 2013
      • 1359

      #3
      1) Можно мониторить просто внешней проверкой доступность порта (логин\пароль не нужен).
      2) Можно скриптом типа такого
      Code:
      mysql  --skip-column-names -s --connect-timeout=3 -uLOGIN -pPASSWORD -h IP -e "select 1" 2> /dev/null || echo 0
      Если БД доступна и залогиниться уладость то выведет 1, иначе 0. Пример естественно для mysql, но наверно для Вашей БД можно сделать аналогично
      3) Говорят в zabbix'е есть ODBC, но так же говорят что он не айс. Сам не видел его никогда.

      Comment

      • zerstroer
        Junior Member
        • Jul 2009
        • 22

        #4
        Originally posted by yukra
        1) Можно мониторить просто внешней проверкой доступность порта (логин\пароль не нужен).
        2) Можно скриптом типа такого
        Code:
        mysql  --skip-column-names -s --connect-timeout=3 -ulogin -ppassword -h ip -e "select 1" 2> /dev/null || echo 0
        Если БД доступна и залогиниться уладость то выведет 1, иначе 0. Пример естественно для mysql, но наверно для Вашей БД можно сделать аналогично
        3) Говорят в zabbix'е есть odbc, но так же говорят что он не айс. Сам не видел его никогда.
        Мониторинг простой проверкой уже осуществляется, но тем не менее, необходимо удостоверяться в том, что в базу можно зайти по логину паролю.

        Comment

        • andreysan
          Member
          • Dec 2009
          • 34

          #5
          А дополнительно использовать ключ --database=NameBase нельзя ???
          например
          mysql --skip-column-names -s --connect-timeout=3 -ulogin -ppassword --database=NameBase -h ip -e "select 1" 2> /dev/null || echo 0


          Это вроде то , что Вам нужно, если я правильно понял вопрос.

          Comment

          • zerstroer
            Junior Member
            • Jul 2009
            • 22

            #6
            Originally posted by andreysan
            А дополнительно использовать ключ --database=namebase нельзя ???
            например
            mysql --skip-column-names -s --connect-timeout=3 -ulogin -ppassword --database=namebase -h ip -e "select 1" 2> /dev/null || echo 0


            Это вроде то , что Вам нужно, если я правильно понял вопрос.
            Да, спасибо вам. Это именно то, что нужно. Я как раз разобрался с использованием внешних скриптов.

            Comment

            • zerstroer
              Junior Member
              • Jul 2009
              • 22

              #7
              Итог

              В конечном итоге, для решения своей задачи по мониторингу БД Oracle я использовал следующий скрипт собственного сочинения (прошу прощения, если там неточности - на bash писал впервые):
              #!bin/sh
              export LD_LIBRARY_PATH=/opt/oracle/instantclient_12_1/
              if [ "$#" -eq 2 ]; then
              if echo 'select 1 from user_tables;' | /opt/oracle/instantclient_12_1/./sqlplus testconnect/testconnect@'(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=( PROTOCOL=TCP)(HOST='"$1"')(PORT='"$2"')))(CONNECT_ DATA=(SID=amp)))' | grep -wq 'rows selected' >> /dev/null ;
              then echo 1
              else echo 0
              fi
              else echo 0
              fi

              Comment

              • yukra
                Senior Member
                • Apr 2013
                • 1359

                #8
                Originally posted by zerstroer
                В конечном итоге, для решения своей задачи по мониторингу БД oracle я использовал следующий скрипт собственного сочинения (прошу прощения, если там неточности - на bash писал впервые):
                #!bin/sh
                export ld_library_path=/opt/oracle/instantclient_12_1/
                if [ "$#" -eq 2 ]; then
                if echo 'select 1 from user_tables;' | /opt/oracle/instantclient_12_1/./sqlplus testconnect/testconnect@'(description=(address_list=(address=( protocol=tcp)(host='"$1"')(port='"$2"')))(connect_ data=(sid=amp)))' | grep -wq 'rows selected' >> /dev/null ;
                then echo 1
                else echo 0
                fi
                else echo 0
                fi
                1) Предлагаю использовать тэг [code] для удобства.
                2) Предлагаю упростить скрипт до такого:
                Code:
                #!bin/sh
                set -o pipefail
                export LD_LIBRARY_PATH=/opt/oracle/instantclient_12_1/
                PORT=номер_порта_по_умолчанию
                if [ "$#" -eq 2 ]; then
                	PORT= $2
                fi
                
                echo 'select 1 from user_tables;' | /opt/oracle/instantclient_12_1/./sqlplus testconnect/testconnect@'(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST='"$1"')(PORT='"$PORT"')))(CONNECT_DATA=(SID=amp)))' | grep -wq 'rows selected' >> /dev/null || echo 0
                Или даже такого (при условии что /opt/oracle/instantclient_12_1/./sqlplus "правильно" отдает код возврата.
                Code:
                #!bin/sh
                set -o pipefail
                export LD_LIBRARY_PATH=/opt/oracle/instantclient_12_1/
                PORT=номер_порта_по_умолчанию
                if [ "$#" -eq 2 ]; then
                	PORT= $2
                fi
                
                echo 'select 1 from user_tables;' | /opt/oracle/instantclient_12_1/./sqlplus testconnect/testconnect@'(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST='"$1"')(PORT='"$PORT"')))(CONNECT_DATA=(SID=amp)))'  >> /dev/null || echo 0

                Comment

                • zerstroer
                  Junior Member
                  • Jul 2009
                  • 22

                  #9
                  Спасибо, большое, yukra!
                  Я на bash не писал, поэтому у меня возникли вопросы:
                  1. Что делает set -o pipefail?
                  2. Вернет ли ваш вариант скрипта '1' если все отрабатывается корректно?

                  Comment

                  • yukra
                    Senior Member
                    • Apr 2013
                    • 1359

                    #10
                    Originally posted by zerstroer
                    Спасибо, большое, yukra!
                    Я на bash не писал, поэтому у меня возникли вопросы:
                    1. Что делает set -o pipefail?
                    2. Вернет ли ваш вариант скрипта '1' если все отрабатывается корректно?
                    По умолчанию код возврата "пайпа" равен коду возврата последней команды в пайпе.
                    "set -o pipefail" значит следующее: если несколько команд выполняются по очереди и передают результат через пайп друг другу, и код возврата хотя бы одной команды в пайпе не равен нулю, то код возврата "пайпа" тоже не равен нулю.

                    Оператор || значит: если выражение слева вернуло не ноль, то выполнить выражение справа.

                    Пример:
                    Code:
                    ykurilkin@duty-shift~$ echo 1 | ls /root/ 2>/dev/null | cat || echo "bad"
                    ykurilkin@duty-shift~$
                    у текущего пользователя нет прав на чтение /root/, но поскольку в конце была команда cat, и она отработала удачно (хоть и в пустую), то код возврата вот этого "echo 1 | ls /root/ 2>/dev/null | cat" равен нулю. Поэтому условие || не выполнилось.
                    Соответственно правильно будет так:
                    Code:
                    ykurilkin@duty-shift~$ set -o pipefail
                    ykurilkin@duty-shift~$ echo 1 | ls /root/ 2>/dev/null | cat || echo "bad"
                    bad
                    ykurilkin@duty-shift~$
                    Тут команда "ls /root/ 2>/dev/null" вернула не ноль, поскольку выше было "set -o pipefail" то и вся цепочка команд "echo 1 | ls /root/ 2>/dev/null | cat " вернула не ноль, а значит срабатывает условие || и выполняется 'echo "bad"'.

                    А теперь собственно ответ на вопрос "Вернет ли ваш вариант скрипта '1' если все отрабатывается корректно?": не знаю. Это зависит от как /opt/oracle/instantclient_12_1/./sqlplus (кстати зачем точка в середине пути?) работает с кодом возврата. Если работает правильно (нулевой код при удачном выполнении и не нулевой при любом неудачном выполнении), то скрипт вернет результат выполнения команды
                    Code:
                    echo 'select 1 from user_tables;' | /opt/oracle/instantclient_12_1/./sqlplus testconnect/testconnect@'(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST='"$1"')(PORT='"$PORT"')))(CONNECT_DATA=(SID=amp)))'
                    , либо ноль в случае проблемы. Что такое sqlplus я к сожалению не знаю и с ораклом вообще никогда не работал.

                    Comment

                    • zerstroer
                      Junior Member
                      • Jul 2009
                      • 22

                      #11
                      sqlplus с кодом возврата не работает. В случае удачного или неудачного выполнения SQL-запроса - он возвращает строки разного содержания. При удачном запросе в этой строке я ищу подстроку 'rows selected' (т.к. был SQL запрос типа select). Очевидно, что в этом случае мне придется организовывать вывод результата явно, через if ... echo 0/1. К тому же, мне этот вариант кажется более наглядным, хотя, судя по всему, он и не является true linux way.
                      Точка в середине пути оказалась лишняя, вы правы.

                      Мои вариант скрипта для мониторинга СУБД Oracle, на текущий момент такой:
                      Code:
                      #!/bin/sh
                      export LD_LIBRARY_PATH=/opt/oracle/instantclient_12_1/
                      PORT=1521
                      if [ "$#" -eq 2 ]; then
                        PORT=$2
                      fi
                      if echo 'select 1 from user_tables;' | /opt/oracle/instantclient_12_1/sqlplus testconnect/testconnect@'(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST='"$1"')(PORT='"$PORT"')))(CONNECT_DATA=(SID=amp)))' | grep -wq 'rows selected' >> /dev/null;
                      then echo 1
                      else echo 0
                      fi
                      Last edited by zerstroer; 06-11-2013, 07:07.

                      Comment

                      Working...