Sélectionner une page

Service to Start/Stop Oracle Database Automatically on Linux RHEL 7

Au cours de cette procédure, nous allons voir comment fonctionne les services Linux. Le but sera de créer un service Oracle qui permettra de lancer et de stopper automatiquement une ou plusieurs bases de données Oracle sur un serveur Linux RHEL 7. Le test que nous réalisons ci dessous fonctionne pour des bases Oracle en version 12.2.

 

Gestion des services sous Linux 7

Sur Red Hat Enterprise Linux 7 (RHEL 7), les scripts init (/etc.init.d) ont été remplacés par des unités de service (« service units »).
Les unités de service se terminent par l’extension de fichier .service et ont un but similaire à celui des scripts init.

Pour afficher, lancer, arrêter, redémarrer, activer ou désactiver des services système, nous utilisons désormais la commande systemctl.

Ci dessous un tableau récapitulatif :

Action RHEL 5 et 6 RHEL 7
Lancer un service service nom start systemctl start nom.service
Arrêter un service service nom stop systemctl stop nom.service
Redémarre un service service nom restart systemctl restart nom.service

Action 1 : Création de notre nouveau service oracledb

  • Fichier d’environnement

Le première étape consiste à créer un fichier d’environnement afin d’y insérer nos variables utiles pour ce nouveau service :

[root@linux7 ~]# vi /etc/sysconfig/env.oracledb
ORACLE_BASE=/opt/oracle/
ORACLE_HOME=/opt/oracle/product/12.2.0/db_1
ORACLE_SID=TESTBDD

Une fois le fichier d’environnement créé, nous passons à la création du service en lui même. Nous allons détailler cela au maximum car plusieurs paramétrages sont possibles.

  • Service oracledb.service

Une fois le fichier d’environnement créé, il faut maintenant s’atteler au fichier .service. Pour cela, voici un script qui a été testé par nos soins sur un Linux 7 avec une version 12.2 de Oracle Database :

[root@linux7]# vi /usr/lib/systemd/system/oracledb.service
[Unit]
Description=Oracle databases service
Before=shutdown.target multi-user.target 
After=opt-oracle.mount

[Service]
Type=forking
EnvironmentFile=/etc/sysconfig/env.oracledb
User=oracle
Group=oinstall
ExecStart=/opt/oracle/product/12.2.0/db_1/bin/dbstart /opt/oracle/product/12.2.0/db_1 &
ExecStop=/opt/oracle/product/12.2.0/db_1/bin/dbshut /opt/oracle/product/12.2.0/db_1

[Install]
WantedBy=multi-user.target

NB : /opt/oracle/product/12.2.0/db_1 = votre $ORACLE_HOME (à adapter en fonction de votre installation Oracle)

  • Explication des paramètres

Description= description significative du service
Before= avant quel service va se lancer le ExecStop
After= quel pré-requis est nécessaire pour le fonctionnement du service, autrement dit, après quel service va se lancer le ExecStart

[Service] Type= type de service
EnvironmentFile= chemin absolu du fichier environnement créé ci dessus
User= user avec lequel doit se lancer le ExecStart et ExecStop
Group= groupe avec lequel doit se lancer le ExecStart et ExecStop
ExecStart= indique la commande à exécuter au lancement du service (paramètre obligatoire)
ExecStop= indique la commande à exécuter pour arrêter le service (paramètre facultatif)

[Install] WantedBy= spécifie dans quel Target doit être actif le service. En mettant multi-user.target, le service est actif dans les Runlevels 2, 3, 4 et 5.

  • Les types de services possibles

simple : un service de type simple (type par défaut) lance un processus principal.
forking : un service de type forking, lance un processus père qui créera un processus fils dans le cadre de son démarrage.
oneshot : un service de type oneshot est similaire à un service de type simple. Cependant, systemd attend que le processus se termine avant de continuer ses traitements.
dbus : un service de type dbus est similaire à un service de type simple. Cependant, le processus du service doit obtenir un nom via D-Bus. systemd pourra alors traiter les autres unités.
notify : un service de type notify est similaire à un service de type simple. Cependant, c’est le processus du service qui avertira systemd (via la fonction sd_notfy(3)) qu’il peut traiter les autres unités.

 

Action 2 : Vérification de votre fichier /etc/oratab

Le service que nous venons de créer utilise les scripts natifs Oracle : dbstart et dbshut. Ces scripts se basent sur le fichier de configuration /etc/oratab. Il faut donc paramétrer ce dernier de la bonne manière.

[root@linux7 ~]# cat /etc/oratab
OTHERBDD:/opt/oracle/product/12.2.0/db_1:Y
TESTBDD:/opt/oracle/product/12.2.0/db_1:Y

Le premier champ est le nom de votre base de données (ici TESTBDD), le second est le répertoire oracle (équivalent à $ORACLE_HOME) et le troisième indique à dbstart/dbshut si la base de données doit (ou ne doit pas) démarrer automatiquement lors du démarrage du système. Il faut donc vérifier ce dernier paramètre : Y ou N.

Nous devons donc changer le dernier champ et le passer à Y pour permettre le lancement de la base de données via le nouveau service que nous sommes en train de créer.

NB : il est possible d’avoir plusieurs bases de données dans le fichier /etc/oratab, dans ce cas là si les bases ont toutes le paramètre à Y (comme ci dessus), toutes les bases seront démarrées/arrêtées. A vous donc d’adapter le fichier /etc/oratab en fonction de vos besoins.

Un dernier point concernant les scripts dbstart et dbshut, depuis la version 12 d’Oracle, ces scripts embarquent le lancement et l’arrêt du listener, ce qui est pratique car nous avons qu’un seul service à créer.

Si vous êtes sur une version Oracle antérieure à la version 12, il faudra créer un second service qui gérera spécifiquement le listener (le listener sera à lancer avant la base et il faudra le stopper après l’arrêt de la base).

 

Action 3 : Rechargement de la configuration des services en mémoire

Pour que la modification soit effective au niveau de l’OS, il faut recharger la configuration des services en mémoire via la commande suivante :

[root@linux7]# systemctl daemon-reload

Nous pouvons ensuite vérifier que notre service a bien été créé :

[root@linux7]# systemctl list-unit-files --type service|grep oracle
oracledb.service disabled

En revanche il n’est pas actif (disabled). Pour l’activer au démarrage (enabled) voici la commande à passer :

[root@linux7]# systemctl enable oracledb.service
Created symlink from /etc/systemd/system/multi-user.target.wants/oracledb.service to /usr/lib/systemd/system/oracledb.service

Voici le résultat :

[root@insa-dboracle1 ~]# systemctl list-unit-files --type service|grep oracle
oracledb.service enabled

 

Action 4 : Tests de lancement et d’arrêt du service

Une fois que tout est créé et actif, nous pouvons procéder au lancement “manuel” du service puis nous vérifierons son statut (en ligne de commande) :

[root@linux7]# systemctl start oracledb
[root@linux7]# systemctl status oracledb
● oracledb.service - Oracle databases service
   Loaded: loaded (/usr/lib/systemd/system/oracledb.service; enabled; vendor preset: disabled)
   Active: active (running) since lun. 2020-04-06 11:23:26 CEST; 23h ago
  Process: 2174 ExecStart=/opt/oracle/product/12.2.0/db_1/bin/dbstart /opt/oracle/product/12.2.0/db_1 & (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/oracledb.service
           ├─  2199 /opt/oracle/product/12.2.0/db_1/bin/tnslsnr LISTENER -inherit
           ├─  2301 ora_pmon_TESTBDD
           ├─  2303 ora_clmn_TESTBDD
           ├─  2305 ora_psp0_TESTBDD
           ...
           ... (vous verrez ici toute une liste de processus Oracle liés à votre base)
           ...
avril 06 11:23:08 linux7 systemd[1]: Starting Oracle databases service...
avril 06 11:23:08 linux7 dbstart[2174]: Processing Database instance "TESTBDD": log file /opt/oracle/product/12.2.0/db_1/startup.log
avril 06 11:23:26 linux7 systemd[1]: Started Oracle databases service.

 

Nous  constatons que le démarrage en ligne de commande est bien fonctionnel.

 

Action 5 : Terminer la procédure

Nous vous proposons maintenant de faire un reboot de votre machine afin de vérifier que l’arrêt se fait correctement ainsi que la relance automatique lors du démarrage de la machine.

Pour cela, il vous suffira de vérifier les fichiers de logs startup.log et shutdown.log présents dans votre $ORACLE_HOME.