J'essaie d'accéder à Oracle à partir du serveur Linux. J'utilise unixODBC.
Lorsque j'essaie d'accéder à Oracle en utilisant isql et que j'obtiens une erreur que le gestionnaire de pilotes ne peut pas ouvrir libsqora.so.12.1.
odbc.ini
[NAME]
Application Attributes = T
Attributes = W
BatchAutocommitMode = IfAllSuccessful
BindAsFLOAT = F
CloseCursor = F
DisableDPM = F
DisableMTS = T
Driver = Oracle 11g ODBC driver
DSN = DSN_NAME
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 = ServerName
SQLGetData extensions = F
Translation DLL =
Translation Option = 0
DisableRULEHint = T
UserID = xxxx
Password=<password>
StatementCache=F
CacheBufferSize=20
UseOCIDescribeAny=F
odbcinst.ini
[Oracle 11g ODBC driver]
Description=Oracle ODBC driver for Oracle 11g
Driver=/usr/local/easysoft/Oracle/InstantClient112/lib/libsqora.so
FileUsage=1
Ensuite, lorsque j'utilise isql pour accéder à Oracle, j'obtiens l'erreur suivante:
[root@xxxxx lib]# isql -v NAME
[01000][unixODBC][Driver Manager]Can't open lib '/usr/local/easysoft/Oracle/InstantClient112/lib/libsqora.so' : file not found
[ISQL]ERROR: Could not SQLConnect
J'avais une faute de frappe dans odbcinst.ini. J'ai corrigé mais toujours la même erreur.
[root@xxxxx tmp]# isql -v NAME
[01000][unixODBC][Driver Manager]Can't open lib '/usr/local/easysoft/Oracle/InstantClient112/lib/libsqora.so.11.1' : file not found
[ISQL]ERROR: Could not SQLConnect
[root@xxxxx tmp]# ls -l /usr/local/easysoft/Oracle/InstantClient112/lib/libsqora.so.11.1
-rw-r--r-- 1 bin bin 996363 Sep 5 2010 /usr/local/easysoft/Oracle/InstantClient112/lib/libsqora.so.11.1
[Oracle 11g ODBC driver]
Description=Oracle ODBC driver for Oracle 11g
Driver=/usr/local/easysoft/Oracle/InstantClient112/lib/libsqora.so.11.1
FileUsage=1
ENV
[root@xxxxx tmp]# env
HOSTNAME=xxxxx
SSH2_TTY=/dev/pts/0
Shell=/bin/bash
TERM=xterm
HISTSIZE=1000
ODBC_DIR=/usr/local/easysoft/unixODBC
OLDPWD=/usr/local/easysoft
SSH_SESSION_ID=1424
SSH_TTY=/dev/pts/0
LD_LIBRARY_PATH=/usr/local/easysoft/lib:/usr/local/easysoft/unixODBC/lib
A__z="*SHLVL
TNS_ADMIN=/usr/local/easysoft/Oracle/InstantClient112/network/
INPUTRC=/etc/inputrc
PWD=/tmp
LANG=en_US.UTF-8
ODBCSYSINI=/etc/
HOME=/root
SHLVL=3
ODBCINI=/etc
LESSOPEN=|/usr/bin/lesspipe.sh %s
Oracle_HOME=/usr/local/easysoft/Oracle/InstantClient112/
G_BROKEN_FILENAMES=1
_=/bin/env
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/local/easysoft/unixODBC/bin:/opt/oraClient/11.2.0.4/bin
Correction d'un problème d'origine avec les mises à jour de LD_LIBRARY_PATH, mais maintenant il est à nouveau cassé car j'essaie d'utiliser le client Oracle 32 bits.
Client Oracle 32 bits installé dans le répertoire /opt/oraClient/11.2.0.4_32/.
Modifié le odbcinst.ini:
[Oracle 11g ODBC driver]
Description=Oracle ODBC driver for Oracle 11g
#Driver=/usr/local/easysoft/Oracle/InstantClient112/lib/libsqora.so.11.1
Driver=/opt/oraClient/11.2.0.4_32/lib/libsqora.so.11.1
FileUsage=1
Erreur:
[root@xxxxx lib]# /usr/local/bin/isql -v NAME
[01000][unixODBC] [Driver Manager]Can't open lib '/opt/oraClient/11.2.0.4_32/lib/libsqora.so.11.1' : file not found
[ISQL]ERROR: Could not SQLConnect
Si j'ai besoin d'utiliser le client Oracle 32 bits, qu'est-ce que je fais mal ... Je sais que c'est quelque chose dans les variables environnementales.
[root@xxxxx lib]# file /opt/oraClient/11.2.0.4_32/lib/libsqora.so.11.1
/opt/oraClient/11.2.0.4_32/lib/libsqora.so.11.1: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), not stripped
J'active la trace mais je ne peux pas joindre de document ici. Je peux envoyer un e-mail.
Plus d'informations de débogage:
[root@xxxxx bin]# ldd /opt/oraClient/11.2.0.4_32/lib/libsqora.so.11.1
ldd: warning: you do not have execution permission for `/opt/oraClient/11.2.0.4_32/lib/libsqora.so.11.1'
linux-gate.so.1 => (0xffffe000)
libdl.so.2 => /lib/libdl.so.2 (0xf7f2b000)
libm.so.6 => /lib/libm.so.6 (0xf7f02000)
libpthread.so.0 => /lib/libpthread.so.0 (0xf7ee8000)
libnsl.so.1 => /lib/libnsl.so.1 (0xf7ecf000)
libclntsh.so.11.1 => not found
libodbcinst.so.1 => not found
libc.so.6 => /lib/libc.so.6 (0xf7d71000)
/lib/ld-linux.so.2 (0x00134000)
Je n'en reçois pas un "introuvable" qui peut causer des problèmes:
[root@xxxxx bin]# ls /opt/oraClient/11.2.0.4_32/lib/libclntsh.so.11.1
/opt/oraClient/11.2.0.4_32/lib/libclntsh.so.11.1
Voici la sortie env la plus récente:
[root@xxxxx]# env
HOSTNAME=xxxxx
SSH2_TTY=/dev/pts/0
TERM=xterm
Shell=/bin/bash
HISTSIZE=1000
ODBC_DIR=/usr/local/easysoft/unixODBC
SSH_TTY=/dev/pts/0
LD_LIBRARY_PATH=/opt/oraClient/11.2.0.4_32/:/opt/oraClient/11.2.0.4_32/lib/:/usr/local/easysoft/Oracle/InstantClient112:/usr/local/easysoft/Oracle/InstantClient112/lib/
TNS_ADMIN=/opt/oraClient/11.2.0.4_32/network/
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/local/easysoft/unixODBC/bin:/opt/oraClient/11.2.0.4_32/bin
INPUTRC=/etc/inputrc
LANG=en_US.UTF-8
ODBCSYSINI=/etc/
SHLVL=4
HOME=/root
ODBCINI=/etc
Oracle_HOME=/opt/oraClient/11.2.0.4_32/
G_BROKEN_FILENAMES=1
_=/bin/env
Cette erreur est trompeuse:
The file that the error claimed was not present did exist.
J'ai pu chasser le fichier manquant en exécutant:
# ldd /path/to/your/socalled/missing/file.so
Cela a renvoyé une série de fichiers et l'un d'eux a déclaré:
libodbcinst.so.2 => not found
C'était le coupable pour moi. J'ai ensuite créé le lien dont j'avais besoin et le tour est joué, l'erreur a disparu.
réf: http://mailman.unixodbc.org/pipermail/unixodbc-support/2011-November/003018.html
Le client instantané n'a pas de répertoire lib
. Si vous avez téléchargé le instantclient-odbc-linux
package et décompressé au même emplacement que le package de base, puis le libsqora.so.11.1
le fichier sera durablement sous /usr/local/easysoft/Oracle/InstantClient112
.
Votre fichier .ini doit donc pointer vers:
Driver=/usr/local/easysoft/Oracle/InstantClient112/libsqora.so.11.1
Notez l'extension cependant; vous souhaiterez peut-être l'associer à libsqora.so
. Si vous avez déplacé le .so
fichiers dans un sous-répertoire après avoir décompressé (?) alors vous aurez besoin de:
Driver=/usr/local/easysoft/Oracle/InstantClient112/lib/libsqora.so.11.1
Il semble que vous ayez réoriganisé les fichiers clients instantanés après la décompression, en créant un répertoire lib
. Je ne sais pas si cela vous causera directement des problèmes. Mais vous n'avez pas non plus défini LD_LIBRARY_PATH
, comme le suggèrent instructions d'installation :
Étapes d'installation:
Téléchargez les packages Instant Client appropriés pour votre plateforme. Toutes les installations nécessitent le package de base.
Décompressez les packages dans un seul répertoire tel que "instantclient".
Définissez le chemin de chargement de la bibliothèque de votre environnement dans le répertoire de l'étape 2 ("client instantané"). Sur de nombreuses plates-formes UNIX, LD_LIBRARY_PATH est la variable d'environnement appropriée. Sous Windows, PATH doit être utilisé.
Démarrez votre application et profitez-en.
Il est clair que l'étape (4) ne fonctionne pas encore pour vous, mais je pense que c'est parce que vous n'avez pas effectué l'étape (3); et je pense que comme vous avez divisé les fichiers - ce qui pourrait lui-même causer un problème - vous devrez peut-être inclure les deux .../InstantClient112
et .../InstantClient112/lib
dans le LD_LIBRARY_PATH
variable. Et assurez-vous que la valeur modifiée est exportée. Je ne sais pas pourquoi vous souhaitez réorganiser les fichiers.