Installer un logiciel Oracle est ennuyeux à mourir !
Evidemment, si vous utilisez Oracle Linux, vous utilisez oracle-validated, oracle-rdbms-server-11gR2-preinstall et oracle-rdbms-server-12cR1-preinstall RPMs pour créer automatiquement les utilisateurs, positionner les bons paramètres et installer les RPM… Et pourtant !
Une fois que tous les pré-requis sont atteints, il vous faudra (1) télécharger la distribution Oracle dans un espace accessible depuis la machine, (2) exécuter l’ « Installer » Oracle, (3) appliquer le « dernier » PSU et (4) exécuter le script root.sh. Bien entendu, vous pouvez également utiliser les capacités de clone des logiciels pour aller plus vite. Pourquoi ne pas réaliser l’ensemble de ces opérations en une seule commande ?
La première partie de cet article explique comment créer un RPM qui contiendra Oracle 12c pour Oracle Linux 6 x86_64. Une fois le RPM créé, la seconde partie de l’article présente comment ajouter un référentiel YUM à vos serveurs pour que l’installation devienne aussi simple que la commande "yum install"
.
Quelques questions avant de commencer
Avant de vous précipiter sur la section technique de cet article, voici quelques questions que vous pourriez vous poser :
Question: Pourquoi est-ce que ça n’a pas été fait avant ?
Il n’y a rien de fondamentalement neuf dans cette méthode. Les DBA utilisent ce type d’approche depuis plusieurs années même s’il y a peu d’articles à ce sujet sur Internet. D’ailleurs, concernant ce thème précis, vous serez certainement intéressés par cet article de Martin Bach[1] ! Toujours pas convaincu ? Si vous êtes familier d’Oracle, vous aurez certainement remarqué qu’Oracle XE est disponible sous la forme d’un RPM pour Oracle Linux ! Quoiqu’il en soit, avec Oracle/Redhat Linux 5, cette méthode n’était pas aussi simple à utiliser qu’elle l’est maintenant avec Oracle Linux 6 x86_64. En effet, jusqu’à la version 4.6 des RPMs[2] et sur les versions 32 bits de Linux, la taille maximale d’un fichier était de 2Go. Oracle Linux 6 x86_64 qui embarque la version 4.8 de RPM fonctionne désormais sans problème.
Question: Pourquoi ne pas fournir les RPM pour Suse et Redhat ?
Il est tout à fait possible de réaliser des RPM pour les autres plateformes supportées par Oracle telles que Suse ou Redhat. Néanmoins, le fait que oracle-rdbms-server-12cR1-preinstall n’existe pas sur ces plateformes vous obligera à récupérer ou créer votre équivalent afin de vous assurer que les pré-requis système sont correctement positionnés. Même si cela ne présente pas de grande difficulté, cela dépasse un peu le périmètre de cet article. Une autre raison est qu’Oracle Linux est particulièrement bien adapté pour les logiciels Oracle : cela permet de ne bénéficier que d’un seul support. C’est généralement moins cher que ses équivalents Linux et surtout Oracle Linux contient des fonctionnalités en plus comme UEK2 et KSplice.
Question: Quels sont les avantages et inconvénients de cette méthode ?
Malheureusement, utiliser des RPM n’est pas une panacée et il y a plusieurs raisons pour lesquelles vous pourriez ou voudriez utiliser une méthode plus conventionnelle. La première raison est lorsque vous voulez utiliser des outils qui nécessitent des configurations lors de l’installation tels que ASM ou l’Infrastructure Grid. Dans ces cas, s’appuyer sur des RPM n’a que peu d’intérêt. Un autre problème avec les RPM est la destination de la distribution sur le serveur qui peut mutualiser plusieurs systèmes de base de données. Pour plus d’information à ce sujet, reportez-vous à la section “Etape 2 – A propos des HOME, BASE et Inventaire”.Enfin, vous pouvez avoir des inquiétudes quant à la façon dont les RPM peuvent parfois gérer les mises à jour. D’un autre côté cette méthode est extrêmement efficace et particulièrement lorsque vous utilisez des technologies de virtualisation telles qu’Oracle VM.
Question: Est-ce que je peux obtenir le code source ?
Oui. Je prévois de déposer le projet sur un repository Git public avec une licence GPL. Il reste encore pas mal de travail pour gérer tous les cas ; il y a quelques problèmes référencés. En attendant cette publication, si ça vous intéresse, contactez-moi sur le twitter du blog @ArKZoYd; je vous enverrai le projet avec plaisir à la seule condition que vous me promettiez de m’envoyer vos remarques. Nous pouvons également construire des RPMs pour vous, mais ça c’est une autre histoire…
Etape 1 – Clone de logiciel Oracle
La manière la plus rapide d’installer un logiciel Oracle consiste à s’appuyer sur un clone. Cela permet de fournir directement la version de la distribution qui vous convient avec les bons niveaux de patchs. Pour construire un clone, commencez par réaliser une installation classique avec la méthode de votre choix. Une fois l’installation terminée, supprimez les logs du logiciel et créez un fichier tar compressé comme ci-dessous :
cd $ORACLE_HOME rm install/make.log rm install/*.log rm cfgtoollogs/oui/*.log rm cfgtoollogs/cfgfw/*.log cd .. sudo tar -zcvf oracledb-ee-121010.tar.gz db_1
Note:
Cette procédure suppose que leORACLE_HOME
se termine par le sous-répertoiredb_1
. Si ce n’est pas le cas, il faudra changer le script ci-dessus en conséquence. Il faudra également modifier la macro curloc dans le fichier de spécification de rpmbuild. Il est important de noter que tout ce que vous installerez, y compris l’Edition et les langues font partie du clone. Cet article suppose que le cloné créé est une base de données Oracle 12.1.0.1 Enterprise Edition.
Etape 2 – A propos de HOME, BASE et Inventaire
Et voici la mauvaise partie de l’histoire… Les RPMs ne devraient pas prendre de paramètre lors de l’installation. Evidemmement, il existe des moyens de contourner cette limite, y compris l’utilisation du paramètre --prefix
pour changer le chemin d’installation comme c’est implémenté ici. Néanmoins, il faut accepter comme principe fondamental l’idée qu’on essaiera autant que possible de ne pas utiliser de paramètre. La conséquence de ce point est qu’il faut faire des suppositions qui feront partie du paquet. C’est la raison principale pour laquelle créer un RPM global n’a probablement pas de sens. Dans le fichier de spécification de cet article vous supposerez notamment les valeurs suivantes :
- INVENTORY_LOC=/u01/app/oraInventory
- ORACLE_BASE=/u01/app/oracle
- ORACLE_HOME=$ORACLE_BASE/product/12.1.0/db_1
Pour rendre la solution flexible, ces valeurs sont positionnées sous la forme de macros et sont facilement modifiables pour vos propres besoins. Quoiqu’il en soit, une fois fixés, ils sont codés en dur dans le RPM pour l’ensemble de votre organisation.
Etape 3 – Fichier de spécification Rpmbuild
L’étape suivante consiste à créer un fichier de spécification pour rpmbuild que nous appellerons oracledb-ee-121010.spec
. Ce fichier permet de construire le RPM. Voici son contenu; vous pourrez le modifier pour créer des RPMS qui correspondent à vos besoins:
%define curloc db_1 %define inventory /u01/app/oraInventory %define base /u01/app/oracle %define home product/12.1.0/db_1 Name: oracledb-ee-121010 Version: 0.8 Release: 1.ol6 Summary: Oracle Database 12.1.0.1 in a RPM Vendor: Oracle Corp. Group: Applications/Databases License: Commercial URL: http://www.oracle.com Source0: oracledb-ee-121010.tar.gz BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) Prefix: %{base} Requires: oracle-rdbms-server-12cR1-preinstall AutoReqProv: no %description Oracle Database 12.1.0.1 Enterprise Edition is Oracle Flagship Database Server. The release included in this RPM requires you have purchased the appropriate License from Oracle. %prep %setup -q -n %{curloc} %pre curdir=`pwd` rdir=`echo "$RPM_INSTALL_PREFIX" |cut -d'/' -f 1-2`; if [ "$rdir" != "/u01" ]; then roots="/u01 and $rdir" else roots="/u01" fi if [ ! -d "/u01" ] || [ ! -d "$rdir" ]; then echo "$roots must exist to install the RPM" exit 1 else dsize=`df -Pk $rdir |tail -n 1|awk '{print $4}'` if [ "$dsize" -lt "6400000" ]; then echo "$rdir must contain at least 6.4GB to install" exit 1 fi fi if [ ! -f "/etc/oraInst.loc" ]; then echo "inventory_loc=%{inventory}" >/etc/oraInst.loc; echo "inst_group=oinstall" >>/etc/oraInst.loc; mkdir -p %{inventory}; chown oracle:oinstall %{inventory}/..; chown oracle:oinstall %{inventory}; chmod 664 /etc/oraInst.loc; fi if [ ! -d "$RPM_INSTALL_PREFIX" ]; then mkdir -p $RPM_INSTALL_PREFIX chown oracle:oinstall $RPM_INSTALL_PREFIX fi cd $RPM_INSTALL_PREFIX for i in `echo "%{home}"| tr '/' 'n'`; do if [ ! -d "$i" ]; then mkdir $i chown oracle:oinstall $i cd $i fi done cd $curdir %post curdir=`pwd` chown oracle:oinstall $RPM_INSTALL_PREFIX cd $RPM_INSTALL_PREFIX for i in `echo "%{home}"| tr '/' 'n'`; do chown oracle:oinstall $i cd $i done cd $curdir echo "" > /var/log/oracle.log chown oracle:oinstall /var/log/oracle.log su - oracle -c "cd $RPM_INSTALL_PREFIX/%{home}/clone/bin; perl clone.pl ORACLE_BASE=$RPM_INSTALL_PREFIX ORACLE_HOME=$RPM_INSTALL_PREFIX/%{home} DECLINE_SECURITY_UPDATES=true" >> /var/log/oracle.log $RPM_INSTALL_PREFIX/%{home}/root.sh >> /var/log/oracle.log %build mkdir -p $RPM_BUILD_ROOT%{prefix}/%{home} mv * $RPM_BUILD_ROOT%{prefix}/%{home} %install %clean rm -rf %{buildroot} %files %defattr(-,oracle,dba,-) %{prefix}/%{home}/* %changelog * Tue Jul 23 2013 Gregory Guillou 0.8 - Package for Oracle 12c R1
Pour plus d’information à propos de la manière de construire des RPM, lisez “Maximum RPM” de Edward C. Bailey sur rpm.org[4]. Vous trouverez ci-dessous quelques commentaires à propos de ce fichier :
- L’utilisateur
oracle
et ses groupes sont codés en dur comme c’est le cas pour le RPMoracle-rdbms-server-12cR1-preinstall
- curloc, inventory, base et home sont des macros. Elles sont définies au début du fichier de sorte qu’il est facile de les modifier et de les faire correspondre à vos besoins
- Voici quelques notes à propos de la section d’entête :
- Source0 définit l’endroit dans lequel réside votre clone de base de données. Le fichier doit s’appeler
oracledb-ee-121010.tar.gz
et être positionné dans le répertoire~/rpmbuild/SOURCES
de votre serveur Linux - Le RPM
oracle-rdbms-server-12cR1-preinstall
est obligatoire pour installer le RPM. C’est notamment la raison pour laquelle ce RPM ne fonctionnera pas avec RHEL - La valeur de
Prefix
permet de modifier la valeur deORACLE_BASE
et par conséquenceORACLE_HOME
au moment de l’installation. Ce paramètre optionnel est par défaut/u01/app/oracle
- “AutoReqProv: no” évite la génération automatique de dépendances par le système.
- Source0 définit l’endroit dans lequel réside votre clone de base de données. Le fichier doit s’appeler
- La section
%prep
change le nom du répertoire de la distribution dans le fichier in theoracledb-ee-121010.tar.gz
avec la valeur de la macro%curloc
- La section
%build
déplace le contenu du répertoireBUILD
dans le répertoireBUILDROOT
- La section
%file
définit l’ensemble des fichiers situés dansBUILDROOT
à copier dans le RPM ainsi que le propriétaire, le groupe et les droits - La section
%pre
valide la présence des répertoires et de l’espace nécessaire à l’installation - La section
%post
exécute les commandesclone.pl
etroot.sh
Etape 4 – Et voilà le RPM
Pour construire le RPM, mettez le fichier oracledb-ee-121010.tar.gz
dans le répertoire /home/oracle/rpmbuild/SOURCES
de votre serveur et lancez la commande « rpmbuild -bb oracledb-ee-121010.spec
» :
time rpmbuild -bb oracledb-ee-121010.spec
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.NE5Ehu
+ umask 022
+ cd /home/oracle/rpmbuild/BUILD
+ cd /home/oracle/rpmbuild/BUILD
+ rm -rf db_1
+ /usr/bin/gzip -dc /home/oracle/rpmbuild/SOURCES/oracledb-ee-121010.tar.gz
+ /bin/tar -xf -
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd db_1
+ /bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ exit 0
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.nWj1c5
+ umask 022
+ cd /home/oracle/rpmbuild/BUILD
+ cd db_1
+ mkdir -p /home/oracle/rpmbuild/BUILDROOT/oracledb-ee-121010-0.8-1.ol6.x86_64/u01/app/oracle/product/12.1.0/db_1
+ mv OPatch [...] /home/oracle/rpmbuild/BUILDROOT/oracledb-ee-121010-0.8-1.ol6.x86_64/u01/app/oracle/product/12.1.0/db_1
+ exit 0
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.NcQDaG
+ umask 022
+ cd /home/oracle/rpmbuild/BUILD
+ cd db_1
+ /usr/lib/rpm/brp-compress
+ /usr/lib/rpm/brp-strip
+ /usr/lib/rpm/brp-strip-static-archive
+ /usr/lib/rpm/brp-strip-comment-note
Processing files: oracledb-ee-121010-0.8-1.ol6.x86_64
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/oracle/rpmbuild/BUILDROOT/oracledb-ee-121010-0.8-1.ol6.x86_64
Wrote: /home/oracle/rpmbuild/RPMS/x86_64/oracledb-ee-121010-0.8-1.ol6.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.rZC3Vf
+ umask 022
+ cd /home/oracle/rpmbuild/BUILD
+ cd db_1
+ rm -rf /home/oracle/rpmbuild/BUILDROOT/oracledb-ee-121010-0.8-1.ol6.x86_64
+ exit 0
real 18m1.939s
user 15m1.701s
sys 2m26.325s
Le RPM est créé dans le répertoire /home/oracle/rpmbuild/RPMS/x86_64
. Vous pourrez vérifier les meta-données associées en lançant la commande ci-dessous :
rpm -qip ~/rpmbuild/RPMS/x86_64/oracledb-ee-121010-0.8-1.ol6.x86_64.rpm
Name : oracledb-ee-121010 Relocations: /u01/app/oracle
Version : 0.8 Vendor: Oracle Corp.
Release : 1.ol6 Build Date: Tue 23 Jul 2013 08:49:53 PM CEST
Install Date: (not installed) Build Host: sage.easyteam.fr
Group : Applications/Databases Source RPM: oracledb-ee-121010-0.8-1.ol6.src.rpm
Size : 5063616673 License: Commercial
Signature : (none)
URL : http://www.oracle.com
Summary : Oracle Database 12.1.0.1 in a RPM
Description :
Oracle Database 12.1.0.1 Enterprise Edition is Oracle Flagship Database Server.
The release included in this RPM requires you have purchased the appropriate
License from Oracle.
Step 5 – Tester l’installation
Enfin, vous n’oublierez pas de tester le RPM sur votre serveur. Pour réaliser ce test, supprimez l’installation précédente et réalisez plusieurs scénarios. Faites en sorte d’utiliser un serveur de test sur lequel vous n’avez aucune autre installation Oracle. Les manipulations de l’inventaire pourraient endommager vos autres installations:
- Test #1: Installer Oracle dans sa destination par défaut
sudo su - rm -f /etc/oraInst.loc rm -rf /u01/app cd /home/oracle/rpmbuild/RPMS/x86_64/ rpm -ivh oracledb-ee-121010-0.8-1.ol6.x86_64.rpm Preparing... ########################################### [100%] 1:oracledb-ee-121010 ########################################### [100%] su - oracle export ORACLE_HOME=/u01/app/oracle/product/12.1.0/db_1 export PATH=$ORACLE_HOME/bin:$PATH cd $ORACLE_HOME/OPatch ./opatch lsinv Oracle Home : /u01/app/oracle/product/12.1.0/db_1 Central Inventory : /u01/app/oraInventory from : /u01/app/oracle/product/12.1.0/db_1/oraInst.loc OPatch version : 12.1.0.1.0 OUI version : 12.1.0.1.0 Log file location :opatch2013-07-23_21-11-08PM_1.log Lsinventory Output file location :lsinventory2013-07-23_21- 11-08PM.txt -------------------------------------------------------------------------------- Installed Top-level Products (1): Oracle Database 12c 12.1.0.1.0 There are 1 products installed in this Oracle Home. There are no Interim patches installed in this Oracle Home. -------------------------------------------------------------------------------- OPatch succeeded.
- Test #2: Installer Oracle en modifiant la destination par défaut
sudo su - yum -y erase oracledb-ee-121010-0.8-1.ol6.x86_64 Loaded plugins: security Setting up Remove Process Resolving Dependencies --> Running transaction check ---> Package oracledb-ee-121010.x86_64 0:0.8-1.ol6 will be erased --> Finished Dependency Resolution Dependencies Resolved ========================================================================== Package Arch Version Repository Size ========================================================================== Removing: oracledb-ee-121010 x86_64 0.8-1.ol6 installed 4.7 G Transaction Summary ========================================================================== Remove 1 Package(s) Installed size: 4.7 G Is this ok [y/N]: y Downloading Packages: Running rpm_check_debug Running Transaction Test Transaction Test Succeeded Running Transaction Erasing : oracledb-ee-121010-0.8-1.ol6.x86_64 1/1 Verifying : oracledb-ee-121010-0.8-1.ol6.x86_64 1/1 Removed: oracledb-ee-121010.x86_64 0:0.8-1.ol6 Complete! rm -f /etc/oraInst.loc rm -rf /u01/app rm -rf /u02/app mkdir /u02 chown oracle:oinstall /u02 rpm -ivh oracledb-ee-121010-0.8-1.ol6.x86_64.rpm --prefix=/u02/app/oracle Preparing... ########################################### [100%] 1:oracledb-ee-121010 ########################################### [100%] su - oracle export ORACLE_HOME=/u02/app/oracle/product/12.1.0/db_1 export PATH=$ORACLE_HOME/bin:$PATH cd $ORACLE_HOME/OPatch ./opatch lsinv Oracle Interim Patch Installer version 12.1.0.1.0 Copyright (c) 2012, Oracle Corporation. All rights reserved. Oracle Home : /u02/app/oracle/product/12.1.0/db_1 Central Inventory : /u01/app/oraInventory from : /u02/app/oracle/product/12.1.0/db_1/oraInst.loc OPatch version : 12.1.0.1.0 OUI version : 12.1.0.1.0 Log file location :opatch2013-07-23_21-17-14PM_1.log Lsinventory Output file location :lsinv/lsinventory2013-07-23_21-17-14PM.txt -------------------------------------------------------------------------------- Installed Top-level Products (1): Oracle Database 12c 12.1.0.1.0 There are 1 products installed in this Oracle Home. There are no Interim patches installed in this Oracle Home. -------------------------------------------------------------------------------- OPatch succeeded.
Step 6 – Ce n’est pas encore terminé…
Une préoccupation importante de ce type d’approche est *toujours* la sécurité. Utilisez des clés PGP pour signer vos RPMs.
Une fois ces opérations terminées, vous devriez être à même de déployer votre RPM dans un référentiel YUM. C’est le sujet de la 2nde partie de cet article, alors « Stay tuned! »
Bibliographie:
[1] Provision Oracle RDBMS software via RPM, Martin Bach on December 13, 2011
[2] RPM 4.6.0 Release Notes
[3] Passing user defined argument to RPM is possible while installing? on Stackoverflow.com
[4] Maximum RPM