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
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.