Installer Oracle 12c sur Linux avec un RPM (1/2)

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 le ORACLE_HOME se termine par le sous-répertoire db_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 RPM oracle-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 de ORACLE_BASE et par conséquence ORACLE_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.
  • La section %prep change le nom du répertoire de la distribution dans le fichier in the oracledb-ee-121010.tar.gz avec la valeur de la macro %curloc
  • La section %build déplace le contenu du répertoire BUILD dans le répertoire BUILDROOT
  • La section %file définit l’ensemble des fichiers situés dans BUILDROOT à 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 commandes clone.pl et root.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