Utiliser et comprendre les traces ODBC

Le traçage ODBC fournit un moyen de visualiser les appels entre une application le gestionnaire de pilotes ODBC et le pilote ODBC. Les appels ODBC sont écrits dans un fichier texte qui peut ensuite être examiné pour plus de détails sur le comportement de l'application ODBC et le pilote. Dans SAS, il est également possible de visualiser ces traces en utilisant la bonne option SASTRACE. Ces traces ODBC sont utile lors du débogage des messages d'erreur et autres types de problèmes pour déterminer leur cause. De par mon expérience au support SAS, je peux vous affirmer qu’une bonne analyse de problème ODBC ou SAS/ACCESS passe de façon presque inévitable par l’activation des logs ODBC, que ce soit au niveau du gestionnaire ODBC que dans le module SAS/ACCESS. Comment activer et désactiver le traçage sur Windows, UNIX et Linux Sous Windows, le traçage ODBC est activé par le biais de l'Administrateur ODBC. Pour activer le traçage, c'est simple : activer les logs ODBC sous windows Sous Unix et Linux, le traçage est activé dans le fichier odbc.ini ou par l'intermédiaire de l'outil Administrateur ODBC Linux. Pour activer le traçage dans le fichier odbc.ini: En utilisant un éditeur de texte, ouvrez le fichier odbc.ini où se trouve votre source de données (par exemple /opt/odbc/odbc.ini) Votre fichier contient une section intitulée avec [ODBC] tels que:
[ODBC] 
IANAAppCodePage=4 
InstallDir=ODBCHOME 
Trace=0 
TraceDll=ODBCHOME/lib/odbctrac.so 
TraceFile=odbctrace.out 
UseCursorLib=0
Entrez un emplacement et le nom du fichier de sortie où le fichier de trace ODBC sera créé :
TraceFile=/home/my_dir/odbctrace.out 
Pour activer le traçage, définissez l’option TRACE comme ci-dessous :
Trace=1
Enregistrez et fermez le fichier. Le traçage est maintenant activé. Une fois que vous avez reproduit le comportement que vous tracez, le traçage ODBC doit être désactivé. Pour ce faire, ré-ouvrir le fichier odbc.ini et définir
Trace=0
Comment activer le traçage dans SAS L’option SASTRACE génère des informations de trace à partir d'un moteur de SGBD. Dans votre session SAS, positionnez l’option suivante :
options sastrace='d,,d,d' nostsuffix sastraceloc=saslog;
La sortie est écrit dans le journal SAS, tel que spécifié dans l'option sastraceloc=saslog; Pourquoi désactiver  le traçage après avoir mené ses investigations ? Le traçage est un outil très utile, alors pourquoi le désactiver au lieu de laisser le traçage activé tout le temps? Bonne question, non ? Pourquoi ne pas laisser le traçage activé de façon permanente ? Vous auriez un journal en cours d'exécution de chaque appel ODBC fait sur votre machine. Cependant, il y a un inconvénient qui l'emporte sur le bénéfice. Le traçage écrit chaque appel ODBC dans un fichier texte et cela nécessite des ressources important. Cela signifie que les performances de votre application ODBC seront sérieusement affectées par le traçage. Aussi, laisser le traçage activé va sensiblement ralentir les performances de votre application et utiliser plus de ressources processeur sur votre machine. En outre, la taille du fichier de sortie se développera rapidement au point d'exiger d'espace de stockage. Pour ces raisons, le traçage ne doit être activé le temps d'analyser un problème ou pour réaliser un ensemble de mesures spécifiques. Dans quel cas les traces ODBC peuvent vous aider ? Le traçage est une façon de déboguer des problèmes lorsque vous ne pouvez pas déterminer la source d'un problème ou d’une erreur. L’analyse des traces ODBC peut être utilisée pour affiner un problème et déterminer son origine (pilote, application, base de données ou  même réseau). Par exemple, le traçage peut contribuer à la mise au point des messages d'erreur, la corruption de données, ou encore les problèmes de performance. Vous verrez, dans la suite de cet article, que l’activation des sastrace permet de résoudre ou comprendre bien des problématiques SAS/ACCESS. Analysons un exemple de message d’erreur ODBC : exemple_log_odbc Une erreur provenant du pilote ODBC ressemblerait à :
[DataDirect] [ODBC Oracle driver] Invalid precision specified.
Enfin, une erreur provenant du gestionnaire de pilotes ODBC ressemblerait à ceci:
[Microsoft] [ODBC Driver Manager] Driver does not support this function
Connaître l'origine du message d'erreur peut vous aider à déterminer comment débuter votre débogage. Le site du support DataDirect est une excellente source pour la recherche de messages d'erreur. Si, avec SAS, vous êtes face à des problèmes de  corruption des données ou de performance, l’origine peut se trouver dans SAS, dans le pilote ODBC, ou encore dans la base de données. Gardez en ête que des problèmes de performance (ralentissements, par exemple) sont aussi souvent causée par des problèmes de réseau. Donc, la première étape de ces types de problèmes, comme avec tous les débogages, est de déterminer la source du problème. Enfin, de nombreuses bases de données renvoient des codes d'erreur natifs lorsque cela est possible. Par exemple, la base de données Oracle retourne une série de codes d'erreur commençant par les lettres ORA ou PLS, entre autres. Comment lire une trace ODBC ? Le journal de trace ODBC affiche chaque fonction ODBC appelé  par l’application. La connaissance de la spécification de l’API ODBC vous aidera à déchiffrer le journal de trace généré. Chaque fonction ODBC accepte un ensemble de paramètres. Voici un exemple de la façon dont une fonction ODBC est visible dans le journal de suivi :
Process_Name XXX-YYY ENTER ODBC_Function
              DataType value_of_argument_1
              DataType value_of_argument_2
              DataType value_of_argument_3

Process_Name XXX-YYY EXIT ODBC_Function with return code N (RetCode)
              DataType value_of_argument_1
              DataType value_of_argument_2
              DataType value_of_argument_3

Quelques petites explications sont les bienvenues :
  • Process Name - Le nom du processus en cours de suivi
  • XXX - L'ID du processus en cours
  • YYY - L'identifiant du thread courant
  • ENTER - EXIT : Entrée ou sortie de la fonction ODBC
  • ODBC Function : La fonction de l’API ODBC en cours d'exécution par l'application
  • RetCode : Un code de retour fourni par le pilote ODBC qui détermine l'état de la fonction exécutée
  • DataType : Les données de l'argument qui est passé ou renvoyé lors de l'exécution de la fonction ODBC
Voici un exemple d'exécution de la fonction SQLExecDirect en utilisant une application ODBC appelé ODBC Test :
OdbcTE32 870-4e8 ENTER SQLExecDirect
HSTMT 00982470
UCHAR * 0x0015B370 [ -3] "select * from emp\ 0"
SDWORD -3
OdbcTE32 870-4e8 EXIT SQLExecDirect with return code 0 (SQL_SUCCESS)
HSTMT 00982470
UCHAR * 0x0015B370 [ -3] "select * from emp\ 0"
SDWORD -3
Selon la spécification ODBC, la fonction SQLExecDirect prend 3 arguments:
SQLRETURN SQLExecDirect(
     SQLHSTMT     StatementHandle,
     SQLCHAR *    StatementText,
     SQLINTEGER   TextLength);
SQLExecDirect exécute une instruction préparée. SQLExecDirect est le meilleur moyen de présenter une requête SQL pour une exécution unique.
StatementHandle
[Input] Statement handle.
StatementText
[Input] SQL statement to be executed.
TextLength
[Input] Length of *StatementText in characters.
Comparont maintenant les arguments que voyons dans notre journal de log ODBC pour étudier l'information transmise à la fonction SQLExecDirect :
hstmt 00982470
szSqlStr “select * from emp\ 0” où "\ 0" est le terminateur null
cbSqlStr -3 ou SQL_NTS signifie que la valeur est une chaîne terminée par zéro
 Messages d'erreur
[Vendor][ODBC Component]Error message
[Vendor][ODBC Component][Data source]Error message
Le [] immédiatement à la gauche du message d'erreur informe l'utilisateur lorsque le message d'erreur a été généré. Le message d'erreur sera soit renvoyé par l'un des composants ODBC, à savoir le conducteur ou pilote gestionnaire ODBC, ou par le magasin de données, à savoir Oracle, Sybase, DB2, etc. Le [Vendor] est le distributeur du composant ODBC référencé dans le message d'erreur. Par exemple, Datadirect ou microsoft. Un autre exemple, cette fois obtenue dans SAS, lors d'une tentative de création de bibliothèque, via une commande libname :
ERROR: CLI error trying to establish connection: [unixODBC][Driver Manager]Data source name not found, and no default driver specified
ERROR: Error in the LIBNAME statement.
Nous avons ici une erreur remonté dans SAS en provenance du gestionnaire ODBC. Quand vous essayez de déterminer la fonction ODBC en erreur, cherchez dans votre sastrace ou votre fichier de log ODBC, le code retour SQL_ERROR ou le message d'erreur retourné par l'application. Une fois  le message d'erreur  trouvée, vérifiez les arguments transmis pour chaque fonction ODBC. Sont-ils corrects  ? Gardez la spécification ODBC sous le coude pour confirmer l'exactitude des valeurs d'argument. Un exemple :
OdbcTE32 4c8-d3c ENTER SQLExecDirect
HSTMT 00981BE8
UCHAR * 0x001513B0 [-3] "select * from em\ 0"
SDWORD -3
OdbcTE32 4c8-d3c EXIT SQLExecDirect with return code -1 (SQL_ERROR)
HSTMT 00981BE8
UCHAR * 0x001513B0 [-3] "select * from em\ 0"
SDWORD -3
DIAG [42S02] [DataDirect][ODBC Oracle Wire Protocol driver][Oracle]ORA-00942: table or view does not exist (942)
Nous sommes face à un cas simple. En me basant sur le message d'erreur retourné, la table "em" référencé dans l'instruction SQL exécutée n'existe pas dans la base de données. Oracle Plusieurs causes : Le nom de la table peut être incorrecte, les noms de table peut-être sensibles à la casse, ou il peut exister dans un catalogue ou d'un schéma différent de la valeur par défaut. Si tel est le cas, vous auriez besoin de le qualifier dans la requête.    

Nicolas Housset

Passionné d'informatique, je suis Consultant et expert technique SAS VIYA, également co-fondateur de la société Flexcelite. Spécialisé dans les technologies SAS (Viya, 9.4) et les infrastructures associées (Linux, Hadoop, Azure), ce blog est mon espace pour partager mes mémos techniques et retours d'expérience.