Intéressé par des cours d'informatique en ligne ?
Visitez mon nouveau site https://www.yesik.it !

SQL*Plus ne veut pas démarrer...

Je me sers régulièrement de SQL*Plus pour me connecter à Oracle. Comme j'utilisais encore la version 11.1, hier soir, je me suis mis en tête de mettre à jour la version installée sur ma machine de développement.

Tant qu'à faire, j'ai carrément téléchargé la version 12.1. Je ne pensais pas avoir de difficultés particulières car habituellement, installer SQL*Plus sous Linux nécessite juste de dézipper les archives instantclient-basic-linux.x64... et instantclient-basic-linux.x64... puis de configurer quelques variables d'environnement:

sh# mkdir -p /opt/oracle
sh# cd /opt/oracle
sh# unzip /path/to/instantclient-basic-linux.x64-12.1.0.2.0.zip
sh# unzip /path/to/instantclient-sqlplus-linux.x64-12.1.0.2.0.zip

# Plus nécessaire avec Oracle 12, mais indispensable avec 11.1 et 11.2
# (je laisse la commande ici pour mémoire)
sh# ln -s libclntsh.so.12.1 instantclient_12_1/libclntsh.so

Sauf que cette fois ci, au moment de tester:

sylvain$ export ORACLE_INSTANTCLIENT="/opt/oracle/instantclient_12_1"
sylvain$ export LD_LIBRARY_PATH="$ORACLE_INSTANTCLIENT/lib:$LD_LIBRARY_PATH"
sylvain$ export PATH="$ORACLE_INSTANTCLIENT/bin:$PATH"

sylvain$ sqlplus

<-- rien

Rien. Rien de rien. Pas un message d'erreur. Pas d'activité visible. Processus bloqué. Hein ?!?

Un rapide coup d’œil avec strace confirme que le processus est bloqué, visiblement au moment, ou juste après avoir récupéré les informations sur l'utilisateur courant dans /etc/passwd:

open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 9
lseek(9, 0, SEEK_CUR)                   = 0
fstat(9, {st_mode=S_IFREG|0644, st_size=1868, ...}) = 0
mmap(NULL, 1868, PROT_READ, MAP_SHARED, 9, 0) = 0x7f5fb379b000
lseek(9, 1868, SEEK_SET)                = 1868
fstat(9, {st_mode=S_IFREG|0644, st_size=1868, ...}) = 0
munmap(0x7f5fb379b000, 1868)            = 0
close(9)                                = 0
futex(0x7f5faf60d640, FUTEX_WAIT_PRIVATE, 2, NULL

Or, justement, sur mon réseau les informations relatives aux utilisateurs sont stockées dans un annuaire LDAP, et pas dans /etc/passwd. Et en testant de manière plus approfondie, j'ai constaté que SQL*Plus fonctionnait parfaitement lorsqu'il était lancé à partir du compte d'un utilisateur local.

Curieusement, SQL*Plus version 11.1 ne présente pas du tout ce dysfonctionnement. Mais il apparaît avec les versions 11.2 et 12.1.

Workarround

Je n'ai guère eu le temps de pousser mes investigations sur ce problème. Je ne saurais pas dire si c'est un bug dans les logiciels Oracle, ou dans Debian Jessie (unstable) ou simplement une erreur de configuration de libpam-ldap ou libnss-ldap.

Toujours est-il qu'un workarround rapide consiste à ajouter une entrée dans /etc/passwd pour les utilisateur qui doivent utiliser SQL*Plus. Ce n'est pas très élégant, et cela reduit un peu l'intérêt d'utiliser un annuaire LDAP. Mais au moins "ça fonctionne"...

Donnez votre avis!  Venez commenter cet article sur Google+