Introduction
La couche unixODBC propose le binaire iusql
afin d’attaquer des bases de
données avec la couche ODBC via un DSN (Data Source Name). Cet utilitaire
s’avère très pratique en cas de diagnostic.
Cet article présente le référencement du pilote ODBC 64 bits Oracle 11g
natif dans la couche unixODBC 2.3.0 ainsi qu’un test de connexion à une
instance Oracle via ODBC avec iusql
.
Environnement
Environnement Oracle 11g R2
Il s’agit ici d’une distribution Oracle 11.2.0.2 64 bits installée dans le
répertoire /Software/oracle/app/product/11.2.0
($ORACLE_HOME
) sur une
plateforme Sun Solaris 10 x86 64bits. Dès maintenant la variable
d’environnement $ORACLE_HOME
est initialisée si ce n’est pas le cas :
% ORACLE_HOME=/Software/oracle/app/product/11.2.0
% export ORACLE_HOME
Le pilote ou "driver" natif ODBC d’Oracle 11g R2 est une librairie dynamique
qui s’appelle libsqora.so.11.1
installée dans le répertoire $ORACLE_HOME/lib
.
Si cette librairie n’existe pas, il est peut être nécessaire de la compiler,
voire de l’installer avec Oracle Universal Installer :
Oracle 11g R2, compilation du pilote ODBC avec unixODBC 2.3.0 sous Sun Solaris 10 X86
Environnement unixODBC
La distribution unixODBC est une version 2.3.0 64 bits, elle est installée
dans le répertoire /Software/tools/unixodbc
.
Les fichiers de configuration odbcinst.ini
et odbc.ini
de la distribution
unixODBC sont installés dans le sous répertoire
/Software/tools/unixodbc/etc
.
Les librairies d’unixODBC 2.3.0 sont sompilées en 64 bits dans le répertoire
/Software/tools/unixodbc/lib
: libodbcinst.so, libodbc.so, libodbcccr.so
.
Pour plus d’informations sur la compilation d’unixODBC 2.3.0 sur les plateformes Sun Solaris 10 x86 64 bits : unixODBC 2.3.0,compilation et utilisation sous Sun Solaris 10 X86
Les fichiers odbcinst.ini et odbc.ini d’unixODBC pour Oracle 11g R2 : odbc_update_ini.sh
Le script shell odbc_update_ini.sh
dans le répertoire $ORACLE_HOME/odbc/utl
est très pratique pour mettre à jour les fichiers odbcinst.ini
et odbc.ini
d’unixODBC et disposer de modèles (templates) :
% cd $ORACLE_HOME/odbc/utl % odbc_update_ini.sh
*** Please pass ODBCDM_HOME as arg-1, and optional arguments - *** Install location (arg-2), Driver name (arg-3) & DSN (arg-4). *** Usage: odbc_update_ini.sh <ODBCDM_Home> [<Install_Location>] [<Driver_Name>] [<DSN>]
<ODBCDM_Home>
Obligatoire |
Répertoire d’installation d’unixODBC
(/Software/tools/unixodbc ici). |
<Install_Location>
Optionnel |
Répertoire dans lequel est installé
le pilote ODBC Oracle libsqora.so.11.1 .
Il est obligatoire si le script odbc_update_ini.sh
n’est pas exécuté depuis le répertoire
d’installation de libsqora.so.11.1 . |
<Driver_Name>
Optionnel |
Spécifie un nom de pilote personnalisé autre que celui par défaut "Oracle 11g ODBC driver". |
<DSN>
Optionnel |
Spécifie un nom de DSN (Data Source Name) personnalisé autre que celui par défaut "OracleODBC-11g". |
Avant d’exécuter ce script, vérifier que le compte oracle a bien les droits
d’écriture sur le fichier <répertoire unixODBC>/etc/odbcinst.ini
d’unixODBC.
% cd $ORACLE_HOME/odbc/utl
% odbc_update_ini.sh /Software/tools/unixodbc /Software/oracle/app/product/11.2.0/lib
Grâce au script odbc_update_ini.sh
, le fichier odbcinst.ini
dans le
répertoire /Software/tools/unixodbc/etc
est mis à jour pour le référencement du
pilote Oracle ODBC 11g
/Software/tools/unixodbc/etc/odbcinst.ini
[Oracle 11g ODBC driver]
Description = Oracle ODBC driver for Oracle 11g
Driver = /Software/oracle/app/product/11.2.0/lib/libsqora.so.11.1
Setup =
FileUsage =
CPTimeout =
CPReuse =
Et on dispose d’une entrée modèle (template) pour un DSN dans le fichier
.odbc.ini
créé par le script odbc_update_ini.sh
dans le répertoire $HOME
du
compte oracle :
$HOME/.odbc.ini
[OracleODBC-11g]
Application Attributes = T
Attributes = W
BatchAutocommitMode = IfAllSuccessful
BindAsFLOAT = F
CloseCursor = F
DisableDPM = F
DisableMTS = T
Driver = Oracle 11g ODBC driver
DSN = OracleODBC-11g
EXECSchemaOpt =
EXECSyntax = T
Failover = T
FailoverDelay = 10
FailoverRetryCount = 10
FetchBufferSize = 64000
ForceWCHAR = F
Lobs = T
Longs = T
MaxLargeData = 0
MetadataIdDefault = F
QueryTimeout = T
ResultSets = T
ServerName =
SQLGetData extensions = F
Translation DLL =
Translation Option = 0
DisableRULEHint = T
UserID =
StatementCache=F
CacheBufferSize=20
UseOCIDescribeAny=F
Ce modèle peut être copié dans le fichier odbc.ini
d’unixODBC
(/Software/tools/unixodbc/etc
).
Connexion à une instance Oracle avec le binaire iusql d’unixODBC
Dans ce test, une connexion à l’instance RISKD
est réalisée avec le binaire
iusql
d’unixODBC. L’instance RISKD
est référencée dans le fichier tnsnames.ora
:
/Software/oracle/app/product/11.2.0/network/admin/tnsnames.ora
…
RISKD =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = FRDSOP501)(PORT = 1555))
)
(CONNECT_DATA =
(SID = RISKD)
)
)
…
Environnement Oracle
Le compte Unix utilisé ici n’est pas oracle, les variables d’environnement
PATH, LD_LIBRARY_PATH
et ORACLE_HOME
sont mises à jour pour ce compte pour
incorporer l’environnement Oracle :
% ORACLE_HOME=/Software/oracle/app/product/11.2.0
% export ORACLE_HOME
% PATH=$ORACLE_HOME/bin:$PATH
% export PATH
% LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
% export LD_LIBRARY_PATH
Création du DSN RISKD
La source de données DSN RISKD
est créée dans le fichier odbc.ini
d’unixODBC
grâce au modèle généré précédemment (la sortie est allégée pour la lisibilité)
:
/Software/tools/unixodbc/etc/odbc.ini
[RISKD]
…
Driver = Oracle 11g ODBC driver
DSN = RISKD
…
ServerName = RISKD
…
L’exécutable odbc_config
d’unixODBC permet de vérifier que la connexion avec
iusql
sera bien réalisée avec les fichiers odbcinst.ini
et odbc.ini
localisés
dans le répertoire <répertoire unixodbc>/etc
:
% cd /Software/tools/unixodbc/bin % odbc_config --odbcini --odbcinstini --odbcversion
/Software/tools/unixodbc/etc/odbc.ini /Software/tools/unixodbc/etc/odbcinst.ini 3
Connexion avec iusql d’unixODBC
La syntaxe du binaire iusql
est très simple :
% cd /Software/tools/unixodbc/bin % iusql
********************************************** * unixODBC - isql * ********************************************** * Syntax * * * * isql DSN [UID [PWD]] [options] * * * …
Le test de connexion avec iusql
sur le DSN RISKD
peut démarrer, l’option -v
est donnée pour la verbosité en cas de diagnostics nécessaires :
% cd /Software/tools/unixodbc/bin % iusql -v RISKD system ********
+---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +---------------------------------------+
select username from dba_users;
+-------------------------------+ | USERNAME | +-------------------------------+ | SYSTEM | | SYS | … SQLRowCount returns -1 40 rows fetched
Diagnostiquer les erreurs avec l’option -v du binaire iusql
L’option -v
est très pratique pour diagnostiquer les erreurs. Sans cette
option, un message très peu parlant est affiché par le binaire iusql
:
[ISQL]ERROR: Could not SQLConnect
Voici quelques exemples de diagnostics simples.
Le DSN n’existe pas
% iusql -v RISKE system ********
[IM002][unixODBC][Driver Manager]Data source name not found, and no default driver specified [ISQL]ERROR: Could not SQLConnect
Problème de chargement de librairies
% iusql -v RISKD system ********
[01000][unixODBC][Driver Manager]Can't open lib '/Software/oracle/app/product/11.2.0/lib/libsqora.so.11.1' : file not found [ISQL]ERROR: Could not SQLConnect
Dans ce cas de figure, la commande ldd
sur la librairie libsqora.so.11.1
permettra de diagnostiquer immédiatement le problème :
% ldd /Software/oracle/app/product/11.2.0/lib/libsqora.so.11.1
… libodbcinst.so.1 => (file not found) …
Solution simple : le répertoire /Software/tools/unixodbc/lib
des librairies
d’unixODBC n’est pas référencé dans la variable d’environnement
LD_LIBRARY_PATH
.
Le cas courant : mot de passe invalide
% iusql -v RISKD system ********
[28000][unixODBC][Oracle][ODBC][Ora]ORA-01005: null password given; logon denied [ISQL]ERROR: Could not SQLConnect