[comment]: # ({68c88a1c-68c88a1c})
# 14 Monitoramento ODBC

[comment]: # ({/68c88a1c-68c88a1c})

[comment]: # ({c62c1e4d-b5170fd3})
#### Visão geral

O monitoramento ODBC corresponde ao tipo de item **Database monitor** no frontend do Zabbix.

ODBC é uma API de middleware da linguagem de programação C para acessar sistemas de gerenciamento de banco de dados (DBMS).
O conceito de ODBC foi desenvolvido pela Microsoft e posteriormente portado para outras plataformas.

O Zabbix pode consultar qualquer banco de dados compatível com ODBC.
Para isso, o Zabbix não se conecta diretamente aos bancos de dados, mas usa a interface ODBC e os drivers configurados no ODBC.
Isso permite um monitoramento mais eficiente de diferentes bancos de dados para múltiplos propósitos (por exemplo, verificar filas específicas do banco de dados, estatísticas de uso etc.).

O Zabbix oferece suporte ao unixODBC, que é uma das implementações de API ODBC de código aberto mais comumente usadas.

::: noteimportant
Veja também: [problemas conhecidos](/manual/installation/known_issues#odbc-checks) para verificações ODBC.
:::

[comment]: # ({/c62c1e4d-b5170fd3})

[comment]: # ({47a0f71f-bf6fd8ba})
#### Instalando o unixODBC

A maneira recomendada de instalar o unixODBC é usar os repositórios de pacotes padrão do sistema operacional Linux.
Nas distribuições Linux mais populares, o unixODBC está incluído no repositório de pacotes por padrão.
Se os pacotes não estiverem disponíveis, os arquivos-fonte podem ser obtidos na página inicial do unixODBC: <http://www.unixodbc.org/download.html>.

Para instalar o unixODBC, use o gerenciador de pacotes do sistema de sua escolha:

```bash
# Para sistemas Ubuntu/Debian:
apt install unixodbc unixodbc-dev

# Para sistemas baseados em RedHat/Fedora:
dnf install unixODBC unixODBC-devel

# Para sistemas baseados em SUSE:
zypper in unixODBC-devel
```

::: noteimportant
O pacote `unixodbc-dev` ou `unixODBC-devel` é necessário para compilar o Zabbix com suporte ao unixODBC.
Para habilitar o suporte ODBC, o Zabbix deve ser compilado com a seguinte [opção de configuração](/manual/installation/install/sources#configure-the-sources):
<br><br>

    --with-unixodbc[=ARG] # Use ODBC driver against unixODBC package.

:::

[comment]: # ({/47a0f71f-bf6fd8ba})

[comment]: # ({07af6a39-eea09ed7})
#### Instalando drivers unixODBC

O driver de banco de dados unixODBC deve ser instalado para o banco de dados que será monitorado.
Para uma lista de bancos de dados e drivers suportados, consulte a página inicial do unixODBC: <http://www.unixodbc.org/drivers.html>.

::: noteclassic
Em algumas distribuições Linux, os drivers de banco de dados estão incluídos nos repositórios de pacotes.
:::

[comment]: # ({/07af6a39-eea09ed7})

[comment]: # ({d49fdb52-e1911043})
##### MySQL

Para instalar o driver de banco de dados MySQL unixODBC, use o gerenciador de pacotes para o sistema de sua escolha:

```bash
# Para sistemas Ubuntu/Debian:
apt install odbc-mariadb

# Para sistemas baseados em RedHat/Fedora:
dnf install mariadb-connector-odbc

# Para sistemas baseados em SUSE:
zypper install mariadb-connector-odbc
```

Para instalar o driver de banco de dados sem um gerenciador de pacotes, consulte a [documentação do MySQL](https://dev.mysql.com/downloads/connector/odbc/) para `mysql-connector-odbc`, ou a [documentação do MariaDB](https://mariadb.com/kb/en/mariadb-connector-odbc/) para `mariadb-connector-odbc`.

[comment]: # ({/d49fdb52-e1911043})

[comment]: # ({1b513583-0842efba})
##### PostgreSQL

Para instalar o driver de banco de dados PostgreSQL unixODBC, use o gerenciador de pacotes para o sistema de sua escolha:

```bash
# Para sistemas Ubuntu/Debian:
apt install odbc-postgresql

# Para sistemas baseados em RedHat/Fedora:
dnf install postgresql-odbc

# Para sistemas baseados em SUSE:
zypper install psqlODBC
```

Para instalar o driver de banco de dados sem um gerenciador de pacotes, consulte a [documentação do PostgreSQL](https://www.postgresql.org/download/linux/).

[comment]: # ({/1b513583-0842efba})

[comment]: # ({b4e6cb7e-88097de9})
##### Oracle

Para instalar o driver de banco de dados unixODBC, consulte a [documentação da Oracle](https://www.oracle.com/database/technologies/releasenote-odbc-ic.html).

[comment]: # ({/b4e6cb7e-88097de9})

[comment]: # ({0a04e88d-f1ce859d})
##### MSSQL

Para instalar o driver de banco de dados MSSQL unixODBC, use o gerenciador de pacotes para o sistema de sua escolha:

```bash
# Para sistemas Ubuntu/Debian:
apt install tdsodbc

# Para sistemas baseados em RedHat/Fedora (pacotes EPEL: https://docs.fedoraproject.org/en-US/epel/):
dnf install epel-release
dnf install freetds

# Para sistemas baseados em SUSE:
zypper install libtdsodbc0
```

Para instalar o driver de banco de dados sem um gerenciador de pacotes, consulte o [Guia do usuário do FreeTDS](http://www.freetds.org/userguide/).

[comment]: # ({/0a04e88d-f1ce859d})

[comment]: # ({f24fde2e-b15e771b})
#### Configurando o unixODBC

Para configurar o unixODBC, você deve editar os arquivos `odbcinst.ini` e `odbc.ini`.
Você pode verificar a localização desses arquivos executando o seguinte comando:

```bash
odbcinst -j
```

O resultado do comando deve conter informações semelhantes ao seguinte:

```bash
unixODBC 2.3.9
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
```

[comment]: # ({/f24fde2e-b15e771b})

[comment]: # ({72609b6e-d99c28e7})
##### odbcinst.ini

O arquivo `odbcinst.ini` lista os drivers de banco de dados ODBC instalados.
Se `odbcinst.ini` estiver ausente, é necessário criá-lo manualmente.

```ini
[TEST_MYSQL]
Description=ODBC for MySQL
Driver=/usr/lib/libmyodbc5.so
FileUsage=1
```

|Parâmetro|Descrição|
|--|--------|
|TEST_MYSQL|Nome do driver do banco de dados.|
|Description|Descrição do driver do banco de dados.|
|Driver|Localização da biblioteca do driver do banco de dados.|
|FileUsage|Determina se o driver do banco de dados suporta conexão a um servidor de banco de dados sem suporte para acesso a arquivos locais (0); suporta leitura de dados de arquivos (1); suporta gravação de dados em arquivos (2).|
|Threading|Nível de serialização de threads. Suportado para PostgreSQL.<br>Desde a 1.6, se o gerenciador de drivers for compilado com suporte a threads, você pode adicionar outra entrada de driver.|

[comment]: # ({/72609b6e-d99c28e7})

[comment]: # ({f10754c8-207ccff7})
##### odbc.ini

O arquivo `odbc.ini` é usado para configurar fontes de dados.
Observe que a lista de parâmetros suportados depende do driver do banco de dados (por exemplo, bancos de dados Oracle podem usar ServerName em vez de Server, etc.).

```ini
[TEST_MYSQL]
Description=MySQL Test Database
Driver=mysql
Server=127.0.0.1
User=root
Password=
Port=3306
Socket=
Database=zabbix
```

|Parâmetro|Descrição|
|--|--------|
|TEST_MYSQL|Nome da fonte de dados (DSN).|
|Description|Descrição da fonte de dados.|
|Driver|Nome do driver do banco de dados (conforme especificado em `odbcinst.ini`).|
|Server|IP/DNS do servidor de banco de dados.|
|User|Usuário do banco de dados para conexão.|
|Password|Senha do usuário do banco de dados.|
|Port|Porta de conexão do banco de dados.|
|Socket|Socket de conexão do banco de dados.|
|Database|Nome do banco de dados.|

Para outras opções possíveis de parâmetros de configuração, consulte a [documentação do MySQL](https://dev.mysql.com/doc/connector-odbc/en/connector-odbc-configuration-connection-parameters.html).

[comment]: # ({/f10754c8-207ccff7})

[comment]: # ({e0fd367c-fed5e483})
O arquivo `odbc.ini` para PostgreSQL pode conter parâmetros adicionais:

```ini
[TEST_PSQL]
Description=PostgreSQL Test Database
Driver=postgresql
Username=zbx_test
Password=zabbix
Servername=127.0.0.1
Database=zabbix
Port=5432
ReadOnly=No
Protocol=8.0+
ShowOidColumn=No
FakeOidIndex=No
RowVersioning=No
ShowSystemTables=No
Fetch=Yes
BoolsAsChar=Yes
SSLmode=Require
ConnSettings=
```

|Parâmetro|Descrição|
|--|--------|
|ReadOnly|Especifica se a conexão com o banco de dados permite apenas operações de leitura (consultas `SELECT`) e restringe modificações (comandos `INSERT`, `UPDATE` e `DELETE`); útil para cenários em que os dados devem permanecer inalterados.|
|Protocol|Versão do protocolo backend do PostgreSQL (ignorado ao usar conexões SSL).|
|ShowOidColumn|Especifica se deve incluir o Object ID (OID) em SQLColumns.|
|FakeOidIndex|Especifica se deve criar um índice único falso no OID.|
|RowVersioning|Especifica se deve permitir que aplicativos detectem se os dados foram modificados por outros usuários enquanto você está tentando atualizar uma linha. Observe que este parâmetro pode acelerar o processo de atualização, pois, para atualizar uma linha, não é necessário especificar todas as colunas na cláusula `WHERE`.|
|ShowSystemTables|Especifica se o driver do banco de dados deve tratar tabelas de sistema como tabelas regulares em SQLTables; útil para acessibilidade, permitindo visibilidade nas tabelas de sistema.|
|Fetch|Especifica se o driver deve usar automaticamente declare cursor/fetch para lidar com instruções `SELECT` e manter um cache de 100 linhas.|
|BoolsAsChar|Controla o mapeamento de tipos Booleanos.<br>Se definido como "Yes", Bools são mapeados para `SQL_CHAR`; caso contrário, são mapeados para `SQL_BIT`.|
|SSLmode|Especifica o modo SSL para a conexão.|
|ConnSettings|Configurações adicionais enviadas para o backend na conexão.|

[comment]: # ({/e0fd367c-fed5e483})

[comment]: # ({2e87263e-93c68b7f})
##### Testando a conexão ODBC

Para testar se a conexão ODBC está funcionando corretamente, você pode usar o utilitário `isql` (incluído no pacote `unixODBC`):

```bash
isql test
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
```

[comment]: # ({/2e87263e-93c68b7f})

[comment]: # ({458da043-ca784f43})
#### Configuração de item no frontend do Zabbix

Configure um [item](/manual/config/items/item#overview) de **Monitoramento de banco de dados**.

![](../../../../../assets/en/manual/config/items/itemtypes/db_monitor.png){width="600"}

Todos os campos obrigatórios estão marcados com um asterisco vermelho.

Para itens de monitoramento de banco de dados, você deve especificar:

|   |   |
|--|--------|
|*Tipo*|Selecione "Monitoramento de banco de dados" aqui.|
|*Chave*|Insira uma das chaves de item suportadas:<br>[**db.odbc.select[]**](#db.odbc.select) - este item retorna um valor (a primeira coluna da primeira linha do resultado da consulta SQL);<br>[**db.odbc.get[]**](#db.odbc.get) - este item retorna várias linhas/colunas em formato JSON;<br>[**db.odbc.discovery[]**](#db.odbc.discovery) - este item retorna dados de descoberta de baixo nível.|
|*Nome de usuário*|Insira o nome de usuário do banco de dados (até 255 caracteres).<br>Este parâmetro é opcional se o nome de usuário do banco de dados for especificado no arquivo `odbc.ini`.<br>Se uma string de conexão for usada e o campo *Nome de usuário* não estiver vazio, ele será adicionado à string de conexão como `UID=<user>`.|
|*Senha*|Insira a senha do usuário do banco de dados (até 255 caracteres).<br>Este parâmetro é opcional se a senha for especificada no arquivo `odbc.ini`.<br>Se uma string de conexão for usada e o campo *Senha* não estiver vazio, ela será adicionada à string de conexão como `PWD=<password>`.<br>Caracteres especiais são suportados neste campo.<br>A senha será adicionada à string de conexão após o nome de usuário como, por exemplo, `UID=<username>;PWD=P?;)*word`.<br>Para testar a string resultante, você pode executar o seguinte comando:<br>`isql -v -k 'Driver=libmaodbc.so;Database=zabbix;UID=zabbix;PWD=P?;)*word'`|
|*Consulta SQL*|Insira a consulta SQL.<br>Observe que com `db.odbc.select[]`, a consulta deve retornar apenas um valor.|
|*Tipo de informação*|Selecione aqui o tipo de informação que será retornado pela consulta.<br>Se o tipo de informação for selecionado incorretamente, o item se tornará não suportado.|

[comment]: # ({/458da043-ca784f43})

[comment]: # ({db5ed945-06f9d2eb})
**Notas importantes**

-   Os items de monitoramento de banco de dados ficarão sem suporte se nenhum processo *odbc poller* for iniciado na configuração do server ou proxy.
    Para ativar os ODBC pollers, defina o parâmetro `StartODBCPollers` no arquivo de configuração do Zabbix [server](/manual/appendix/config/zabbix_server) ou, para verificações realizadas pelo proxy, no arquivo de configuração do Zabbix [proxy](/manual/appendix/config/zabbix_proxy).
-   O valor do parâmetro *Timeout* no formulário de [configuração do item](/manual/config/items/item#configuration) é usado como o tempo limite de login ODBC e o tempo limite de execução da consulta.
    Observe que essas configurações de tempo limite podem ser ignoradas se o driver ODBC instalado não as suportar.
-   O comando SQL deve retornar um conjunto de resultados como qualquer consulta usando a instrução `select`.
    A sintaxe da consulta dependerá do SGBD que irá processá-la.
    A sintaxe da requisição para uma procedure de armazenamento deve ser iniciada com a palavra-chave `call`.

[comment]: # ({/db5ed945-06f9d2eb})

[comment]: # ({99bf7f73-0188aaa2})
#### Detalhes da chave do item

Parâmetros sem colchetes angulares são obrigatórios. Parâmetros marcados com colchetes angulares **<** **>** são opcionais.

[comment]: # ({/99bf7f73-0188aaa2})

[comment]: # ({1a75e5c0-13edfcd4})
##### db.odbc.select[<descrição curta única>,<dsn>,<string de conexão>] {#db.odbc.select}

<br>
Retorna um valor, ou seja, a primeira coluna da primeira linha do resultado da consulta SQL.<br>
Valor de retorno: Dependendo da consulta SQL.

Parâmetros:

-   **descrição curta única** - uma descrição curta única para identificar o item (para uso em triggers, etc.);
-   **dsn** - o nome da fonte de dados (conforme especificado em `odbc.ini`);
-   **string de conexão** - a string de conexão (pode conter argumentos específicos do driver).

Comentários:

-   Embora `dsn` e `string de conexão` sejam parâmetros opcionais, pelo menos um deles é obrigatório; se ambos forem definidos, `dsn` será ignorado.
-   Se uma consulta retornar mais de uma coluna, apenas a primeira coluna será lida. Se uma consulta retornar mais de uma linha, apenas a primeira linha será lida.

[comment]: # ({/1a75e5c0-13edfcd4})

[comment]: # ({a6ace17e-ebf5d449})
##### db.odbc.get[<descrição curta única>,<dsn>,<string de conexão>] {#db.odbc.get}

<br>
Transforma o resultado da consulta SQL em um array JSON.<br>
Valor de retorno: *objeto JSON*.

Parâmetros:

-   **descrição curta única** - uma descrição curta única para identificar o item (para uso em triggers, etc.);
-   **dsn** - o nome da fonte de dados (conforme especificado em `odbc.ini`);
-   **string de conexão** - a string de conexão (pode conter argumentos específicos do driver).

Comentários:

-   Embora `dsn` e `string de conexão` sejam parâmetros opcionais, pelo menos um deles é obrigatório; se ambos forem definidos, `dsn` será ignorado.
-   Várias linhas/colunas em formato JSON podem ser retornadas.
    Este item pode ser usado como um item mestre que coleta todos os dados em uma chamada de sistema, enquanto o pré-processamento JSONPath pode ser usado em itens dependentes para extrair valores individuais.
    Para mais informações, veja um [exemplo](/manual/discovery/low_level_discovery/examples/sql_queries#using-db.odbc.get) do formato retornado, usado em descoberta de baixo nível.

Exemplo:

    # Conexão para o driver MySQL ODBC 5:
    db.odbc.get[Exemplo MySQL,,"Driver=/usr/local/lib/libmyodbc5a.so;Database=master;Server=127.0.0.1;Port=3306"]

[comment]: # ({/a6ace17e-ebf5d449})

[comment]: # ({f6dfe740-c8148c95})
##### db.odbc.discovery[<descrição curta exclusiva>,<dsn>,<string de conexão>] {#db.odbc.discovery}

<br>
Transforma o resultado da consulta SQL em um array JSON, usado para [descoberta de baixo nível](/manual/discovery/low_level_discovery/examples/sql_queries).
Os nomes das colunas do resultado da consulta são transformados em nomes de macros de descoberta de baixo nível emparelhados com os valores dos campos descobertos.
Essas macros podem ser usadas na criação de protótipos de item, trigger, etc.<br>
Valor de retorno: *objeto JSON*.

Parâmetros:

-   **descrição curta exclusiva** - uma descrição curta exclusiva para identificar o item (para uso em triggers, etc.);
-   **dsn** - o nome da fonte de dados (conforme especificado em `odbc.ini`);
-   **string de conexão** - a string de conexão (pode conter argumentos específicos do driver).

Comentários:

-   Embora `dsn` e `string de conexão` sejam parâmetros opcionais, pelo menos um deles é obrigatório; se ambos forem definidos, `dsn` será ignorado.

[comment]: # ({/f6dfe740-c8148c95})

[comment]: # ({87547b91-718edfdc})
#### Mensagens de erro

As mensagens de erro do ODBC são estruturadas em campos para fornecer informações detalhadas.
Por exemplo, uma mensagem de erro pode ser assim:

    Cannot execute ODBC query: [SQL_ERROR]:[42601][7][ERROR: syntax error at or near ";"; Error while executing the query]

-   "`Cannot execute ODBC query`" - Mensagem do Zabbix
-   "`[SQL_ERROR]`" - Código de retorno do ODBC
-   "`[42601]`" - SQLState
-   "`[7]`" - Código de erro nativo
-   "`[ERROR: syntax error at or near ";"; Error while executing the query]`" - Mensagem de erro nativa

Observe que o comprimento da mensagem de erro é limitado a 2048 bytes, portanto, a mensagem pode ser truncada.
Se houver mais de um registro de diagnóstico ODBC, o Zabbix tenta concatená-los (separados por `|`) até o limite de comprimento permitir.

[comment]: # ({/87547b91-718edfdc})
