Ad Widget

Collapse

ODBC монитор MySQL

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • hAh0L13
    Junior Member
    • Nov 2018
    • 9

    #1

    ODBC монитор MySQL

    Приветствую

    Возникла необходимость считать количество новых данных в одной из таблиц MySQL на удаленном сервере. Для этого используется запрос
    Code:
    SELECT count(*) FROM <database>.<table> WHERE datetime_local >= DATE_SUB(NOW(), INTERVAL 1 HOUR) AND datetime_local < now()
    Вводные:
    Zabbix Server 4.0.4, Ubuntu 18.04, ODBC установлен + коннектор с сайта MySQL:
    Code:
    sudo -H -u zabbix isql tomsk
    +---------------------------------------+
    | Connected!                            |
    |                                       |
    | sql-statement                         |
    | help [tablename]                      |
    | quit                                  |
    |                                       |
    +---------------------------------------+
    SQL> quit
    Zabbix Proxy 4.0.4, Debian 9, ODBC установлен + коннектор с сайта MySQL:
    Code:
    runuser -u zabbix isql tomsk
    +---------------------------------------+
    | Connected!                            |
    |                                       |
    | sql-statement                         |
    | help [tablename]                      |
    | quit                                  |
    |                                       |
    +---------------------------------------+
    SQL> quit
    Windows Server 2012 с MySQL 5.

    Первый раз, когда я сделал db.odbc.select[count,tomsk], я забыл настроить на прокси ODBC. Удалил элемент данных, поставил ODBC, создал элемент данных заново. Но этот элемент висит в очереди:
    20.02.2019 22:56:01 12ч 15м 48с Zabbix proxy: SRV_Tomsk
    В логах ничего нет про это, Timeout на всех участниках выставлен в 30. Что я делаю не так?
    Last edited by hAh0L13; 21-02-2019, 08:46.
  • AvaTTaR
    Member
    • Dec 2018
    • 96

    #2
    какая версия UnixODBC?
    настройки из odbc.ini и odbcinst.ini ?
    результаты комманд env и sudo su zabbix env ?

    Могу сразу рекомендовать заменить коннектор MySQL на коннектор MaiaDB : https://downloads.mariadb.com/Connectors/odbc/latest/
    Я сильно настрадался с odbc к мускулу, то кодировка ложилась, то неполный результат запроса приходил, то сервер заббикса падал, от Девиарта хорошо работает, но он платный, так что мария оказалась лучшим вариантом для заббикса.

    В конфиг odbcinst добавить:
    [mariadb]
    Description = ODBC for MariaDB
    Driver = /usr/lib/libmaodbc.so
    в odbc :
    Driver = mariadb
    Socket = /var/run/mysqld/mysqld.sock

    Comment

    • AvaTTaR
      Member
      • Dec 2018
      • 96

      #3
      а, ещё попробуйте 2 вещи:
      ввести учётные данные на странице настройки элемента данных
      попробовать в конце селекта поставить ;

      Comment

      • hAh0L13
        Junior Member
        • Nov 2018
        • 9

        #4
        Code:
        zabbix-proxy# apt list unixodbc
        Listing... Done
        unixodbc/stable,now 2.3.4-1 amd64 [installed]
        и
        Code:
        zabbix# apt list unixodbc
        Вывод списка… Готово
        unixodbc/bionic,now 2.3.4-1.1ubuntu3 amd64 [установлен]
        Базы, к которым хочу делать селекты, именно MySQL на Windows Server 2008 R2 - 2012. Или коннектор машки работает и с чистым мускулом нормально?

        Code:
        zabbix-proxy# cat /etc/odbcinst.ini
        [MySQL ODBC 8.0 Driver]
        Driver=/usr/local/lib/libmyodbc8w.so
        UsageCount=1
        
        [MySQL ODBC 8.0]
        Driver=/usr/local/lib/libmyodbc8a.so
        UsageCount=1
        
        root@debian9:/var/log/zabbix-proxy# cat /etc/odbc.ini
        [buryatiya]
        Description=MySQL
        Driver=MySQL ODBC 8.0 Driver
        Database=<db>
        Server=<ip>
        User=<user>
        Password=<pass>
        Port=3306
        
        [tomsk]
        Description=MySQL
        Driver=MySQL ODBC 8.0 Driver
        Database=<db>
        Server=<ip>
        User=<user>
        Password=<pass>
        Port=3306
        
        [krasnodar]
        Description=MySQL
        Driver=MySQL ODBC 8.0 Driver
        Database=<db>
        Server=<ip>
        User=<user>
        Password=<pass>
        Port=3306
        
        [barnaul]
        Driver=MySQL ODBC 8.0 Driver
        SERVER=<ip>
        UID=<user>
        PWD=<pass>
        DATABASE=<db>
        PORT=3306
        На сервере Заббикса файлы такие же, все копипастом сделано.

        Точку с запятой поставил, наблюдаю. Если не поможет в ближайшее время, попробую УЗ ввести в настройке элемента данных

        Насчет socket - как я понял мурзилку, это требуется только в случае локальной базы
        Last edited by hAh0L13; 22-02-2019, 05:23.

        Comment

        • AvaTTaR
          Member
          • Dec 2018
          • 96

          #5
          Да, кстати, забыл что Вы не с локальной базой работает, возможно стоит попробовать заглушить фаервол на обоих концах и проверить как себя поведёт. с ходу не вижу проблем в Вашей конфигурации, вроде всё ок, но всё же попробуйте закинуть драйвер от марии, там просто закинуть библиотеку и поменять путь к ней в odbcinst, быть может это сразу решит проблему. В общем пишите по результатам, будем думать дальше, odbc моё личное проклятие, не могу Вас бросить с ним)))

          Comment

          • hAh0L13
            Junior Member
            • Nov 2018
            • 9

            #6
            С коннектором машки:
            Code:
            isql tomsk
            [ISQL]ERROR: Could not SQLConnect
            С коннектором мускуля:
            Code:
            isql tomsk
            +---------------------------------------+
            | Connected!                            |
            |                                       |
            | sql-statement                         |
            | help [tablename]                      |
            | quit                                  |
            |                                       |
            +---------------------------------------+
            SQL>
            Ну и как видно по успешному коннекту, дело не в файерволле
            Code:
            telnet <ip> 3306
            Trying <ip>...
            Connected to <ip>.
            Escape character is '^]'.
            I
            5.7.9

            Comment

            • AvaTTaR
              Member
              • Dec 2018
              • 96

              #7
              попробуйте с коннектором Марии добавить ключ -v при выполнении- покажет дескриптор ошибки, скорее всего он ругается на учётные данные, попробуйте их ввести вручную, а не через конфиг.

              Ещё было бы хорошо отловить выполняемый запрос на стороне mysql-сервера, можно каким-нибудь phpmyadmin, что бы убедиться что он исполняется при запросе от заббикса. И покажите что вообще возвращает isql при выполнении данного скрипта через него

              Comment

              • hAh0L13
                Junior Member
                • Nov 2018
                • 9

                #8
                Все установлено корректно, однако вот:
                Code:
                isql -v tomsk
                [01000][unixODBC][Driver Manager]Can't open lib '/usr/local/lib/libmaodbc.so' : file not found
                [ISQL]ERROR: Could not SQLConnect
                root@debian9:/usr/local/lib# ls -la /usr/local/lib/
                total 22604
                drwxrwsr-x  6 root staff    4096 Feb 22 13:50 .
                drwxrwsr-x 11 root staff    4096 Jan 22 09:23 ..
                drwxr-sr-x  2 root staff    4096 Jan 22 14:49 ipsec
                -rw-r--r--  1 7161 31415 2251352 Aug  2  2018 libmaodbc.so
                -rw-r--r--  1 7161 31415 7392512 Jan 28 07:42 libmyodbc8a.so
                -rw-r--r--  1 7161 31415 6064096 Jan 28 07:43 libmyodbc8S.so
                -rw-r--r--  1 7161 31415 7409576 Jan 28 07:42 libmyodbc8w.so
                drwxr-xr-x  3 root root     4096 Feb 22 13:50 mariadb
                drwxrwsr-x  4 root staff    4096 Nov 15 07:06 python2.7
                drwxrwsr-x  3 root staff    4096 Apr 24  2018 python3.5
                Коннектор мускуля:
                Code:
                echo "SELECT count(*) FROM <db>.<table> WHERE datetime_local >= DATE_SUB(NOW(), INTERVAL 1 HOUR) AND datetime_local < now()" | runuser -u zabbix isql tomsk
                +---------------------------------------+
                | Connected!                            |
                |                                       |
                | sql-statement                         |
                | help [tablename]                      |
                | quit                                  |
                |                                       |
                +---------------------------------------+
                SQL> SELECT count(*) FROM <db>.<table> WHERE datetime_local >= DATE_SUB(NOW(), INTERVAL 1 HOUR) AND datetime_local < now()
                +---------------------+
                | count(*)            |
                +---------------------+
                | 491                 |
                +---------------------+
                SQLRowCount returns 1
                1 rows fetched

                Comment

                • AvaTTaR
                  Member
                  • Dec 2018
                  • 96

                  #9
                  выхлоп ldd libmaodbc.so ?


                  И давайте попробуем немного отсеять вероятные проблемы, попробуйте настроить элемент данных на сервере, обращающийся к локальной БД заббикса, каким-нибудь простеньким запросом типо SELECT COUNT(*) FROM `actions` , если всё ок то попробовать тоже самое через прокси к его локальной БД

                  Comment

                  • hAh0L13
                    Junior Member
                    • Nov 2018
                    • 9

                    #10
                    Code:
                    # ls /usr/local/lib
                    ipsec  libmaodbc.so  libmyodbc8a.so  libmyodbc8S.so  libmyodbc8w.so  mariadb  python2.7  python3.5
                    root@debian9:~# ldd libmaodbc.so
                    ldd: ./libmaodbc.so: No such file or directory
                    root@debian9:~# ldd libmyodbc8w.so
                    ldd: ./libmyodbc8w.so: No such file or directory
                    С базой сложнее - она у нашего заббикса не локальная. Попробую с проксей - там локально. Отпишусь.

                    Comment

                    • AvaTTaR
                      Member
                      • Dec 2018
                      • 96

                      #11
                      Очень странно, что ldd не видит, попробуйте с sudo, такое ощущение что он реально не видит файл, я подумал просто что библиотека может на какой openssl.1.0 ссылается..

                      Comment

                      • Kos
                        Senior Member
                        Zabbix Certified SpecialistZabbix Certified Professional
                        • Aug 2015
                        • 3404

                        #12
                        Originally posted by AvaTTaR
                        Очень странно, что ldd не видит
                        Очевидно же, что ldd не видит файла в текущей директории. А про файл из директории /usr/local/lib у него пользователь, не понимающий, что он делает, не спрашивал.

                        Comment

                        • hAh0L13
                          Junior Member
                          • Nov 2018
                          • 9

                          #13
                          Code:
                          root@debian9:/usr/local/lib# ldd libmaodbc.so
                                  not a dynamic executable
                          root@debian9:/usr/local/lib# ldd libmyodbc8w.so
                                  linux-vdso.so.1 (0x00007ffcd47d7000)
                                  libodbcinst.so.2 => /usr/lib/x86_64-linux-gnu/libodbcinst.so.2 (0x00007efe25c5c000)
                                  libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007efe25a3f000)
                                  librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007efe25837000)
                                  libssl.so.1.1 => /usr/lib/x86_64-linux-gnu/libssl.so.1.1 (0x00007efe255cb000)
                                  libcrypto.so.1.1 => /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 (0x00007efe25132000)
                                  libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007efe24f2e000)
                                  libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007efe24c2a000)
                                  libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007efe248a8000)
                                  libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007efe24691000)
                                  libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007efe242f2000)
                                  /lib64/ld-linux-x86-64.so.2 (0x00007efe26628000)
                                  libltdl.so.7 => /usr/lib/x86_64-linux-gnu/libltdl.so.7 (0x00007efe240e8000)
                          Не пользовался ранее данной утилитой и не погуглил как именно работает. В любом случае, мне кажется тема зашла не туда: вопрос в том, почему при полной работоспособности от имени пользователя заббикс SQL-запросов посредством ODBC, в самом заббиксе такой элемент данных перманентно в очереди? Я не хочу крутить UserParameter при существующей штатно функции

                          Comment

                          • Kos
                            Senior Member
                            Zabbix Certified SpecialistZabbix Certified Professional
                            • Aug 2015
                            • 3404

                            #14
                            Originally posted by hAh0L13
                            В любом случае, мне кажется тема зашла не туда
                            Тут я вас понимаю и полностью согласен, но, к сожалению, ничем помочь не могу :-(

                            Comment

                            • hAh0L13
                              Junior Member
                              • Nov 2018
                              • 9

                              #15
                              Собственно, стоило немного расчехлиться и стало вырисовываться понимание. Это все старая не раз описанная бага, считающаяся багой мускула:
                              Code:
                               11192:20190301:131602.892 In zbx_odbc_connect() dsn:'zbx_prx' user:''
                               11192:20190301:131602.896 Got signal [signal:11(SIGSEGV),reason:1,refaddr:0x60]. Crashing ...

                              https://bugs.mysql.com/bug.php?id=73709
                              На багтрекере мускула было предложение юзать коннектор 5.2.7, переключился на него. А на просторах интернета нашел что коннектор машки версии 3 имеет проблемы, переключился на версию 2. В обоих случаях прямой вызов через
                              Code:
                              echo "select count(*) <db>.<table>;" | runuser -u zabbix isql zbx_prx
                              Работает. В логах пока ничего нет, буду наблюдать

                              UPD Собственно с коннектором мускуля 5.2 тоже падает:
                              Code:
                                4460:20190301:141950.523 End of substitute_key_macros():SUCCEED data:'db.odbc.select[test_count,zbx_prx]'
                                4460:20190301:141950.523 In substitute_simple_macros() data:'select count(*) from hosts;'
                                4460:20190301:141950.523 In substitute_simple_macros() data:EMPTY
                                4460:20190301:141950.523 In substitute_simple_macros() data:EMPTY
                                4460:20190301:141950.523 In get_value() key:'db.odbc.select[test_count,zbx_prx]'
                                4460:20190301:141950.523 In get_value_db() key_orig:'db.odbc.select[test_count,zbx_prx]' query:'select count(*) from hosts;'
                                4460:20190301:141950.523 In zbx_odbc_connect() dsn:'zbx_prx' user:''
                              *** Error in `/usr/sbin/zabbix_proxy: poller #3 [got 4 values in 0.326207 sec, getting values]': free(): invalid pointer: 0x0000558fdaac8888 ***
                              ======= Backtrace: =========
                              /lib/x86_64-linux-gnu/libc.so.6(+0x70bfb)[0x7f628e3c5bfb]
                              /lib/x86_64-linux-gnu/libc.so.6(+0x76fc6)[0x7f628e3cbfc6]
                              /lib/x86_64-linux-gnu/libc.so.6(+0x7780e)[0x7f628e3cc80e]
                              /usr/local/lib/libmyodbc5w.so(MySQLGetPrivateProfileStringW+0x182)[0x7f6272b45017]
                              /usr/local/lib/libmyodbc5w.so(ds_lookup+0x56)[0x7f6272b44ad9]
                              /usr/local/lib/libmyodbc5w.so(MySQLConnect+0xd6)[0x7f6272a9500f]
                              /usr/local/lib/libmyodbc5w.so(SQLConnectW+0x32)[0x7f6272aaceec]
                              /usr/lib/x86_64-linux-gnu/libodbc.so.2(SQLConnect+0x99f)[0x7f62905dd54f]
                              /usr/sbin/zabbix_proxy: poller #3 [got 4 values in 0.326207 sec, getting values](zbx_odbc_connect+0x1ac)[0x558fd9884e93]
                              /usr/sbin/zabbix_proxy: poller #3 [got 4 values in 0.326207 sec, getting values](get_value_db+0x22a)[0x558fd987588c]
                              /usr/sbin/zabbix_proxy: poller #3 [got 4 values in 0.326207 sec, getting values](+0x46880)[0x558fd9865880]
                              /usr/sbin/zabbix_proxy: poller #3 [got 4 values in 0.326207 sec, getting values](+0x48b43)[0x558fd9867b43]
                              /usr/sbin/zabbix_proxy: poller #3 [got 4 values in 0.326207 sec, getting values](poller_thread+0x192)[0x558fd9868bc7]
                              /usr/sbin/zabbix_proxy: poller #3 [got 4 values in 0.326207 sec, getting values](zbx_thread_start+0x37)[0x558fd98fd558]
                              /usr/sbin/zabbix_proxy: poller #3 [got 4 values in 0.326207 sec, getting values](MAIN_ZABBIX_ENTRY+0x8c0)[0x558fd9855912]
                              /usr/sbin/zabbix_proxy: poller #3 [got 4 values in 0.326207 sec, getting values](daemon_start+0x315)[0x558fd98f903c]
                              /usr/sbin/zabbix_proxy: poller #3 [got 4 values in 0.326207 sec, getting values](main+0x2f1)[0x558fd9855050]
                              /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf1)[0x7f628e3752e1]
                              /usr/sbin/zabbix_proxy: poller #3 [got 4 values in 0.326207 sec, getting values](_start+0x2a)[0x558fd985403a]
                              И с коннектором машки тоже:
                              Code:
                              *** Error in `/usr/sbin/zabbix_proxy: poller #2 [got 2 values in 0.291132 sec, getting values]': free(): invalid pointer: 0x000055dc21bf4868 ***
                              ======= Backtrace: =========
                              /lib/x86_64-linux-gnu/libc.so.6(+0x70bfb)[0x7f4d7da88bfb]
                              /lib/x86_64-linux-gnu/libc.so.6(+0x76fc6)[0x7f4d7da8efc6]
                              /lib/x86_64-linux-gnu/libc.so.6(+0x7780e)[0x7f4d7da8f80e]
                              /usr/local/lib/libmaodbc.so(SQLConnectCommon+0x142)[0x7f4d6249b992]
                              /usr/lib/x86_64-linux-gnu/libodbc.so.2(SQLConnect+0x262)[0x7f4d7fc9fe12]
                              /usr/sbin/zabbix_proxy: poller #2 [got 2 values in 0.291132 sec, getting values](zbx_odbc_connect+0x1ac)[0x55dc20b0ae93]
                              /usr/sbin/zabbix_proxy: poller #2 [got 2 values in 0.291132 sec, getting values](get_value_db+0x22a)[0x55dc20afb88c]
                              /usr/sbin/zabbix_proxy: poller #2 [got 2 values in 0.291132 sec, getting values](+0x46880)[0x55dc20aeb880]
                              /usr/sbin/zabbix_proxy: poller #2 [got 2 values in 0.291132 sec, getting values](+0x48b43)[0x55dc20aedb43]
                              /usr/sbin/zabbix_proxy: poller #2 [got 2 values in 0.291132 sec, getting values](poller_thread+0x192)[0x55dc20aeebc7]
                              /usr/sbin/zabbix_proxy: poller #2 [got 2 values in 0.291132 sec, getting values](zbx_thread_start+0x37)[0x55dc20b83558]
                              /usr/sbin/zabbix_proxy: poller #2 [got 2 values in 0.291132 sec, getting values](MAIN_ZABBIX_ENTRY+0x8c0)[0x55dc20adb912]
                              /usr/sbin/zabbix_proxy: poller #2 [got 2 values in 0.291132 sec, getting values](daemon_start+0x315)[0x55dc20b7f03c]
                              /usr/sbin/zabbix_proxy: poller #2 [got 2 values in 0.291132 sec, getting values](main+0x2f1)[0x55dc20adb050]
                              /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf1)[0x7f4d7da382e1]
                              /usr/sbin/zabbix_proxy: poller #2 [got 2 values in 0.291132 sec, getting values](_start+0x2a)[0x55dc20ada03a]
                              Last edited by hAh0L13; 01-03-2019, 13:31.

                              Comment

                              Working...