Introduction

L'installation du SGBD Oracle sur un serveur Linux peut sembler simple. Il y a toutefois des précautions à prendre afin d'obtenir une plate-forme stable. Ce billet présente l'installation de la version 12.2.0.1 de Oracle sur CentOS 7 en utilisant le mode silencieux, c'est à dire sans interface graphique. Dans les environnements de production l'unique accès étant via SSH cette méthode est plus efficace. De plus maîtriser l'installation silencieuse permet de scripter totalement les installations massives et de faciliter les déploiements.

Prérequis système

Avant de lancer l'installation, un certain nombre d'actions au niveau système sont nécessaires :

  • Packages complémentaires
  • Création d'un user oracle
  • Paramétrage du noyau
  • Configuration des limites

Packages requis

La documentation Oracle donne un grand nombre de packages à installer. En raison de la non utilisation de l'interface graphique ce nombre est réduit. Il est de plus inutile d'installer les package 32 bits.Cette version de Linux, ainsi que la version 12c de Oracle n'existe qu'en 64 bits.

Il est supposé que le serveur est installé avec une version de CentOS ou RedHAt 7. Une installation de type "Minimal Install" est réalisée.

Afin de faciliter le déploiement en réseau il est conseillé de désactiver complètement le pare-feu

systemctl stop firewalld
systemctl disable firewalld

Installation des packages via YUM

yum -y install compat-libcap1 gcc gcc-c++ ksh libaio-devel nfs-utils sysstat unzip bind-utils smartmontools

Autres packages. Ceux ci ne sont pas indispensables mais facilitent bien la vie...

yum -y install vim-enhanced wget psmisc net-tools
  • wget permet de charger un fichier depuis une URL.
  • psmisc contient la commande pstree et fuser ( indispensable pour PSU )
  • net-tools contient la commande ifconfig

Si les pluggables databases sont utilisées, il faut installer aussi le package PERL suivant afin d'utiliser le script catcon.pl.

yum -y install perl-TermReadKey

Création du user oracle

La documentation Oracle demande la création de divers groupes : oinstall, dba, oper... et d'un utilisateur dédié le plus souvent nommé oracle. En pratique tous ces groupes sont facultatifs utiliser oinstall et dba suffisent.

Création des groupes

groupadd oinstall
groupadd dba

Création du user oracle

useradd -g oinstall -G dba -p wt99ijrb/q0bo -d /home/oracle -s /bin/bash oracle

Le groupe principal est oinstall, le groupe secondaire dba. Le mot de passe est la version cryptée de "Manager12" et peut être obtenue ainsi :

perl -e 'print crypt(Manager12, "wtf")' 

Paramétrage noyau.

Oracle demande quelques ajustements du noyau Linux en particulier sur la gestion mémoire et les processus via les sémaphores.

De nombreuses documentations préconisent de configurer le noyau via différents fichiers situés sous /etc/sysctl.d et non directement dans /etc/sysctl.conf. La raison étant que un upgrade ou un ajout de RPM peut écraser la configuration en place. L'installeur de Oracle ne gère pas ceci, aussi les configurations sont faites uniquement dans /etc/sysctl.conf. Il est recommandé une fois l'installation faite de transférer tous les paramètres propres à Oracle dans un fichier de configuration sous /etc/sysctl.d et de les supprimer de /etc/sysctl.conf.

Ci dessous le fichier /etc/sysctl.conf utilisé.

# Memoire partagee
# kernel.shmall limite la taille de la shared memory ici 3Go sur les 4Go en place ( penser à la PGA et à l'OS... )
kernel.shmall = 786432
kernel.shmmax = 2072418304
kernel.shmmni = 4096

# Semaphores
kernel.sem = 250 32000 100 128

kernel.panic_on_oops = 1

# Nbre fichiers
fs.file-max = 6815744
fs.aio-max-nr = 1048576

# Reseau
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 4194304
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576

# Desactive totalement IPV6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

# Optimisation mémoire
vm.swappiness = 1
vm.dirty_background_ratio = 3
vm.dirty_ratio = 80
vm.dirty_expire_centisecs = 500
vm.dirty_writeback_centisecs = 100
  • Les valeurs type shm concernent la Shared Memory, donc la SGA de Oracle.
  • Les valeurs type sem concernent les sémaphores donc liées au paramètre PROCESSES de Oracle.
  • Les valeurs type net sont relatives au réseau.
  • Les valeurs type vm sont relatives à la mémoire et notamment sur la gestion des dirty block dans le database buffer cache.

Ne pas oublier que ces valeurs partent du principe que seul Oracle tourne sur le serveur. D'autres logiciels utilisent aussi la Shared Memory et les sémaphores.

Activer la configuration par la commande suivante :

sysctl -p

Paramétrage des limites

Les limites sont relatives aux ressources utilisées par un user particulier, en l'occurrence ici oracle. Sont concernées le nombre de processus et de fichiers ouverts.

Créer un fichier 99-oracle.conf sous /etc/security/limits.d avec les lignes suivantes :

oracle soft nproc 16384
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft stack 10240
oracle hard stack 32768

Ces limites n'influencent pas sur les performances. Par contre elles peuvent gêner leur bon fonctionnement.

La limite soft d'un utilisateur peut être modifiée par l'utilisateur lui-même, mais sans toutefois dépasser la limite hard.

Cette configuration permet de définir les limites soft et hard d'un user. La commande ulimit permet à un utilisateur de modifier ses limites pour le shell courant.

Modifier le fichier /etc/pam.d/login et ajouter la ligne suivante :

session required pam_limits.so

Dans le répertoire /etc/profile.d créer le fichier oracle.sh avec les lignes suivantes :

if [ $USER = "oracle" ]; then
  if [ $SHELL = "/bin/ksh" ]; then
    ulimit -p 16384
    ulimit -n 65536
  else
    ulimit -u 16384 -n 65536
  fi
fi

Binaires Oracle

Se connecter sur le site Oracle afin de récupérer les binaires. Le téléchargement est gratuit via un compte à créer ( également gratuit ). Choisir le fichier pour Linux 64 bits soit Linux x86-64

download_12c.png

Le fichier : linuxx64_12201_database.zip fait une taille d'environ 3,2Go. Une fois chargé le décompresser.

unzip linuxx64_12201_database.zip

Ceci va créer un sous répertoire nommé database sous lequel se trouve l'exécutable runInstaller.

Pour l'installation la norme OFA sera respectée, voir le billet suivant sur le sujet : Norme OFA

Créer le répertoire de base et affecter les bons droits

mkdir /ora01
chown oracle:oinstall /ora01

Il est de plus impératif que le nom d'hôte soit correctement résolu, soit par DNS, soit par /etc/hosts avec une ligne de ce type :

192.168.56.21 ora01.formation.maison ora01

Fichier réponse

L'installation se faisant en mode silence, il faut créer un fichier response. Suite à la décompression des binaires, dans le sous répertoire response, se trouve un fichier vierge : db_install.rsp qu'il suffit de compléter. Ci-dessous le fichier définitif. Ici seuls les binaires seront mis en place, pas de création de base par défaut.

oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v12.2.0
oracle.install.option=INSTALL_DB_SWONLY
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/ora01/app/oraInventory
ORACLE_HOME=/ora01/app/oracle/product/12.2.0.1/DB
ORACLE_BASE=/ora01/app/oracle
oracle.install.db.InstallEdition=EE
oracle.install.db.OSDBA_GROUP=dba
oracle.install.db.OSOPER_GROUP=
oracle.install.db.OSBACKUPDBA_GROUP=dba
oracle.install.db.OSDGDBA_GROUP=dba
oracle.install.db.OSKMDBA_GROUP=dba
oracle.install.db.OSRACDBA_GROUP=dba
SECURITY_UPDATES_VIA_MYORACLESUPPORT=false
DECLINE_SECURITY_UPDATES=true

Se connecter oracle et lancer l'installation

/home/oracle/database/runInstaller -silent -waitforcompletion -showprogress -responsefile /home/oracle/db12c.rsp

Un certain nombre d'informations s'affichent alors

Démarrage d'Oracle Universal Installer...

Vérification de l'espace temporaire : doit être supérieur à 500 Mo.   Réel 33855 Mo    Succès
Vérification de l'espace de swap : il doit être supérieur à 150 Mo.   Réel 4095 Mo    Succès
Préparation du lancement d'Oracle Universal Installer à partir de /tmp/OraInstall2017-07-11_09-17-49AM. Veuillez patienter...Le journal de cette session d'installation se trouve dans :
 /ora01/app/oraInventory/logs/installActions2017-07-11_09-17-49AM.log

Préparer en cours.
..................................................   8% Terminé.

Réussite de Préparer

Copier les fichiers en cours.
..................................................   17% Terminé.
..................................................   22% Terminé.
..................................................   27% Terminé.
..................................................   32% Terminé.
..................................................   40% Terminé.
..................................................   45% Terminé.
..................................................   50% Terminé.
..................................................   55% Terminé.
..................................................   60% Terminé.
..................................................   65% Terminé.
..................................................   70% Terminé.
..................................................   75% Terminé.
..................................................   80% Terminé.
....................
Réussite de Copier les fichiers

Lier les fichiers binaires en cours.
..........
Réussite de Lier les fichiers binaires

Fichiers de configuration en cours.
..............................
Réussite de Fichiers de configuration

Configurer l'inventaire en cours.

Réussite de Configurer l'inventaire

Réussite de Terminer la configuration
L'opération installation de Oracle Database 12c a réussi.
Pour plus de détails, consultez '/ora01/app/oraInventory/logs/silentInstall2017-07-11_09-17-49AM.log'.

Configurer Oracle Base en cours.

Réussite de Configurer Oracle Base
..................................................   95% Terminé.

En tant qu'utilisateur root, exécutez les scripts suivants :
	1. /ora01/app/oraInventory/orainstRoot.sh
	2. /ora01/app/oracle/product/12.2.0.1/DB/root.sh



..................................................   100% Terminé.
Successfully Setup Software.

En fin d'installation ouvrir une session en tant que root et passer les deux shell suivants:

/ora01/app/oraInventory/orainstRoot.sh
/ora01/app/oracle/product/12.2.0.1/DB/root.sh

Finalisation de l'installation

Il ne reste plus qu'à mettre en place certaines variables d'environnement pour le user oracle dans le fichier .bash_profile

export ORACLE_BASE=/ora01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/12.2.0.1/DB
export PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_OWNER=oracle
export NLS_LANG=FRENCH_FRANCE.UTF8 
export NLS_DATE_FORMAT='DD/MM/YYYY HH24:MI:SS'
export SQLPATH=$HOME/sql

La variable NLS_DATE_FORMAT permet d'avoir dans certains états, notamment RMAN, une datation précise ( par défaut le format est DD/MM/YY ).

Créer ensuite le répertoire $HOME/sql. Ce répertoire contiendra les scripts sql pouvant être lancés depuis SQL*Plus sans spécifier l'emplacement ( variable d'environnement SQLPATH ).

mkdir -p $HOME/sql

Dans ce répertoire est également situé le fichier login.sql, qui est lu à chaque lancement de SQL*Plus, et qui permet un paramétrage de l'environnement SQL*Plus. Créer ce fichier et y ajouter les lignes suivantes :

define _editor=vi
set sqlprompt '&_user.@&_connect_identifier. >'
set linesize 250
set pagesize 50

Ainsi sous SQL*Plus lors de l'appel de l'éditeur vi sera lancé en lieu et place de ed. Le prompt est redéfini afin d'afficher le user et l'alias Oracle*Net en cours lors de la session SQL*Plus.

Autre élément de confort, la possibilité de rappeler sous SQL*Plus les lignes précédentes. Il faut pour cela installer le package rlwrap qui n'est pas configuré dans les dépôts pour CentOS7. Un simple recherche sur le net permet de trouver le RPM correct par exemple

wget ftp://195.220.108.108/linux/epel/7/x86_64/r/rlwrap-0.42-1.el7.x86_64.rpm

Une fois téléchargé, l'installer via YUM

yum -y install rlwrap-0.42-1.el7.x86_64.rpm

Une fois cette installation faite, ajouter les alias suivants dans $HOME/.bashrc ( user oracle ).

alias sqlplus='rlwrap sqlplus'
alias rman='rlwrap rman'
alias adrci='rlwrap adrci'

Tester ensuite simplement la connexion SQL*Plus

[oracle@ora01 ~]$ sqlplus /nolog
SQL*Plus: Release 12.2.0.1.0 Production on Mar. Juil. 11 10:40:56 2017
Copyright (c) 1982, 2016, Oracle.  All rights reserved.
SQL> 

Conclusion

Installer Oracle en mode silencieux n'est pas complexe et beaucoup plus efficace qu'en mode graphique. Il est de plus très simple de préparer un fichier kickstart pour installer tous les prérequis. Ci dessous un exemple de fichier kickstart ( se reporter à la documentation RedHat sur kickstart pour personnaliser les options ).:

# Fichier kickstart installation Oracle 12c sur redhat 7
install
url --url=http://192.168.56.1/centos/7/os/x86_64
lang fr_FR.UTF-8
keyboard fr-latin9
text
rootpw root01
network --onboot yes --device enp0s3 --bootproto static --ip 192.168.56.31 --netmask 255.255.255.0 --gateway 192.168.56.1 --noipv6 --nameserver 192.168.56.11 --hostname ora01.formation.maison 
reboot
authconfig --enableshadow --passalgo=sha512
timezone --utc Europe/Paris

# Desactivation du premier boot
firstboot --disabled

# partitionnement disque
zerombr
clearpart --all
ignoredisk --only-use=sda
part swap --asprimary --size=4096
part / --fstype=ext4 --asprimary --size=1 --grow

%packages --excludedocs 
# Installation minimale
@core

# Utiles
vim-enhanced
wget 
psmisc 
net-tools

# Requis pour Oracle 12c
compat-libcap1 
gcc 
gcc-c++ 
ksh 
libaio-devel 
nfs-utils 
sysstat 
unzip 
bind-utils 
smartmontools
perl-TermReadKey
%end

%post
# Configuration depots
rm -f /etc/yum.repos.d/*

cat <<EOF > /etc/yum.repos.d/local.repo
[local]
name=local
baseurl=http://192.168.56.1/centos/7/os/x86_64
enabled=1
gpgcheck=0

[local-updates]
name=local-updates
baseurl=http://192.168.56.1/centos/7/updates/x86_64
enabled=1
gpgcheck=0
EOF

# Lancement MAJ
yum -y update

# Groupes et utilisateur
groupadd oinstall
groupadd dba
# Le mot de passe oracle est Manager12
useradd -g oinstall -G dba -p wt99ijrb/q0bo -d /home/oracle -s /bin/bash oracle

# Parammetre systeme specifique Oracle
cat <<EOF >> /etc/sysctl.conf
# Parametrage noyau pour Oracle 12c 
# Memoire partagee
# kernel.shmall limite la taille de la shared memory ici 3Go sur les 4Go en place ( penser à la PGA et à l'OS... )
# ( 3 * 1024 * 1024 * 1024 ) / 4096 = 786432
kernel.shmall = 786432
kernel.shmmax = 2072418304
kernel.shmmni = 4096

# Semaphores
kernel.sem = 250 32000 100 128

kernel.panic_on_oops = 1

# Nbre fichiers
fs.file-max = 6815744
fs.aio-max-nr = 1048576

# Reseau
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 4194304
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576

# Optimisation mémoire
vm.swappiness = 1
vm.dirty_background_ratio = 3
vm.dirty_ratio = 80
vm.dirty_expire_centisecs = 500
vm.dirty_writeback_centisecs = 100
EOF

cat <<EOF >> /etc/security/limits.d/oracle-limits.conf
oracle soft nproc 16384
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft stack 10240
oracle hard stack 32768
EOF

echo "session required pam_limits.so" >> /etc/pam.d/login

cat <<EOF >> /etc/profile.d/oracle.sh
if [ \$USER = "oracle" ]; then
  if [ \$SHELL = "/bin/ksh" ]; then
    ulimit -p 16384
    ulimit -n 65536
  else
    ulimit -u 16384 -n 65536
  fi
fi
EOF

# Desactiver le pare-feu
systemctl disable firewalld

# Optimisation connexion ssh
sed -i 's/#UseDNS yes/UseDNS no/' /etc/ssh/sshd_config

%end

# Desactivation KDUMP
%addon com_redhat_kdump --disable --reserve-mb='auto'
%end