Linux : se connecter à un serveur Oracle

Publié le 25 January 2019

L’installation

Dans le cadre de mon travail, j’ai dû lancer des requêtes Oracles depuis un serveur sous Linux. Et quand on n’a jamais travaillé avec Oracle c’est une grosse galère. Voici ma procédure, testée sur Ubuntu 18.04. Elle est très largement inspirée de https://manjaro.site/how-to-install-sqlplus-utility-on-ubuntu-18-04-and-ubuntu-18-10/.

D’abord il faut aller sur le site officiel d’Oracle pour télécharger le client SQL*Plus. Les deux fichiers à télécharger sont instantclient-basic-linux.x64-12.2.0.1.0.zip et instantclient-sqlplus-linux.x64-12.2.0.1.0.zip. Le téléchargement nécessite un compte Oracle. J’en ai créé un pour l’occasion.

Ensuite on mets les deux fichiers dans le dossier /opt/oracle, et on les extrait :

unzip instantclient-basic-linux.x64-12.2.0.1.0.zip
unzip instantclient-sqlplus-linux.x64-12.2.0.1.0.zip

Puis on corrige quelques liens :

cd /opt/oracle/instantclient_12_2
ln -s libclntsh.so.12.1 libclntsh.so
ln -s libocci.so.12.1 libocci.so

Et pour terminer on installe libaio :

apt-get install libaio1

Il ne reste plus qu’à lancer la commande sqlplus pour tester :

LD_LIBRARY_PATH=/opt/oracle/instantclient_12_2 /opt/oracle/instantclient_12_2/sqlplus

Il est obligatoire de renseigner la variable d’environnement LD_LIBRARY_PATH, sinon SQL*Plus ne retrouve pas ses bibliothèques.

L’utilisation

L’utilisation de SQL*Plus est particulière. Je pense que c’est dû au fonctionnement d’Oracle. Il n’est pas possible de passer la requête en paramètre, comme avec MySQL ou PostgreSQL. J’ai d’ailleurs bien galéré à trouver comment spécifier les paramètres de connexion en ligne de commande.

Donc, il faut créer un fichier /usr/lib/oracle/tablespace.ext (par exemple), contenant :

SELECT
  tablespace_name
FROM
  dba_data_files
GROUP BY
  tablespace_name;
EXIT

Notez le EXIT; à la fin. C’est indispensable sinon SQL*Plus ne rends pas la main.

Cette commande doit afficher la liste des tablespaces sur la base Oracle. Ça me servira plus tard pour mettre en place la supervision.

Pour lancer la requête, ça se passe avec la commande suivante :

LD_LIBRARY_PATH=/opt/oracle/instantclient_12_2 /opt/oracle/instantclient_12_2/sqlplus -s "user/password@ (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 1.2.3.4)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = NOM_DU_SERVICE)))" @/usr/lib/oracle/tablespace.ext

Je ne pourrais pas détailler les paramètres de cette commande, c’est un gros sac de nœuds. C’est un admin Oracle qui m’a fourni le tout, je me contente d’appliquer. Pensez juste à remplacer les bons paramètres (nom d’utilisateur, mot de passe, adresse IP, nom du service et éventuellement port).

Chez moi ça donne :

root@SV-TCA-ZPXSCP01+~# LD_LIBRARY_PATH=/opt/oracle/instantclient_12_2 /opt/oracle/instantclient_12_2/sqlplus -s "user/password@ (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 1.2.3.4)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = NOM_DU_SERVICE)))" @/usr/lib/oracle/tablespace.ext

TABLESPACE_NAME
------------------------------
ZABBIX_TS
UNDOTBS1
SYSAUX
USERS
SYSTEM
WF_TABLE

6 rows selected

C’est gagné, j’ai bien récupéré la liste des tablespaces. Ma requête a fonctionné.

Dans le prochain article je vais détailler comment mettre en place une supervision des tablespaces Oracle avec Zabbix, en utilisant SQL*Plus.