Quand on exploite Oracle Database en Standard Edition 2 (SE2), on n’a droit ni au Real Application Clusters (RAC), ni a Data Guard. Pendant longtemps, la seule haute disponibilite « officielle » pour SE2 était le RAC One Node… lui aussi retiré de la licence SE2. Oracle a comblé ce vide avec Standard Edition High Availability (SE HA / SEHA), introduit avec Oracle Database 19c : une solution de bascule a froid (cold failover) sur deux nœuds, incluse sans surcoût de licence avec SE2.

Dans cet article, nous deployons de bout en bout un cluster SEHA 19c entierement en ligne de commande, sans aucune interface graphique : preparation de l’OS (Oracle Linux 8), stockage partage ASM, installation silencieuse de Grid Infrastructure, du logiciel SE2, creation de la base et configuration de la bascule automatique.

A adapter a votre environnement : partout dans cet article, les valeurs affichees en rouge dans les fichiers de configuration sont a personnaliser (mots de passe, adresses IP, noms d’hotes node1/node2, nom SCAN et cluster, WWID des disques, interfaces reseau, chemins d’installation). Dans les blocs de commandes a coloration syntaxique, ces memes valeurs ne peuvent pas etre surlignees : reperez-les via cette liste — ChangeMe#2026 (mots de passe), 10.0.0.x / 192.168.10.x (IP), eth0/eth1 (interfaces), /u01/… (chemins), node1/node2 (hotes), ORCLCDB / ORCLPDB1 (base/PDB), ventes_srv (service), 36000c29aaaa000X (WWID disques).

1. Principe et architecture

SEHA repose sur Oracle Grid Infrastructure (Oracle Clusterware + Oracle ASM) installe sur deux nœuds. La base de donnees est une instance unique (single instance) dont les fichiers vivent sur un stockage partage (les disques ASM). Clusterware surveille l’instance : si le nœud actif tombe, la base est automatiquement redemarree sur le second nœud.

  • Bascule a froid : une seule instance est active a la fois (ce n’est pas du RAC, il n’y a jamais deux instances ouvertes simultanement).
  • 2 nœuds maximum, reserves a SE2.
  • Stockage partage obligatoire (SAN / iSCSI / baie) accessible par les deux nœuds, gere par ASM.
  • Inclus dans la licence SE2 (aucune option payante).

Schema logique de notre maquette :

          Reseau public (clients)         Reseau prive (interconnect)
                 |                                  |
     +-----------+-----------+          +-----------+-----------+
     |        node1          |==========|        node2          |
     |  GI 19c + base SE2    | interco  |  GI 19c (standby)     |
     |  INSTANCE ACTIVE      |          |  pret a reprendre     |
     +-----------+-----------+          +-----------+-----------+
                 |                                  |
                 +---------------+------------------+
                                 |
                       Stockage partage (ASM)
                  OCR/VOTING  +  DATA  +  FRA

Plan d’adressage utilise dans l’article (a adapter) :

# /etc/hosts (identique sur les deux noeuds)
# --- Reseau public ---
10.0.0.11   node1.example.lan      node1
10.0.0.12   node2.example.lan      node2
# --- VIP ---
10.0.0.21   node1-vip.example.lan  node1-vip
10.0.0.22   node2-vip.example.lan  node2-vip
# --- SCAN (idealement 3 IP en round-robin DNS, 1 ici pour la maquette) ---
10.0.0.30   seha-scan.example.lan  seha-scan
# --- Interconnect prive ---
192.168.10.11  node1-priv
192.168.10.12  node2-priv

2. Versions et compatibilite OS

  • Oracle Linux 8 : supporte nativement par Oracle Database 19c (a partir de la 19.7). On part ici d’une installation de base 19.3, sur laquelle on appliquera de preference le dernier Release Update.
  • Les deux Oracle Homes (Grid et Database) doivent etre au strictement meme niveau de patch (RU) sur les deux nœuds.

Telechargez depuis edelivery / support Oracle les deux archives 19.3 base : LINUX.X64_193000_grid_home.zip et LINUX.X64_193000_db_home.zip, deposees ici dans /tmp.

3. Preparation de l’OS (sur les DEUX noeuds)

3.1 Paquet de pre-installation Oracle

Le paquet oracle-database-preinstall-19c fait l’essentiel du travail : creation de l’utilisateur oracle et des groupes, parametres noyau (sysctl), limites (limits.conf) et dependances. Il est fourni dans les depots Oracle Linux 8.

# En root, sur chaque noeud
dnf install -y oracle-database-preinstall-19c

3.2 Utilisateur grid et groupes ASM

Nous adoptons la separation de roles recommandee : grid possede Grid Infrastructure, oracle possede la base. Le paquet de pre-install ne cree pas les groupes ASM ni l’utilisateur grid, on les ajoute :

groupadd -g 54327 asmdba
groupadd -g 54328 asmoper
groupadd -g 54329 asmadmin
useradd -u 54331 -g oinstall -G dba,asmdba,asmoper,asmadmin grid
usermod -a -G asmdba oracle
passwd grid
passwd oracle

3.3 Arborescence d’installation

mkdir -p /u01/app/grid
mkdir -p /u01/app/19.3.0/grid
mkdir -p /u01/app/oracle/product/19.3.0/dbhome_1
mkdir -p /u01/app/oraInventory
chown -R grid:oinstall /u01/app/grid /u01/app/19.3.0 /u01/app/oraInventory
chown -R oracle:oinstall /u01/app/oracle
chmod -R 775 /u01/app

3.4 Reglages systeme

En maquette on simplifie pare-feu et SELinux (en production : ouvrez les ports requis plutot que de tout desactiver). On desactive aussi les Transparent HugePages, fortement deconseillees par Oracle.

# Horloge synchronisee (obligatoire pour Clusterware)
dnf install -y chrony
systemctl enable --now chronyd

# Maquette : pare-feu et SELinux relaches
systemctl disable --now firewalld
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config

# Desactiver les Transparent HugePages (au prochain reboot)
grubby --update-kernel=ALL --args="transparent_hugepage=never"

Verifiez que la resolution de noms fonctionne dans les deux sens sur les deux nœuds (node1, node2, -priv, -vip, scan).

4. Stockage partage et disques ASM

Les LUN partagees doivent etre vues par les deux nœuds (multipath conseille). On donne ensuite a chaque disque un nom stable et les bons droits via une regle udev. Recuperez d’abord l’identifiant WWID de chaque disque :

# Identifier le WWID de chaque LUN partagee
for d in sdb sdc sdd; do echo -n "$d -> "; /usr/lib/udev/scsi_id -g -u -d /dev/$d; done

Creez la regle /etc/udev/rules.d/99-oracle-asmdevices.rules (memes WWID sur les deux nœuds) :

KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/$name", RESULT=="36000c29aaaa0001", SYMLINK+="oracleasm/asm-ocr1", OWNER="grid", GROUP="asmadmin", MODE="0660"
KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/$name", RESULT=="36000c29aaaa0002", SYMLINK+="oracleasm/asm-data1", OWNER="grid", GROUP="asmadmin", MODE="0660"
KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/$name", RESULT=="36000c29aaaa0003", SYMLINK+="oracleasm/asm-fra1", OWNER="grid", GROUP="asmadmin", MODE="0660"
# Recharger les regles et verifier les liens (sur les deux noeuds)
udevadm control --reload-rules
udevadm trigger
ls -l /dev/oracleasm/

5. Equivalence SSH du compte grid

Decompressez d’abord l’archive Grid dans le futur GRID_HOME (en tant que grid, sur node1), puis configurez la connectivite SSH sans mot de passe entre les nœuds via le script fourni par Oracle :

# En tant que grid, sur node1
cd /u01/app/19.3.0/grid
unzip -q /tmp/LINUX.X64_193000_grid_home.zip

# Equivalence SSH grid entre les deux noeuds
/u01/app/19.3.0/grid/oui/prov/resources/scripts/sshUserSetup.sh \
  -user grid -hosts "node1 node2" -noPromptPassphrase -advanced

6. Installation silencieuse de Grid Infrastructure 19c

On pilote l’installation par un fichier reponse. Creez /tmp/grid.rsp (adaptez noms, IP et mots de passe) :

oracle.install.responseFileVersion=/oracle/install/rspfmt_crsinstall_response_schema_v19.0.0
INVENTORY_LOCATION=/u01/app/oraInventory
oracle.install.option=CRS_CONFIG
ORACLE_BASE=/u01/app/grid
oracle.install.asm.OSDBA=asmdba
oracle.install.asm.OSOPER=asmoper
oracle.install.asm.OSASM=asmadmin
oracle.install.crs.config.scanType=LOCAL_SCAN
oracle.install.crs.config.gpnp.scanName=seha-scan.example.lan
oracle.install.crs.config.gpnp.scanPort=1521
oracle.install.crs.config.ClusterConfiguration=STANDALONE
oracle.install.crs.config.clusterName=seha-cluster
oracle.install.crs.config.gpnp.configureGNS=false
oracle.install.crs.config.autoConfigureClusterNodeVIP=false
oracle.install.crs.config.clusterNodes=node1:node1-vip:HUB,node2:node2-vip:HUB
oracle.install.crs.config.networkInterfaceList=eth0:10.0.0.0:1,eth1:192.168.10.0:5
oracle.install.crs.config.storageOption=FLEX_ASM_STORAGE
oracle.install.asm.SYSASMPassword=ChangeMe#2026
oracle.install.asm.monitorPassword=ChangeMe#2026
oracle.install.asm.diskGroup.name=OCR
oracle.install.asm.diskGroup.redundancy=EXTERNAL
oracle.install.asm.diskGroup.AUSize=4
oracle.install.asm.diskGroup.disks=/dev/oracleasm/asm-ocr1
oracle.install.asm.diskGroup.diskDiscoveryString=/dev/oracleasm/*
oracle.install.crs.configureAFD=false
oracle.install.config.managementOption=NONE

Lancez l’installation silencieuse (en tant que grid sur node1) :

/u01/app/19.3.0/grid/gridSetup.sh -silent -responseFile /tmp/grid.rsp

A la fin, l’installeur demande d’executer deux scripts en root, d’abord sur node1 puis sur node2 (sequentiellement, jamais en parallele) :

# En root, node1 PUIS node2
/u01/app/oraInventory/orainstRoot.sh
/u01/app/19.3.0/grid/root.sh

Puis on termine la configuration (assistants post-install) toujours en mode silencieux :

# En tant que grid sur node1
/u01/app/19.3.0/grid/gridSetup.sh -executeConfigTools -responseFile /tmp/grid.rsp -silent

Verification du cluster :

export ORACLE_HOME=/u01/app/19.3.0/grid
export PATH=$ORACLE_HOME/bin:$PATH
crsctl check cluster -all
crsctl stat res -t

7. Creation des diskgroups DATA et FRA

L’OCR/voting est dans le diskgroup OCR cree a l’installation. On ajoute DATA (donnees) et FRA (zone de recuperation) avec asmca en mode silencieux :

# En tant que grid
asmca -silent -createDiskGroup -diskGroupName DATA \
  -redundancy EXTERNAL -disk '/dev/oracleasm/asm-data1' -au_size 4
asmca -silent -createDiskGroup -diskGroupName FRA \
  -redundancy EXTERNAL -disk '/dev/oracleasm/asm-fra1' -au_size 4

8. Installation silencieuse du logiciel Oracle Database SE2

Decompressez l’archive base de donnees dans le DB Home (en tant que oracle sur node1) :

# En tant que oracle sur node1
cd /u01/app/oracle/product/19.3.0/dbhome_1
unzip -q /tmp/LINUX.X64_193000_db_home.zip

Fichier reponse /tmp/db.rsp : on installe le logiciel seul (INSTALL_DB_SWONLY), edition SE2, sur les deux nœuds du cluster :

oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v19.0.0
oracle.install.option=INSTALL_DB_SWONLY
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/u01/app/oraInventory
ORACLE_HOME=/u01/app/oracle/product/19.3.0/dbhome_1
ORACLE_BASE=/u01/app/oracle
oracle.install.db.InstallEdition=SE2
oracle.install.db.OSDBA_GROUP=dba
oracle.install.db.OSOPER_GROUP=oper
oracle.install.db.OSBACKUPDBA_GROUP=dba
oracle.install.db.OSDGDBA_GROUP=dba
oracle.install.db.OSKMDBA_GROUP=dba
oracle.install.db.OSRACDBA_GROUP=dba
oracle.install.db.CLUSTER_NODES=node1,node2
oracle.install.db.config.starterdb.type=GENERAL_PURPOSE
SECURITY_UPDATES_VIA_MYORACLESUPPORT=false
DECLINE_SECURITY_UPDATES=true
# En tant que oracle sur node1
/u01/app/oracle/product/19.3.0/dbhome_1/runInstaller -silent -responseFile /tmp/db.rsp

Executez le root.sh demande, en root, sur node1 puis node2 :

# En root, node1 PUIS node2
/u01/app/oracle/product/19.3.0/dbhome_1/root.sh

Recommandation : appliquez ici le dernier Release Update disponible sur le GRID_HOME et le DB Home (via opatch) AVANT de creer la base, sur les deux nœuds, en conservant un niveau de patch strictement identique.

9. Creation de la base sur ASM (dbca silencieux)

On cree une base conteneur (CDB) avec une PDB, stockee dans DATA, recuperation dans FRA, en tant que oracle sur node1 :

dbca -silent -createDatabase \
  -templateName General_Purpose.dbc \
  -gdbName ORCLCDB -sid ORCLCDB \
  -createAsContainerDatabase true -numberOfPDBs 1 -pdbName ORCLPDB1 \
  -storageType ASM -diskGroupName DATA -recoveryGroupName FRA \
  -characterSet AL32UTF8 -nationalCharacterSet AL16UTF16 \
  -memoryMgmtType AUTO_SGA -totalMemory 4096 -redoLogFileSize 256 \
  -emConfiguration NONE \
  -sysPassword ChangeMe#2026 -systemPassword ChangeMe#2026 -pdbAdminPassword ChangeMe#2026

10. Activation de la haute disponibilite SE

C’est l’etape cle de SEHA. Pour qu’une base « single instance » puisse basculer, on la declare aupres de Clusterware avec une liste de nœuds candidats. Le SPFILE et le fichier de mots de passe doivent etre dans ASM (donc partages), sinon le second nœud ne peut pas demarrer l’instance.

# En tant que oracle, sur node1
export ORACLE_HOME=/u01/app/oracle/product/19.3.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH

# Verifier la config actuelle
srvctl config database -db ORCLCDB

Si SPFILE/pwfile sont encore locaux, deplacez-les dans ASM puis declarez les deux nœuds candidats :

# Recreer le fichier de mots de passe dans ASM (partage)
orapwd file='+DATA/ORCLCDB/orapwORCLCDB' dbuniquename='ORCLCDB' format=12.2

# Pointer SPFILE et pwfile partages, et activer la bascule sur 2 noeuds
srvctl modify database -db ORCLCDB -spfile '+DATA/ORCLCDB/PARAMETERFILE/spfileORCLCDB.ora'
srvctl modify database -db ORCLCDB -pwfile '+DATA/ORCLCDB/orapwORCLCDB'
srvctl modify database -db ORCLCDB -node node1,node2

# La liste de noeuds candidats confirme l'activation de SE HA
srvctl config database -db ORCLCDB

Creez enfin un service applicatif : les clients se connectent au service (via le SCAN), ce qui leur permet de retrouver l’instance apres une bascule :

srvctl add service -db ORCLCDB -service ventes_srv -pdb ORCLPDB1
srvctl start service -db ORCLCDB -service ventes_srv
srvctl status service -db ORCLCDB -service ventes_srv

11. Tests de bascule

Verifiez d’abord ou tourne l’instance, puis provoquez une relocalisation propre :

srvctl status database -db ORCLCDB

# Sur quel hote tourne reellement l'instance ?
printf 'set heading off feedback off\nselect host_name from v$instance;\nexit\n' > /tmp/where.sql
sqlplus -s / as sysdba @/tmp/where.sql
# Bascule controlee vers node2
srvctl relocate database -db ORCLCDB -node node2
srvctl status database -db ORCLCDB

Pour valider la bascule automatique, simulez une panne franche du nœud actif (arret brutal ou reboot). Clusterware detecte la perte et redemarre l’instance sur le nœud survivant :

# Sur le noeud actif : panne simulee
reboot

# Depuis l'autre noeud, observer la reprise
watch -n 2 'crsctl stat res ora.orclcdb.db -t'

12. Points de vigilance

  • Bascule a froid : la base redemarre (quelques dizaines de secondes a quelques minutes selon la recovery). Ce n’est ni du RAC (instances simultanees) ni du Data Guard (replica distant).
  • Memes RU partout : Grid et Database, sur les deux nœuds, au strictement meme niveau de patch.
  • Niveau de patch : Oracle Linux 8 est supporte avec Oracle Database 19.7+ ; appliquez de preference le dernier Release Update sur les deux noeuds.
  • SPFILE et fichier de mots de passe dans ASM : indispensables au demarrage sur le nœud de secours.
  • Connexion cliente par service + SCAN : activez FAN/FCF (Fast Connection Failover) cote client pour une reconnexion transparente.
  • Limites SE2 : 16 threads CPU maximum par serveur ; respectez-les sur chaque nœud.
  • Stockage reellement partage et multipath ; sans cela, pas de bascule possible.
  • Sauvegardes RMAN vers la FRA (ASM) : la strategie de backup reste identique a une base mono-instance.

13. Recapitulatif des commandes

# OS (chaque noeud)
dnf install -y oracle-database-preinstall-19c chrony
# Groupes/grid, arborescence, udev disques ASM, equivalence SSH grid

# Grid Infrastructure (node1, user grid)
gridSetup.sh -silent -responseFile /tmp/grid.rsp
# root: orainstRoot.sh + root.sh (node1 puis node2)
gridSetup.sh -executeConfigTools -responseFile /tmp/grid.rsp -silent
crsctl check cluster -all

# Diskgroups
asmca -silent -createDiskGroup -diskGroupName DATA -redundancy EXTERNAL -disk '/dev/oracleasm/asm-data1' -au_size 4
asmca -silent -createDiskGroup -diskGroupName FRA  -redundancy EXTERNAL -disk '/dev/oracleasm/asm-fra1'  -au_size 4

# Logiciel SE2 (node1, user oracle) + root.sh sur les 2 noeuds
runInstaller -silent -responseFile /tmp/db.rsp

# Base + haute dispo SE
dbca -silent -createDatabase ...
srvctl modify database -db ORCLCDB -node node1,node2
srvctl config database -db ORCLCDB

# Tests
srvctl relocate database -db ORCLCDB -node node2
srvctl status database -db ORCLCDB

Conclusion

Avec Standard Edition High Availability, Oracle offre enfin aux clients SE2 une vraie protection contre la panne d’un serveur, sans option payante et sans complexite RAC. Le tout s’installe integralement en ligne de commande : fichiers reponse pour Grid Infrastructure et le logiciel, dbca silencieux pour la base, et quelques commandes srvctl pour activer la bascule sur deux nœuds. Une solution robuste, scriptable et reproductible, parfaite pour automatiser le deploiement via Ansible ou Terraform.