Améliorer sqlplus, rman, et autres avec rlwrap

Cet article vous concernera si vous avez déjà fait face à la situation suivante:

  • Saisir une longue commande dans sqlplus ou rman et se rendre compte qu’il y avait une erreur de syntaxe en début de ligne.
  • Répéter plusieurs fois la même instruction avec parfois une petite modification.
  • Pester à devoir saisir en entier v$flash_recovery_area_usage ou dba_cacheable_nontable_objects sans se tromper.

Dans ces cas là, rlwrap sera votre sauveur, votre main tendue du ciel et vous demanderez comment vous avez pu passer à coté depuis toutes ces années.En résumé, les étapes qui suivent vous permettrons d’ajouter l’historique des commande et l’auto-suggestion à votre shell sqlplus, rman, dgmgrl ou adrci avec rlwrap.

Télécharger les fichiers de la bonne version de rlwrap

Il va vous falloir le bon rpm de rlwrap, ainsi que le fichier contenant le dictionnaire des suggestions. Vous pouvez essayer RPM Find ou RPM Pbone . Que vous soyez sous RedHat, CentOS ou Oracle Enterprise Linux, le paquet sera le même, veillez tout de même à prendre le rpm adapté à l’architecture (32 ou 64bits) et la version majeure OEL4 ou OEL5, exemple:

  • rlwrap-0.30-1.el4.i386.rpm pour un bon vieux Red Hat 4.x
  • rlwrap-0.37-1.el5.x86_64.rpm pour le dernier OEL5 en 64bits

Puis le fichier . oracle_keywords contenant les mots clés que l’on veut voir apparaître en tabulant. Pour le créer, j’ai commencé par y ajouter le retour de la commande

select table_name from dict order by 1;

Puis tout mot que je saisis d’habitude dans une commande sqlplus, rman, adcri ou autre. Pour permettre de mieux gérer le fichier, les mots sont triés par ordre alphabétique:

AL32UTF8 accept account all alter and any array arrow as asc at append archive archivelog attribute autobackup
backup backupset begin between by break btitle
catalog case change character check clear clusters cluster colauth columns compress compute configure connect control controlfile copies copy crash create current
database datafile decimal declare default delete deletion desc device disconnect disk distinct drop define
...

Installation

  • Donc on installe (ou fait installer) le rpm de la façon classique, en root:
  • rpm -ivh rlwrap-0.37-1.el5.x86_64.rpm
  • Puis en oracle, on dépose le fichier .oracle_keywords dans le dossier racine /home/oracle
  • On ajoute les alias de lancement dans le .bashrc de l’utilisateur oracle
  • alias sqlplus='/usr/bin/rlwrap -if $HOME/.oracle_keywords $ORACLE_HOME/bin/sqlplus'
    alias rman='/usr/bin/rlwrap -if $HOME/.oracle_keywords $ORACLE_HOME/bin/rman'
    alias adrci='/usr/bin/rlwrap -if $HOME/.oracle_keywords $ORACLE_HOME/bin/adrci'
    alias dgmgrl='/usr/bin/rlwrap -if $HOME/.oracle_keywords $ORACLE_HOME/bin/dgmgrl'
  • Explications :
    • L’option -i précise à rlwrap d’être insensible à la casse lors de l’auto-suggestion
    • L’option -f précise le fichier contenant les mots clés, on peut alors pour affiner l’utilisation gérer des fichiers différents en fonction des binaires appelés : pas besoin de tous les nom de vues/tables dans les session RMAN ou ADRCI
    • Le fichier .oracle_keywords est placé dans le dossier racine de l’utilisateur oracle, si vous avez l’accès root au serveur ET que vous souhaitiez mettre ce fichier en commun à l’utilisateur grid (Vous êtes sur un RAC 11gR2), alors mettez le dans /etc, sinon dans le dossier racine de grid, ça ira très bien aussi, et là ne rajouter que les mots clés utilisés dans une session asmcmd par exemple
  • On recharge le fichier .bashrc, et on teste avec la commande alias ou which (petit rappel linux, toujours bon ;))
  • source .bashrc
    ...
    alias
    alias adrci='/usr/bin/rlwrap -if /etc/SQL.dict $ORACLE_HOME/bin/adrci'
    alias dgmgrl='/usr/bin/rlwrap -if /etc/SQL.dict $ORACLE_HOME/bin/dgmgrl'
    ...
    which sqlplus
    alias sqlplus='/usr/bin/rlwrap -if $HOME/.oracle_keywords $ORACLE_HOME/bin/sqlplus'
     /usr/bin/rlwrap

On est donc prêt à travailler.

Utilisation

  • On appelle sqlplus, rman ou autre avec l’alias et non le binaire Oracle directement

Puis dans la session, c’est comme dans un shell bash:

  • Flèches gauche + droite pour se déplacer dans une ligne saisie.
  • Flèches haut + bas pour naviguer dans les dernières commandes saisies.
  • Ctrl+r « une partie de la commande » pour afficher la dernière commande comportant cette expression, puis Ctrl+r pour afficher les autres commandes, même réalisées dans des sessions précédentes.
  • Tabulation pour l’auto-suggestion: Faites « sel<tab> » et vous aurez « select »
  • Le caractère « $ » est considéré par rlwrap comme un séparateur de mot, donc pour travailler avec les vues V$ ou GV$, il faudra également saisir une partie du texte après le $, sinon la suggestion comportera la totalité des mots clé…

Sécurité

Il faut noter que l’historique des commandes est conservé dans les fichiers $HOME/.<binaire>_history:  .sqlplus_history, .rman_history, adrci_history, etc, si vous saisissez une commande du type

connect sysman/oracle123@orcl

pour vous connecter au schéma sysman, le mot de passe sera alors stocké en clair dans le fichier d’historique et donc accessible à n’importe qui/quoi pouvant disposer d’un accès en lecture au serveur ou d’un exploit plus complexe d’une faille de sécurité; et comme cela arrive que le mot de passe sysman soit le même que sys, un petit shutdown abort devient alors possible …
Donc morale de l’histoire : ne saisir les mots de passe que lorsque le prompt le réclame!

3 réflexions sur “Améliorer sqlplus, rman, et autres avec rlwrap”

  1. Excellent !
    Do you mind if I publish a post referencing yours ?
    It’s great news for people like me who have ever been expected this to be possible !
    Cheers,
    Gilles

Les commentaires sont fermés.