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

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

[comment]: # ({c62c1e4d-b5170fd3})
#### Présentation

La supervision ODBC correspond au type d’élément **Database monitor** dans l’interface Zabbix.

ODBC est une API middleware du langage de programmation C permettant d’accéder aux systèmes de gestion de bases de données (SGBD).
Le concept ODBC a été développé par Microsoft puis porté sur d’autres plateformes.

Zabbix peut interroger toute base de données prise en charge par ODBC.
Pour cela, Zabbix ne se connecte pas directement aux bases de données, mais utilise l’interface ODBC et les pilotes configurés dans ODBC.
Cela permet une supervision plus efficace de différentes bases de données à des fins multiples (par exemple, vérifier des files d’attente spécifiques de base de données, des statistiques d’utilisation, etc.).

Zabbix prend en charge unixODBC, qui est l’une des implémentations open source de l’API ODBC les plus couramment utilisées.

::: noteimportant
Voir aussi : [problèmes connus](/manual/installation/known_issues#odbc-checks) pour les vérifications ODBC.
:::

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

[comment]: # ({47a0f71f-bf6fd8ba})
#### Installation de unixODBC

La méthode recommandée pour installer unixODBC consiste à utiliser les dépôts de paquets par défaut du système d’exploitation Linux.
Dans les distributions Linux les plus populaires, unixODBC est inclus par défaut dans le dépôt de paquets.
Si les paquets ne sont pas disponibles, les fichiers source peuvent être obtenus sur la page d’accueil de unixODBC : <http://www.unixodbc.org/download.html>.

Pour installer unixODBC, utilisez le gestionnaire de paquets du système de votre choix :

```bash
# Pour les systèmes Ubuntu/Debian :
apt install unixodbc unixodbc-dev

# Pour les systèmes basés sur RedHat/Fedora :
dnf install unixODBC unixODBC-devel

# Pour les systèmes basés sur SUSE :
zypper in unixODBC-devel
```

::: noteimportant
Le paquet `unixodbc-dev` ou `unixODBC-devel` est nécessaire pour compiler Zabbix avec la prise en charge de unixODBC.
Pour activer la prise en charge d’ODBC, Zabbix doit être compilé avec l’[option de configuration](/manual/installation/install/sources#configure-the-sources) suivante :
<br><br>

    --with-unixodbc[=ARG] # Utiliser le pilote ODBC avec le paquet unixODBC.

:::

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

[comment]: # ({07af6a39-eea09ed7})
#### Installation des pilotes unixODBC

Le pilote de base de données unixODBC doit être installé pour la base de données qui sera surveillée.
Pour obtenir la liste des bases de données et des pilotes pris en charge, consultez la page d’accueil de unixODBC : <http://www.unixodbc.org/drivers.html>.

::: noteclassic
Dans certaines distributions Linux, les pilotes de base de données sont inclus dans les dépôts de paquets.
:::

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

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

Pour installer le pilote de base de données MySQL unixODBC, utilisez le gestionnaire de paquets du système de votre choix :

```bash
# Pour les systèmes Ubuntu/Debian :
apt install odbc-mariadb

# Pour les systèmes basés sur RedHat/Fedora :
dnf install mariadb-connector-odbc

# Pour les systèmes basés sur SUSE :
zypper install mariadb-connector-odbc
```

Pour installer le pilote de base de données sans gestionnaire de paquets, veuillez consulter la [documentation MySQL](https://dev.mysql.com/downloads/connector/odbc/) pour `mysql-connector-odbc`, ou la [documentation MariaDB](https://mariadb.com/kb/en/mariadb-connector-odbc/) pour `mariadb-connector-odbc`.

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

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

Pour installer le pilote de base de données PostgreSQL unixODBC, utilisez le gestionnaire de paquets du système de votre choix :

```bash
# Pour les systèmes Ubuntu/Debian :
apt install odbc-postgresql

# Pour les systèmes basés sur RedHat/Fedora :
dnf install postgresql-odbc

# Pour les systèmes basés sur SUSE :
zypper install psqlODBC
```

Pour installer le pilote de base de données sans gestionnaire de paquets, veuillez consulter la [documentation PostgreSQL](https://www.postgresql.org/download/linux/).

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

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

Pour installer le pilote de base de données unixODBC, veuillez consulter la [documentation Oracle](https://www.oracle.com/database/technologies/releasenote-odbc-ic.html).

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

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

Pour installer le pilote de base de données MSSQL unixODBC, utilisez le gestionnaire de paquets du système de votre choix :

```bash
# Pour les systèmes Ubuntu/Debian :
apt install tdsodbc

# Pour les systèmes basés sur RedHat/Fedora (paquets EPEL : https://docs.fedoraproject.org/en-US/epel/) :
dnf install epel-release
dnf install freetds

# Pour les systèmes basés sur SUSE :
zypper install libtdsodbc0
```

Pour installer le pilote de base de données sans gestionnaire de paquets, veuillez consulter le [guide de l’utilisateur FreeTDS](http://www.freetds.org/userguide/).

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

[comment]: # ({f24fde2e-b15e771b})
#### Configuration de unixODBC

Pour configurer unixODBC, vous devez modifier les fichiers `odbcinst.ini` et `odbc.ini`.
Vous pouvez vérifier l’emplacement de ces fichiers en exécutant la commande suivante :

```bash
odbcinst -j
```

Le résultat de la commande doit contenir des informations similaires à ce qui suit :

```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

Le fichier `odbcinst.ini` répertorie les pilotes de base de données ODBC installés.
Si `odbcinst.ini` est absent, il est nécessaire de le créer manuellement.

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

|Parameter|Description|
|--|--------|
|TEST_MYSQL|Nom du pilote de base de données.|
|Description|Description du pilote de base de données.|
|Driver|Emplacement de la bibliothèque du pilote de base de données.|
|FileUsage|Détermine si le pilote de base de données prend en charge la connexion à un serveur de base de données sans prise en charge de l'accès aux fichiers locaux (0) ; prend en charge la lecture des données à partir de fichiers (1) ; prend en charge l'écriture des données dans des fichiers (2).|
|Threading|Niveau de sérialisation des threads. Pris en charge pour PostgreSQL.<br>Depuis la version 1.6, si le gestionnaire de pilotes est compilé avec la prise en charge des threads, vous pouvez ajouter une autre entrée de pilote.|

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

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

Le fichier `odbc.ini` est utilisé pour configurer les sources de données.
Notez que la liste des paramètres pris en charge dépend du pilote de base de données (par exemple, les bases de données Oracle peuvent utiliser ServerName au lieu 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
```

|Parameter|Description|
|--|--------|
|TEST_MYSQL|Nom de la source de données (DSN).|
|Description|Description de la source de données.|
|Driver|Nom du pilote de base de données (tel que spécifié dans `odbcinst.ini`).|
|Server|IP/DNS du serveur de base de données.|
|User|Utilisateur de la base de données pour la connexion.|
|Password|Mot de passe de l’utilisateur de la base de données.|
|Port|Port de connexion à la base de données.|
|Socket|Socket de connexion à la base de données.|
|Database|Nom de la base de données.|

Pour d’autres options possibles de paramètres de configuration, consultez la [documentation MySQL](https://dev.mysql.com/doc/connector-odbc/en/connector-odbc-configuration-connection-parameters.html).

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

[comment]: # ({e0fd367c-fed5e483})
Le fichier `odbc.ini` pour PostgreSQL peut contenir des paramètres supplémentaires :

```ini
[TEST_PSQL]
Description=Base de données de test PostgreSQL
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=
```

|Paramètre|Description|
|--|--------|
|ReadOnly|Indique si la connexion à la base de données autorise uniquement les opérations de lecture (requêtes `SELECT`) et limite les modifications (instructions `INSERT`, `UPDATE` et `DELETE`) ; utile dans les scénarios où les données doivent rester inchangées.|
|Protocol|Version du protocole backend PostgreSQL (ignorée lors de l’utilisation de connexions SSL).|
|ShowOidColumn|Indique s’il faut inclure l’Object ID (OID) dans SQLColumns.|
|FakeOidIndex|Indique s’il faut créer un faux index unique sur l’OID.|
|RowVersioning|Indique s’il faut permettre aux applications de détecter si des données ont été modifiées par d’autres utilisateurs pendant que vous tentez de mettre à jour une ligne. Notez que ce paramètre peut accélérer le processus de mise à jour, car, pour mettre à jour une ligne, il n’est pas nécessaire de spécifier chaque colonne individuellement dans la clause `WHERE`.|
|ShowSystemTables|Indique si le pilote de base de données doit traiter les tables système comme des tables ordinaires dans SQLTables ; utile pour l’accessibilité, en permettant la visibilité sur les tables système.|
|Fetch|Indique si le pilote doit utiliser automatiquement declare cursor/fetch pour gérer les instructions `SELECT` et maintenir un cache de 100 lignes.|
|BoolsAsChar|Contrôle le mappage des types booléens.<br>S’il est défini sur "Yes", les booléens sont mappés sur `SQL_CHAR` ; sinon, ils sont mappés sur `SQL_BIT`.|
|SSLmode|Indique le mode SSL pour la connexion.|
|ConnSettings|Paramètres supplémentaires envoyés au backend lors de la connexion.|

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

[comment]: # ({2e87263e-93c68b7f})
##### Test de la connexion ODBC

Pour vérifier si la connexion ODBC fonctionne correctement, vous pouvez utiliser l’utilitaire `isql` (inclus dans le paquet `unixODBC`) :

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

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

[comment]: # ({458da043-ca784f43})
#### Configuration d’un élément dans l’interface web Zabbix

Configurez un [item](/manual/config/items/item#overview) de **surveillance de base de données**.

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

Tous les champs de saisie obligatoires sont marqués d’un astérisque rouge.

Pour les éléments de surveillance de base de données, vous devez spécifier :

|   |   |
|--|--------|
|*Type*|Sélectionnez « Database monitor » ici.|
|*Key*|Saisissez l’une des clés d’élément prises en charge :<br>[**db.odbc.select[]**](#db.odbc.select) - cet élément renvoie une valeur (la première colonne de la première ligne du résultat de la requête SQL) ;<br>[**db.odbc.get[]**](#db.odbc.get) - cet élément renvoie plusieurs lignes/colonnes au format JSON ;<br>[**db.odbc.discovery[]**](#db.odbc.discovery) - cet élément renvoie des données de découverte de bas niveau.|
|*User name*|Saisissez le nom d’utilisateur de la base de données (jusqu’à 255 caractères).<br>Ce paramètre est facultatif si le nom d’utilisateur de la base de données est spécifié dans le fichier `odbc.ini`.<br>Si une chaîne de connexion est utilisée et que le champ *User name* n’est pas vide, il est alors ajouté à la chaîne de connexion sous la forme `UID=<user>`.|
|*Password*|Saisissez le mot de passe de l’utilisateur de la base de données (jusqu’à 255 caractères).<br>Ce paramètre est facultatif si le mot de passe est spécifié dans le fichier `odbc.ini`.<br>Si une chaîne de connexion est utilisée et que le champ *Password* n’est pas vide, il est alors ajouté à la chaîne de connexion sous la forme `PWD=<password>`.<br>Les caractères spéciaux sont pris en charge dans ce champ.<br>Le mot de passe sera ajouté à la chaîne de connexion après le nom d’utilisateur, par exemple `UID=<username>;PWD=P?;)*word`.<br>Pour tester la chaîne résultante, vous pouvez exécuter la commande suivante :<br>`isql -v -k 'Driver=libmaodbc.so;Database=zabbix;UID=zabbix;PWD=P?;)*word'`|
|*SQL query*|Saisissez la requête SQL.<br>Notez qu’avec `db.odbc.select[]`, la requête ne doit renvoyer qu’une seule valeur.|
|*Type of information*|Sélectionnez ici le type d’information qui sera renvoyé par la requête.<br>Si le type d’information est sélectionné de manière incorrecte, l’élément deviendra non pris en charge.|

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

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

-   Les éléments de surveillance de base de données deviendront non pris en charge si aucun processus *odbc poller* n’est démarré dans la configuration du serveur ou du proxy.
    Pour activer les pollers ODBC, définissez le paramètre `StartODBCPollers` dans le fichier de configuration du [server](/manual/appendix/config/zabbix_server) Zabbix ou, pour les vérifications effectuées par le proxy, dans le fichier de configuration du [proxy](/manual/appendix/config/zabbix_proxy) Zabbix.
-   La valeur du paramètre *Timeout* dans le formulaire de [configuration de l’élément](/manual/config/items/item#configuration) est utilisée comme délai d’expiration de connexion ODBC et comme délai d’expiration d’exécution de la requête.
    Notez que ces paramètres de délai d’expiration peuvent être ignorés si le pilote ODBC installé ne les prend pas en charge.
-   La commande SQL doit renvoyer un ensemble de résultats comme toute requête utilisant l’instruction `select`.
    La syntaxe de la requête dépend du SGBDR qui la traitera.
    La syntaxe d’une requête vers une procédure stockée doit commencer par le mot-clé `call`.

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

[comment]: # ({99bf7f73-0188aaa2})
#### Détails de la clé d’élément

Les paramètres sans chevrons sont obligatoires. Les paramètres marqués par des chevrons **<** **>** sont facultatifs.

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

[comment]: # ({1a75e5c0-13edfcd4})
##### db.odbc.select[<description courte unique>,<dsn>,<chaîne de connexion>] {#db.odbc.select}

<br>
Renvoie une valeur, c’est-à-dire la première colonne de la première ligne du résultat de la requête SQL.<br>
Valeur de retour : selon la requête SQL.

Paramètres :

-   **description courte unique** - une description courte unique permettant d’identifier l’élément (à utiliser dans les déclencheurs, etc.) ;
-   **dsn** - le nom de la source de données (tel que spécifié dans `odbc.ini`) ;
-   **chaîne de connexion** - la chaîne de connexion (peut contenir des arguments spécifiques au pilote).

Commentaires :

-   Bien que `dsn` et `chaîne de connexion` soient des paramètres facultatifs, au moins l’un des deux est requis ; si les deux sont définis, `dsn` sera ignoré.
-   Si une requête renvoie plus d’une colonne, seule la première colonne est lue. Si une requête renvoie plus d’une ligne, seule la première ligne est lue.

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

[comment]: # ({a6ace17e-ebf5d449})
##### db.odbc.get[<description courte unique>,<dsn>,<chaîne de connexion>] {#db.odbc.get}

<br>
Transforme le résultat de la requête SQL en un tableau JSON.<br>
Valeur de retour : *objet JSON*.

Paramètres :

-   **description courte unique** - une description courte unique permettant d’identifier l’élément (à utiliser dans les déclencheurs, etc.) ;
-   **dsn** - le nom de la source de données (tel que spécifié dans `odbc.ini`) ;
-   **chaîne de connexion** - la chaîne de connexion (peut contenir des arguments spécifiques au pilote).

Commentaires :

-   Bien que `dsn` et `chaîne de connexion` soient des paramètres facultatifs, au moins l’un des deux est requis ; si les deux sont définis, `dsn` sera ignoré.
-   Plusieurs lignes/colonnes au format JSON peuvent être renvoyées.
    Cet élément peut être utilisé comme élément maître collectant toutes les données en un seul appel système, tandis que le prétraitement JSONPath peut être utilisé dans les éléments dépendants pour extraire des valeurs individuelles.
    Pour plus d’informations, consultez un [exemple](/manual/discovery/low_level_discovery/examples/sql_queries#using-db.odbc.get) du format renvoyé, utilisé dans la découverte de bas niveau.

Exemple :

    # Connexion pour le pilote ODBC MySQL 5 :
    db.odbc.get[MySQL example,,"Driver=/usr/local/lib/libmyodbc5a.so;Database=master;Server=127.0.0.1;Port=3306"]

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

[comment]: # ({f6dfe740-c8148c95})
##### db.odbc.discovery[<description courte unique>,<dsn>,<chaîne de connexion>] {#db.odbc.discovery}

<br>
Transforme le résultat de la requête SQL en un tableau JSON, utilisé pour la [découverte de bas niveau](/manual/discovery/low_level_discovery/examples/sql_queries).
Les noms de colonnes du résultat de la requête sont convertis en noms de macros de découverte de bas niveau, associés aux valeurs des champs découverts.
Ces macros peuvent être utilisées lors de la création de prototypes d'éléments, de déclencheurs, etc.<br>
Valeur de retour : *objet JSON*.

Paramètres :

-   **description courte unique** - une description courte unique permettant d'identifier l'élément (à utiliser dans les déclencheurs, etc.) ;
-   **dsn** - le nom de la source de données (tel que spécifié dans `odbc.ini`) ;
-   **chaîne de connexion** - la chaîne de connexion (peut contenir des arguments spécifiques au pilote).

Commentaires :

-   Bien que `dsn` et `chaîne de connexion` soient des paramètres facultatifs, au moins l'un des deux est requis ; si les deux sont définis, `dsn` sera ignoré.

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

[comment]: # ({87547b91-718edfdc})
#### Messages d'erreur

Les messages d'erreur ODBC sont structurés en champs afin de fournir des informations détaillées.
Par exemple, un message d'erreur peut ressembler à ceci :

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

-   "`Cannot execute ODBC query`" - message Zabbix
-   "`[SQL_ERROR]`" - code de retour ODBC
-   "`[42601]`" - SQLState
-   "`[7]`" - code d'erreur natif
-   "`[ERROR: syntax error at or near ";"; Error while executing the query]`" - message d'erreur natif

Notez que la longueur du message d'erreur est limitée à 2048 octets ; le message peut donc être tronqué.
S'il y a plus d'un enregistrement de diagnostic ODBC, Zabbix essaie de les concaténer (séparés par `|`) dans la mesure permise par la limite de longueur.

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