Skip to main content
NetApp database solutions
La version française est une traduction automatique. La version anglaise prévaut sur la française en cas de divergence.

Déployez Oracle Database 26ai à haute disponibilité avec Google Cloud NetApp Volumes

Contributeurs netapp-martyh

Ce guide explique comment provisionner des instances de calcul et du stockage, installer Oracle Grid Infrastructure et Oracle Database, initialiser une base de données de secours et configurer Oracle Data Guard avec Fast-Start Failover.

Avant de commencer

Avant de commencer, assurez-vous d'avoir les éléments suivants :

  • Un projet Google Cloud disposant des autorisations nécessaires pour Compute Engine, la mise en réseau VPC, la configuration du pare-feu, IAM et NetApp Volumes

    Tâche Accès requis

    Créer des machines virtuelles Compute Engine

    Administrateur d'instance de calcul (ou équivalent)

    Pare-feu / Politiques de pare-feu

    Administrateur réseau ou administrateur de stratégie délégué

    Créer des pools et des volumes GCNV

    Administrateur NetApp Volumes

    Configurer PSA

    Administrateur réseau dans le projet hôte

    SSH via IAP

    Utilisateur du tunnel sécurisé IAP + connexion au système d'exploitation (le cas échéant)

  • L’API NetApp Volumes activée

  • Un VPC et un sous-réseau configurés pour la région cible

  • Accès aux services privés (PSA) configuré pour Google Cloud NetApp Volumes

  • Oracle Linux 10 pour toutes les machines virtuelles requises

  • La résolution DNS et de noms d'hôtes est configurée pour les hôtes de base de données et l'hôte Observer

  • Supports d'installation et fichiers de correctifs Oracle disponibles pour Oracle Database 26ai et Grid Infrastructure

  • Connaissance des concepts Oracle Data Guard, Oracle Restart et stockage iSCSI

  • La synchronisation de l'heure est configurée pour toutes les machines virtuelles.

    Vous pouvez utiliser les commandes suivantes :

    gcloud services enable netapp.googleapis.com
    chronyc tracking
    timedatectl

Exemple de configuration utilisé dans ce guide

Ce guide repose sur les hypothèses de déploiement suivantes :

  • Trois machines virtuelles Google Compute Engine :

    • oracdb1 pour la base de données principale

    • oracdb2 pour la base de données de secours

    • oradg-obs pour l'observateur de basculement à démarrage rapide

  • Un pool de stockage GCNV Flex Unified par zone de base de données

  • Cinq volumes iSCSI GCNV par hôte de base de données

  • Oracle Data Guard Broker et Fast-Start Failover pour le basculement automatique

  • Stockage dédié par hôte de base de données ; les hôtes principal et de secours ne partagent pas les volumes iSCSI

Remplacez toutes les valeurs d'exemple dans les commandes par des valeurs provenant de votre environnement, y compris les noms d'hôtes, les adresses IP, les zones, les noms de projets, les adresses IP du portail, les mots de passe et les noms de fichiers multimédias Oracle.

Objectifs

Dans cette procédure, vous effectuerez les tâches suivantes :

  • Provisionnez des instances Compute Engine pour la base de données principale, la base de données de secours et l'observateur

  • Configurer le stockage iSCSI GCNV et les périphériques multipath pour Oracle

  • Installez Oracle Grid Infrastructure et Oracle Database 26ai sur les deux hôtes de base de données

  • Créer la base de données Oracle principale

  • Initialisez la base de données de secours à l'aide de la réplication GCNV, des instantanés ou des clones

  • Configurer Oracle Data Guard Broker, Fast-Start Failover et l'observateur

Options de déploiement

Cette section compare les modèles de déploiement HA/DR pratiques pour Oracle Database sur Google Compute Engine (GCE) avec Google Cloud NetApp Volumes (GCNV) stockage bloc iSCSI. Elle met également en évidence comment la réplication GCNV accélère l'initialisation de la base de données de secours. Utilisez ce tableau pour choisir un niveau avant de commencer. Ce guide implémente Prod HA (Data Guard + FSFO) — la dernière ligne.

Environnement Exigence Architecture recommandée HA DR Automation Avantage clé

Développement/Test

coût le plus bas

instance unique

Non

Oui

Non

clone instantané

Prod Basic (Redémarrage)

Réduisez l'interruption due aux pannes

+ Oracle Restart

Non

Oui

Local uniquement

Redémarrage automatique

Prod HA (sans DG)

DR manuel acceptable

+ Instantanés / RMAN

Partiel

Oui

Partiel

Récupération de clones GCNV

Prod HA (DG + FSFO)

Véritable haute disponibilité (sans DBA)

Data Guard + FSFO

Oui

Oui

Complet

Haute disponibilité réelle + basculement rapide

Haute disponibilité / Reprise après sinistre / Automatisation : Oui = atteint l’objectif de niveau ; Non = hors périmètre ; Partiel = au niveau du stockage ou étapes manuelles uniquement.

Aperçu

Cette architecture déploie la haute disponibilité d'Oracle Database 26ai sur Google Cloud à l'aide du stockage iSCSI Google Cloud NetApp Volumes (GCNV) et d'Oracle Data Guard. GCNV offre un stockage bloc haute performance et prend en charge l'initialisation de la base de secours au niveau du stockage. Data Guard assure la synchronisation continue, le basculement et le basculement rapide Fast-Start Failover.

Couche Rôle

GCNV

stockage bloc, initialisation en veille, réplication du stockage

Data Guard

Synchronisation continue, application du redo, basculement, FSFO

La réplication GCNV réduit considérablement le temps d'initialisation de la base de données de secours par rapport à RMAN active duplicate, en déplaçant les données au niveau du stockage plutôt qu'à travers les canaux de la base de données Oracle. Privilégiez la réplication GCNV pour l'initialisation de la base de données de secours en production lorsque votre environnement le permet.

Composant Détail

Hôtes de base de données

oracdb1/ oracdb2 — zones différentes, cinq volumes iSCSI GCNV chacun

Stockage

/u01 + ASM +DATA, +RECO, +FRA sur GCNV (EXTERNE)

Initialisation en veille

GCNV réplication/instantané/clonage → Oracle finaliser → Data Guard

HA

Redémarrage, veille physique (MONTÉ), Broker, FSFO, Observer (oradg-obs)

Applications

Service orclapp

Zonage : Un pool GCNV Flex Unified par zone de base de données ; volumes dédiés par hôte. Les disques de démarrage sont réservés au système d’exploitation uniquement. Hors périmètre : TDE, RAC, NVMe/TCP, OEM, Active Data Guard (le standby reste MOUNTED).

Architecture

Schéma de référence

L'architecture propose trois chemins de données indépendants. La réplication du stockage et le transport Data Guard redo sont des chemins distincts.

Oracle 26ai HA sur GCNV - architecture de référence
Figure 1. Architecture de référence du déploiement Oracle GCNV

La réplication du stockage ≠ la réplication des journaux de restauration. Le chemin 1 déplace les fichiers de données au niveau GCNV pour l'initialisation de la base de données de secours. Le chemin 2 maintient la synchronisation des bases de données après la bascule. Le chemin 3 orchestre les transitions de rôle et le basculement automatique via Oracle Data Guard Broker et l'Observer.

Rôles de la plateforme

Plate-forme Fournit

GCNV

Volumes iSCSI, instantanés, réplication de volumes (baseline + incrémentielle) — initialisation de secours

Data Guard

Transport de restauration, MRP, Broker, FSFO — synchronisation continue et basculement

La réplication GCNV effectue une copie de base, puis des mises à jour incrémentielles par bloc conformément à la politique. Data Guard gère l'application des journaux de restauration et le FSFO après l'initialisation du serveur de secours.

Topologie et stockage

Rôle VM Zone Pool GCNV Volumes (par hôte)

Primaire

oracdb1

us-west1-a

oracle-pool-a

ora_<host>_u01, ora_<host>_data_01/02, ora_<host>_arch_01, ora_<host>_fra_01

Attendre

oracdb2

us-west1-b

oracle-pool-b

Même modèle de dénomination

Observateur

oradg-obs

us-west1-c

disque de démarrage uniquement

Stockage Support Utiliser

Système d'exploitation

disque de démarrage GCE

Système d'exploitation uniquement

/u01

GCNV iSCSI

Domiciles Grid/DB, staging (XFS)

+DATA / +RECO / +FRA

GCNV iSCSI

ASM EXTERNE — fichiers de données, archives, FRA

Types de machines

Exemple n4-highmem-8 dans ce guide ; les charges de travail OLTP utilisent généralement c4-standard-*.

Provisionner Compute Engine

Étape 1 : Créer les machines virtuelles

Créez trois machines virtuelles dans différentes zones d'une même région (isolation des pannes zonales). Privilégiez une région à faible émission de carbone pour le coût total de possession et la durabilité, lorsque cela répond aux besoins de latence et de conformité (par exemple us-west1 vs us-central1). Utilisez la Cloud Console, gcloud, Terraform ou votre flux de travail de provisionnement standard.

VM Zone Type de machine disque de démarrage Réseau But

oracdb1

us-west1-a

n4-highmem-8(exemple) ou c4-standard-*

OL 10, Hyperdisk équilibré de 50 Go (OS only)

oracle-vpc / oracle-subnet, gVNIC

Base de données principale

oracdb2

us-west1-b

Identique au primaire

OL 10, Hyperdisk équilibré de 50 Go (OS only)

Même

Base de données de secours

oradg-obs

us-west1-c

e2-medium

OL 10, 20 Go Hyperdisk Balanced

Même

Observateur FSFO (Client instantané uniquement)

Remarque

Niveau réseau : Premium lorsque la latence ou le débit sortant (>~200 Gio/mois) sont importants ; Standard pour un coût total de possession plus faible en développement/test.

Activez Secure Boot, vTPM et la surveillance de l'intégrité sur les trois. Le disque de démarrage contient uniquement le système d'exploitation. /u01 Les répertoires Grid/DB, le staging et toutes les données ASM utilisent des volumes iSCSI GCNV (voir Provisionner des volumes iSCSI GCNV) — ne connectez pas de disque de données GCE séparé pour /u01.

Étape 2 : Pare-feu VPC — autoriser la liste blanche TCP/1521 sur les trois zones

Autorisez le trafic TCP/1521 entre les trois VM /32 adresses IP internes dans chaque zone (us-west1-a/b/c ici). Utilisez des règles de pare-feu VPC ou des politiques de pare-feu avec la même allowlist. L'absence de règles interrompt le transport redo et la connectivité Observer.

Console Cloud : Réseau VPC → Pare-feu → Créer une règle allow-oracle-net-dbhosts sur oracle-vpc — Entrée, Autoriser, sources = trois /32 IP, TCP 1521. Dupliquer la sortie si nécessaire. Valider depuis chaque VM :

sudo dnf install -y nmap-ncat

for tgt in <oracdb1-ip> <oracdb2-ip> <oradg-obs-ip>; do
  nc -zv -w 5 "$tgt" 22
  nc -zv -w 5 "$tgt" 1521
done
Port Attendu Signification

22

Connecté

Le chemin SSH fonctionne

1521

Connexion refusée

Pare-feu ouvert ; l’écouteur de grille démarre pendant Étape 1 : Installez Oracle Grid Infrastructure (Oracle Restart) sur chaque hôte de base de données

Soit

Délai d'attente

Corriger le pare-feu ou le routage

Exécutez la commande depuis les trois machines virtuelles vers chaque adresse IP homologue.

Étape 3 : Nom d’hôte, DNS et /etc/hosts

Après le démarrage de chaque machine virtuelle, définissez le nom d'hôte et ajoutez /etc/hosts des entrées sur les trois hôtes afin que la résolution de noms directe/inverse fonctionne pour Oracle Net, le broker et l'Observer.

# Run on each VM, substituting the local short name (oracdb1, oracdb2, oradg-obs)
sudo hostnamectl set-hostname <this-host>.example.internal

# Run on every VM (same content)
sudo tee -a /etc/hosts >/dev/null <<EOF

# Oracle DG peers + FSFO Observer
<oracdb1-ip>    oracdb1.example.internal    oracdb1
<oracdb2-ip>    oracdb2.example.internal    oracdb2
<oradg-obs-ip>  oradg-obs.example.internal  oradg-obs
EOF

Remplacez les adresses IP internes GCE (visibles dans la liste Compute Engine → VM instances, colonne Internal IP).

Valider à partir de chaque hôte :

ping -c 1 oracdb1 && ping -c 1 oracdb2 && ping -c 1 oradg-obs

Étape 4 : Configuration de référence du système d’exploitation (hôtes de base de données uniquement)

Remarque

Prérequis : HTTPS sortant vers yum.oracle.com (Cloud NAT ou miroir interne sur des sous-réseaux privés).

Exécutez sur oracdb1 et oracdb2 (la configuration de l'observateur est traitée dans Étape 4 : Installez Oracle Instant Client sur l’hôte Observer).

# Oracle 26ai preinstall (package name varies by repo)
sudo dnf install -y oracle-ai-database-preinstall-26ai \
  || sudo dnf install -y oracle-database-preinstall-26ai \
  || sudo dnf install -y oracle-database-preinstall-23ai

# grid user + asm groups
sudo groupadd -g 54327 asmadmin; sudo groupadd -g 54328 asmdba; sudo groupadd -g 54329 asmoper
sudo useradd -u 54322 -g oinstall -G dba,oper,asmadmin,asmdba,asmoper grid
sudo passwd -l grid; sudo passwd -l oracle
sudo usermod -a -G asmdba,asmadmin oracle

# iSCSI, multipath, OUI JDK
sudo dnf install -y iscsi-initiator-utils device-mapper-multipath sg3_utils \
  java-21-openjdk-headless libxcrypt-compat

# THP and time
cat /sys/kernel/mm/transparent_hugepage/enabled   # expect [never]
timedatectl
chronyc tracking
Remarque

Configuration de sécurité (OL 10) : Les commandes ci-dessous configurent SELinux en mode permissif et le désactivent firewalld. Il s’agit d’une configuration minimale pour un environnement de laboratoire. Pour une configuration SELinux et pare-feu renforcée, consultez le référentiel de sécurité de votre organisation.

sudo setenforce 0
sudo sed -i 's/^SELINUX=.*/SELINUX=permissive/' /etc/selinux/config
sudo systemctl disable --now firewalld

sudo cp -n /etc/iscsi/iscsid.conf /etc/iscsi/iscsid.conf.orig
sudo sed -i '/^[#[:space:]]*node\.session\.timeo\.replacement_timeout/d' /etc/iscsi/iscsid.conf
echo "node.session.timeo.replacement_timeout = 120" | sudo tee -a /etc/iscsi/iscsid.conf
sudo systemctl enable --now iscsid

sudo reboot

Étape 5 : Capturer le nom de l’initiateur iSCSI (IQN)

Après le redémarrage, notez l'IQN de chaque hôte de base de données. Vous utiliserez ces IQN pour créer les groupes d'hôtes GCNV dans Étape 2 : Créer les groupes hôtes.

sudo cat /etc/iscsi/initiatorname.iscsi
# InitiatorName=iqn.1994-05.com.redhat:abc123def456

Répétez l'opération oracdb2. Enregistrez l'IQN de chaque hôte — un groupe d'hôtes par hôte afin que le redémarrage ou la régénération de l'IQN d'un seul hôte ne puisse pas affecter la visibilité du volume iSCSI GCNV d'un autre hôte.

Remarque

VM clonées : Si les deux hôtes partagent le même IQN, régénérez sur oracdb2 (arrêtez iscsi, effacez /var/lib/iscsi/nodes/*, nouveau InitiatorName dans /etc/iscsi/initiatorname.iscsi, redémarrez iscsid).

Provisionner des volumes iSCSI GCNV

Étape 1 : Créez un pool de stockage iSCSI GCNV Flex Unified par zone de base de données

Un pool Flex Unified par zone de base de données (voir Architecture).

Créez deux pools pour cette conception HA (répétez les étapes pour chaque zone) :

Nom du pool Zone Utilisé par

oracle-pool-a

us-west1-a

oracdb1 (primaire)

oracle-pool-b

us-west1-b

oracdb2 (attendre)

NetApp Volumes → Pools de stockage → Créer pour chaque pool :

  • Niveau de service : Flex (et non Premium)

  • Type : Unifié

  • Zone : correspond à la zone de la machine virtuelle de la base de données (us-west1-a/ us-west1-b)

  • Avis important : connecté à oracle-vpc

  • Capacité : dimensionnée en fonction de la charge de travail ; utiliser un débit/IOPS provisionné personnalisé lorsque le redo, la sauvegarde ou la restauration dépasse la marge par défaut (jusqu’à 5120 Mio/s ou 160K IOPS par pool, dans les limites du produit)

Attendez READY. Adaptez la taille des pools à l’encombrement de votre base de données (les tailles dans Étape 3 : Créer les volumes iSCSI GCNV sont des exemples).

Remarque

Mode par défaut (ce guide) : Les pools Flex Unified utilisent le mode par défaut (--mode=default). Créez des pools et des volumes iSCSI avec Cloud Console ou gcloud netapp. La réplication de volumes, les snapshots et les clones utilisent les API Google Cloud (Étape 3 : Initialisation de la veille GCNV).

Étape 2 : Créer les groupes d’hôtes (un par hôte de base de données)

Créez un groupe d'hôtes par hôte de base de données afin que chaque machine virtuelle ne voie que ses propres volumes — les volumes iSCSI GCNV principal et de secours ne doivent pas être partagés. L'Observer ne possède aucune ressource GCNV. Dans la Cloud Console :

  1. NetApp Volumes → Groupes d'hôtes → Créer

  2. Nom : oracdb1-hg · Région : us-west1 · Type : Initiateur iSCSI · Type de système d’exploitation : Linux

  3. Hôtes : collez l’IQN à partir de oracdb1 (la valeur de /etc/iscsi/initiatorname.iscsi)

  4. Description : « Hôte principal Oracle oracdb1 » · Créer

  5. Répétez pour oracdb2-hg avec oracdb2 l’IQN de

Étape 3 : Créer les volumes iSCSI GCNV (par hôte de base de données)

Chaque hôte de base de données reçoit cinq volumes iSCSI GCNV dans le pool de sa zone — un pour /u01 et quatre périphériques de support ASM :

Volume iSCSI GCNV Taille Utiliser Alias multipath

ora_<host>_u01

100 Gio

`/u01`Volume iSCSI GCNV — Répertoires Grid/Oracle, zone de transit

/dev/mapper/ora_<host>_u01

ora_<host>_data_01

50 Gio

ASM +DATA

/dev/mapper/ora_<host>_data_01

ora_<host>_data_02

50 Gio

ASM +DATA (rayé)

/dev/mapper/ora_<host>_data_02

ora_<host>_arch_01

100 Gio

ASM +RECO

/dev/mapper/ora_<host>_arch_01

ora_<host>_fra_01

100 Gio

ASM +FRA

/dev/mapper/ora_<host>_fra_01

Noms de volumes : lettres, chiffres, traits de soulignement uniquement (pas de traits d'union).

Remarque

Configuration minimale (validation uniquement) : Deux LUN par hôte (*_data, *_reco avec arch_01p1+RECO et arch_01p2+FRA est acceptable pour le laboratoire ; la production utilise cinq volumes par Étape 3 : Créer les volumes iSCSI GCNV.

Sur oracdb1 : créez les cinq volumes dans oracle-pool-a, groupe d’hôtes oracdb1-hg.

Sur oracdb2 : créez les cinq volumes dans oracle-pool-b, groupe d'hôtes oracdb2-hg.

NetApp Volumes → Volumes → Créer — iSCSI, pool et groupe d'hôtes corrects, Linux. Enregistrement par pool :

Étape 4 : Configurer iSCSI Linux et le multipath pour les volumes iSCSI GCNV

Exécutez sur oracdb1 en utilisant les portails du pool de cet hôte, puis sur oracdb2 en utilisant les portails du pool de secours.

Si la sortie de l'hôte est restreinte, autorisez TCP/3260 de chaque machine virtuelle de base de données vers ses adresses IP de portail iSCSI GCNV (en plus de TCP/1521 entre machines virtuelles Étape 2 : Pare-feu VPC — autoriser la liste blanche TCP/1521 sur les trois zones).

  1. Découvrez les cibles, connectez-vous et persistez le démarrage du nœud :

    sudo iscsiadm --mode discovery --op update --type sendtargets --portal <ISCSI_PORTAL_1>
    sudo iscsiadm --mode discovery --op update --type sendtargets --portal <ISCSI_PORTAL_2>
    sudo iscsiadm --mode node --op update --name node.startup --value automatic
    sudo iscsiadm --mode node -l all
    sudo systemctl enable --now iscsid iscsi multipathd
    sudo iscsiadm --mode session         # expect 10 sessions (5 GCNV iSCSI volumes × 2 portals)
    sudo lsblk -o NAME,SIZE,WWN,VENDOR,MODEL

Après le redémarrage, vérifiez à nouveau avant de démarrer Oracle :

+

sudo iscsiadm --mode session
sudo multipath -ll
  1. Configurer device-mapper-multipath:

sudo tee /etc/multipath.conf >/dev/null <<'EOF'
defaults {
    find_multipaths     yes
    user_friendly_names yes
}
blacklist {
    devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
    devnode "^hd[a-z]"
    devnode "^cciss.*"
}
EOF
+
sudo systemctl enable --now multipathd
sudo multipath -ll
  1. Ajoutez les alias WWID détectés par l'hôte /etc/multipath.conf (ne devinez pas — multipath.conf ne développe pas les variables du shell). Découvrez les WWID :

    sudo multipath -ll
    for dev in /dev/sd*; do
      [ -b "$dev" ] || continue
      printf '%s: ' "$dev"
      sudo /usr/lib/udev/scsi_id --whitelisted --device="$dev" 2>/dev/null || true
      echo
    done

    Ajoutez des alias concrets pour cet hôte à /etc/multipath.conf, puis sudo systemctl restart multipathd.

    Sur oracdb1, ajoutez :

multipaths {
    multipath { wwid <host-discovered-wwid-for-u01>      alias ora_oracdb1_u01     }
    multipath { wwid <host-discovered-wwid-for-data-01>  alias ora_oracdb1_data_01 }
    multipath { wwid <host-discovered-wwid-for-data-02>  alias ora_oracdb1_data_02 }
    multipath { wwid <host-discovered-wwid-for-arch-01>  alias ora_oracdb1_arch_01 }
    multipath { wwid <host-discovered-wwid-for-fra-01>   alias ora_oracdb1_fra_01  }
}

+ On oracdb2 utilise le même modèle avec ora_oracdb2_* alias, puis :

sudo systemctl restart multipathd
ls -l /dev/mapper/ora_$(hostname -s)_*

Étape 5 : Partitionner les périphériques de stockage ASM sur les volumes iSCSI GCNV

Partitionnez les quatre périphériques de support ASM (pas u01) avec une partition GPT chacun. ASM consomme la partition brute. Exécutez sur chaque hôte. Tous les blocs suivants utilisent HOST=$(hostname -s) pour sélectionner automatiquement les périphériques de l’hôte local.

HOST=$(hostname -s)        # oracdb1 on the primary, oracdb2 on the standby
for dev in /dev/mapper/ora_${HOST}_data_01 \
           /dev/mapper/ora_${HOST}_data_02 \
           /dev/mapper/ora_${HOST}_arch_01 \
           /dev/mapper/ora_${HOST}_fra_01; do
  sudo parted -s "$dev" mklabel gpt
  sudo parted -s "$dev" mkpart primary 0% 100%
done
sudo partprobe
sudo systemctl reload multipathd
ls /dev/mapper/ora_${HOST}_*p1     # expect 4 partitions

HOST=$(hostname -s)
sudo tee /etc/udev/rules.d/99-oracle-asm.rules >/dev/null <<'EOF'
KERNEL=="dm-*", ENV{DM_UUID}=="part?-mpath-*", ENV{DM_NAME}=="ora_oracdb*_*p?", \
    OWNER="grid", GROUP="asmadmin", MODE="0660"
EOF

sudo udevadm control --reload-rules
for part in /dev/mapper/ora_${HOST}_*p1; do
  dm=$(readlink -f "$part" | xargs basename)
  sudo udevadm trigger --action=change --name-match="/dev/${dm}"
done
sudo udevadm settle
ls -lL /dev/mapper/ora_${HOST}_*p1    # grid:asmadmin 0660

Étape 6 : Formater et monter /u01 sur le volume iSCSI GCNV local

Le ora_<host>_u01 volume iSCSI GCNV contient le répertoire d'installation Grid, le répertoire d'installation Oracle et l'espace de transit. Formatez XFS sur le périphérique multipath (non partitionné pour ASM). Utilisez l'UUID dans /etc/fstab (et non une étiquette de système de fichiers partagée) :

HOST=$(hostname -s)
U01_DEV=/dev/mapper/ora_${HOST}_u01
ls -l "$U01_DEV"

sudo mkfs.xfs -f "$U01_DEV"
U01_UUID=$(sudo blkid -s UUID -o value "$U01_DEV")

sudo mkdir -p /u01
echo "UUID=${U01_UUID} /u01 xfs defaults,_netdev,nofail,x-systemd.requires=iscsi.service,x-systemd.requires=multipathd.service,x-systemd.after=iscsi.service,x-systemd.after=multipathd.service 0 0" | sudo tee -a /etc/fstab
sudo mount -a

sudo mkdir -p /u01/app/oraInventory /u01/app/26ai/grid /u01/app/grid \
  /u01/app/oracle/product/26ai/db_1 /u01/stage
sudo chown -R grid:oinstall /u01/app/oraInventory /u01/app/26ai /u01/app/grid
sudo chown -R oracle:oinstall /u01/app/oracle /u01/stage
sudo chmod -R 775 /u01/app /u01/stage

Redémarrez une fois et confirmez /u01 les montages avant Installer le logiciel Oracle.

Installer le logiciel Oracle

Exécutez l'installation de Grid puis de la base de données sur chaque hôte de base de données avant Créer la base de données principale.

Étape 1 : Installez Oracle Grid Infrastructure (Oracle Restart) sur chaque hôte de base de données

Exécutez toute cette section sur oracdb1, puis répétez-la sur oracdb2. Chaque hôte dispose de son propre répertoire Grid, de son instance ASM et de ses groupes de disques — Data Guard réplique sur Oracle Net, et non sur le stockage.

Mettez en scène les binaires Oracle sur /u01

sudo chown oracle:oinstall /u01/stage && sudo chmod 775 /u01/stage
# Upload GoldImages, RU, OPatch to /u01/stage.

Décompressez le Grid home sur place

Le 26ai Grid GoldImage s'installe en le dézippant directement dans le répertoire Grid cible :

sudo -u grid bash -c '
cd /u01/app/26ai/grid
unzip -q /u01/stage/LINUX.X64_<RELEASE>_grid_home.zip
'
sudo chown -R grid:oinstall /u01/app/26ai/grid

Niveau de mise à jour cumulative (RU) de la grille. Ce guide suppose que la grille GoldImage inclut déjà votre RU validée. Si la grille GoldImage est antérieure à la RU cible, appliquez le correctif au répertoire d'installation de la grille lors de la configuration en suivant la procédure documentée par Oracle gridSetup.sh -applyRU, ou utilisez une grille GoldImage intégrant déjà la RU. Veillez à ce que les répertoires d'installation de la grille et de la base de données conservent le même niveau de correctif prévu.

Exécution unique gridSetup — fichier de réponse HA_CONFIG complet

Créer /tmp/grid.rsp sur chaque hôte (responseFileVersion est obligatoire ; remplacez HOST et utilisez des mots de passe forts :

HOST=$(hostname -s)

sudo -u grid bash -c "cat > /tmp/grid.rsp <<RSP
oracle.install.responseFileVersion=/oracle/install/rspfmt_crsinstall_response_schema_v23.0.0
INVENTORY_LOCATION=/u01/app/oraInventory
installOption=HA_CONFIG
ORACLE_BASE=/u01/app/grid
clusterUsage=GENERAL_PURPOSE
OSDBA=asmdba
OSOPER=asmoper
OSASM=asmadmin
storageOption=FLEX_ASM_STORAGE
sysasmPassword=WelcomeOracle1!
asmsnmpPassword=WelcomeOracle1!
diskGroupName=DATA
redundancy=EXTERNAL
auSize=4
diskString=/dev/mapper/ora_${HOST}_*p*
diskList=/dev/mapper/ora_${HOST}_data_01p1,/dev/mapper/ora_${HOST}_data_02p1
managementOption=NONE
RSP"
sudo -u grid chmod 600 /tmp/grid.rsp

Exécutez gridSetup pour copier les fichiers binaires et préparer la configuration :

sudo -u grid bash -c '
export ORACLE_HOME=/u01/app/26ai/grid
export ORACLE_BASE=/u01/app/grid
cd /u01/app/26ai/grid
./gridSetup.sh -silent -responseFile /tmp/grid.rsp -ignorePrereqFailure
'

Attendez Successfully Setup Software with warning(s). un code de sortie 6 (avertissements) ou 0.

Exécutez orainstRoot.sh et root.sh en tant que root

sudo /u01/app/oraInventory/orainstRoot.sh
sudo /u01/app/26ai/grid/root.sh

root.sh crée les crsctl / srvctl / asmcmd wrappers et lance OHAS.

gridSetup.sh -executeConfigTools — ouvrez ASM et créez +DATA

Exécutez les assistants de configuration (NETCA, ASMCA, CVU) sur le fichier de réponses provenant de — cela crée l'instance ASM et le +DATA groupe de disques :

sudo -u grid bash -c '
export ORACLE_HOME=/u01/app/26ai/grid
export ORACLE_BASE=/u01/app/grid
cd /u01/app/26ai/grid
./gridSetup.sh -silent -executeConfigTools -responseFile /tmp/grid.rsp
'

À prévoir Successfully Configured Software. après NETCA / ASMCA / CVU.

Créer +RECO et +FRA groupes de disques

L'installation en une seule étape ne crée que +DATA. Créez les deux autres via asmca :

HOST=$(hostname -s)

sudo -u grid bash -c "
export ORACLE_HOME=/u01/app/26ai/grid
export ORACLE_SID=+ASM

\$ORACLE_HOME/bin/asmca -silent -createDiskGroup \
  -diskGroupName RECO \
  -disk /dev/mapper/ora_${HOST}_arch_01p1 \
  -redundancy EXTERNAL -au_size 4

\$ORACLE_HOME/bin/asmca -silent -createDiskGroup \
  -diskGroupName FRA \
  -disk /dev/mapper/ora_${HOST}_fra_01p1 \
  -redundancy EXTERNAL -au_size 4
"

Vérifiez ASM et Oracle Restart

sudo -u grid ORACLE_HOME=/u01/app/26ai/grid ORACLE_SID=+ASM \
  /u01/app/26ai/grid/bin/sqlplus -s / as sysasm <<'SQL'
SELECT name, total_mb, free_mb, state FROM v$asm_diskgroup ORDER BY name;
SQL

sudo /u01/app/26ai/grid/bin/crsctl stat res -t
# Expected ONLINE: ora.DATA.dg, ora.RECO.dg, ora.FRA.dg, ora.LISTENER.lsnr, ora.asm, ora.cssd, ora.evmd.

Répétez cette section sur oracdb2. Le HOST=$(hostname -s) modèle dans et sélectionne automatiquement les périphériques iSCSI GCNV de cet hôte. Utilisez les mêmes noms de groupes de disques ASM : Data Guard réplique via Oracle Net, et non via le stockage.

Étape 2 : Installez Oracle Database 26ai sur chaque hôte de base de données

Exécutez cette section sur oracdb1, puis sur oracdb2. La base de données de secours est créée dans Créer la base de données de secours.

Décompressez le répertoire d'installation de la base de données et le patch RU

sudo su - oracle
cd /u01/app/oracle/product/26ai/db_1
unzip -q /u01/stage/LINUX.X64_<RELEASE>_db_home.zip
rm -rf OPatch
unzip -q /u01/stage/p6880880_<base>_Linux-x86-64.zip                    # latest OPatch
unzip -q /u01/stage/p<RU_PATCH>_<base>_Linux-x86-64.zip -d /u01/stage   # latest 26ai RU

Consultez la documentation Oracle pour la structure du répertoire RU et le chemin -applyRU.

Installation silencieuse du logiciel uniquement avec le RU appliqué

sudo -u oracle tee /u01/stage/dbinstall.rsp >/dev/null <<'EOF'
oracle.install.option=INSTALL_DB_SWONLY
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/u01/app/oraInventory
ORACLE_HOME=/u01/app/oracle/product/26ai/db_1
ORACLE_BASE=/u01/app/oracle
oracle.install.db.InstallEdition=EE
oracle.install.db.OSDBA_GROUP=dba
oracle.install.db.OSOPER_GROUP=oper
oracle.install.db.OSBACKUPDBA_GROUP=backupdba
oracle.install.db.OSDGDBA_GROUP=dgdba
oracle.install.db.OSKMDBA_GROUP=kmdba
oracle.install.db.OSRACDBA_GROUP=racdba
oracle.install.db.rootconfig.executeRootScript=false
EOF

sudo -u oracle bash -c '
export CV_ASSUME_DISTID=OEL10    # OEL9 / OEL8.10 if cluvfy requires it
cd /u01/app/oracle/product/26ai/db_1
./runInstaller -applyRU /u01/stage/<RU_PATCH> \
  -applyOneOffs /u01/stage/39292021 \
  -silent -ignorePrereqFailure -responseFile /u01/stage/dbinstall.rsp
'

Sur OL 8/9, omettez -applyOneOffs de la ligne runInstaller.

Ensuite, `root`exécutez le script de post-installation :

sudo /u01/app/oracle/product/26ai/db_1/root.sh

Configurer l'environnement Oracle

Sur chaque hôte de base de données (orcl sur oracdb1, orcls sur oracdb2):

sudo -u oracle tee -a /home/oracle/.bash_profile >/dev/null <<'EOF'
export ORACLE_HOME=/u01/app/oracle/product/26ai/db_1
export ORACLE_SID=orcl                          # use 'orcls' on oracdb2
export GRID_HOME=/u01/app/26ai/grid
export PATH=$ORACLE_HOME/bin:$GRID_HOME/bin:$PATH
export TNS_ADMIN=$ORACLE_HOME/network/admin
EOF

(Utilisez ORACLE_SID=orcls sur l’hôte de secours. La base de données de secours est créée dans Créer la base de données de secours.)

Créer la base de données principale (oracdb1 uniquement)

Exécutez `dbca`en mode silencieux sur les groupes de disques ASM :

sudo -u oracle bash -c '
export ORACLE_HOME=/u01/app/oracle/product/26ai/db_1
export PATH=$ORACLE_HOME/bin:$PATH

dbca -silent -createDatabase \
  -templateName General_Purpose.dbc \
  -gdbname orcl -sid orcl \
  -characterSet AL32UTF8 -nationalCharacterSet AL16UTF16 \
  -sysPassword "ChangeMe!1" -systemPassword "ChangeMe!1" \
  -emConfiguration NONE \
  -datafileDestination +DATA -storageType ASM \
  -recoveryAreaDestination +FRA -recoveryAreaSize 25000 \
  -enableArchive true -archiveLogMode AUTO \
  -memoryMgmtType AUTO_SGA -totalMemory 4096 \
  -databaseType MULTIPURPOSE \
  -createAsContainerDatabase true -numberOfPDBs 1 \
  -pdbName orclpdb -pdbAdminPassword "ChangeMe!1" \
  -ignorePreReqs
'

Indiquez où diriger les journaux d'archivage +RECO (le système de secours utilise des paramètres correspondants dans Étape 2 : Veille : fichier init.ora minimal, fichier de mots de passe, NOMOUNT) :

sudo -u oracle bash -c '
export ORACLE_HOME=/u01/app/oracle/product/26ai/db_1
export ORACLE_SID=orcl
$ORACLE_HOME/bin/sqlplus -s / as sysdba <<SQL
ALTER SYSTEM SET log_archive_dest_1='\''LOCATION=+RECO VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl'\'' SCOPE=BOTH;
ALTER PLUGGABLE DATABASE ALL OPEN;
ALTER PLUGGABLE DATABASE ALL SAVE STATE;
EXIT
SQL
'

Vérifiez que la base de données est opérationnelle sous Oracle Restart :

sudo /u01/app/26ai/grid/bin/srvctl status database -d orcl
# Expected: Database is running

sudo -u oracle sqlplus -s / as sysdba <<<"SELECT name, open_mode, log_mode FROM v\$database;"
# Expected: ORCL, READ WRITE, ARCHIVELOG

Créez un service applicatif (Oracle Restart). Les applications doivent se connecter via orclapp, et non via le nom de la base de données, afin que le basculement soit transparent.

sudo -u oracle bash -c '
export GRID_HOME=/u01/app/26ai/grid
export ORACLE_HOME=/u01/app/oracle/product/26ai/db_1
export PATH=$ORACLE_HOME/bin:$GRID_HOME/bin:$PATH

srvctl add service \
  -db orcl \
  -service orclapp \
  -pdb orclpdb \
  -role PRIMARY \
  -policy AUTOMATIC

srvctl start service -db orcl -service orclapp
srvctl status service -db orcl -service orclapp
'

Une fois le Broker activé, orclapp s'exécute uniquement sur PRIMARY. Multiplexez les fichiers de contrôle sur les groupes de disques ASM ; dimensionnez la mémoire en fonction de la charge de travail (ce guide utilise 4 Go / 3 Go de SGA à titre d'exemple).

Créer la base de données de secours

Créez orcls sur oracdb2 (volumes dédiés sur oracle-pool-b). Terminez la configuration initiale du système principal et du système de secours, puis Étape 3 : Initialisation de la veille GCNV, les tâches de finalisation du système de secours, et Configurer Data Guard Broker, FSFO et Observer. Cible : principal LECTURE ÉCRITURE ; secours PHYSICAL STANDBY, MONTÉ, MRP en cours d'application.

Étape 1 : Principal : mot de passe SYS, fichier de mots de passe et paramètres DG

Sur oracdb1 comme oracle :

sudo su - oracle
. ~/.bash_profile        # ORACLE_SID=orcl, ORACLE_HOME set

Sur oracdb2:

GRID_HOME=/u01/app/26ai/grid
sudo -u grid tee "$GRID_HOME/network/admin/listener.ora" >/dev/null <<'EOF'
LISTENER =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = oracdb2.example.internal)(PORT = 1521)))

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC = (GLOBAL_DBNAME = orcls)        (ORACLE_HOME = /u01/app/oracle/product/26ai/db_1) (SID_NAME = orcls))
    (SID_DESC = (GLOBAL_DBNAME = orcls_DGMGRL) (ORACLE_HOME = /u01/app/oracle/product/26ai/db_1) (SID_NAME = orcls)))
EOF

Redémarrez via Oracle Restart sur chaque hôte :

sudo -u grid bash -c '
export GRID_HOME=/u01/app/26ai/grid
export ORACLE_HOME=$GRID_HOME
$GRID_HOME/bin/srvctl stop listener
$GRID_HOME/bin/srvctl start listener
$GRID_HOME/bin/lsnrctl status
'

lsnrctl status doit lister <SID> et <SID>_DGMGRL.

Étape 2 : Veille : fichier init.ora minimal, fichier de mots de passe, NOMOUNT

Copiez le fichier de mot de passe principal sur le serveur de secours (IAP gcloud compute scp):

PRIMARY_ZONE=us-west1-a       # zone of oracdb1
STANDBY_ZONE=us-west1-b       # zone of oracdb2

gcloud compute scp \
  oracdb1:/u01/app/oracle/product/26ai/db_1/dbs/orapworcl ./orapworcl \
  --zone=$PRIMARY_ZONE --tunnel-through-iap

gcloud compute scp \
  ./orapworcl oracdb2:/u01/app/oracle/product/26ai/db_1/dbs/orapworcls \
  --zone=$STANDBY_ZONE --tunnel-through-iap

Sur oracdb2 le système principal, définissez le propriétaire et créez le fichier pfile de secours. Sur le système principal, copiez *.compatible d'abord :

# On oracdb1
sudo -u oracle sqlplus -s / as sysdba \
  <<<"SELECT value FROM v\$parameter WHERE name='compatible';"

On oracdb2, remplacez cette valeur par <COPY_FROM_PRIMARY> dans le bloc ci-dessous :

sudo -u oracle mkdir -p /u01/app/oracle/admin/orcls/adump
sudo chown oracle:oinstall /u01/app/oracle/product/26ai/db_1/dbs/orapworcls
sudo chmod 0600 /u01/app/oracle/product/26ai/db_1/dbs/orapworcls

sudo -u oracle tee /u01/app/oracle/product/26ai/db_1/dbs/initorcls.ora >/dev/null <<'EOF'
*.db_name='orcl'
*.db_unique_name='orcls'
*.audit_file_dest='/u01/app/oracle/admin/orcls/adump'
*.diagnostic_dest='/u01/app/oracle'
*.compatible='<COPY_FROM_PRIMARY>'
*.sga_target=3072m
*.pga_aggregate_target=1024m
*.processes=320
*.remote_login_passwordfile='EXCLUSIVE'
*.standby_file_management='AUTO'
*.fal_server='orcl'
*.log_archive_config='DG_CONFIG=(orcl,orcls)'
*.log_archive_dest_1='LOCATION=+RECO VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcls'
*.log_archive_dest_2='SERVICE=orcl AFFIRM SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl'
*.log_archive_dest_state_2='DEFER'
*.log_archive_format='%t_%s_%r.arc'
*.dg_broker_start=TRUE
*.undo_tablespace='UNDOTBS1'
*.open_cursors=300
*.db_create_file_dest='+DATA'
*.db_create_online_log_dest_1='+DATA'
*.db_recovery_file_dest='+FRA'
*.db_recovery_file_dest_size=25000m
EOF

echo "orcls:/u01/app/oracle/product/26ai/db_1:N" | sudo tee -a /etc/oratab

sudo -u oracle bash -c '
export ORACLE_HOME=/u01/app/oracle/product/26ai/db_1
export ORACLE_SID=orcls
sqlplus / as sysdba <<SQL
STARTUP NOMOUNT PFILE=/u01/app/oracle/product/26ai/db_1/dbs/initorcls.ora;
EXIT
SQL
'

NOMOUNT sans fichiers de données jusqu'à Étape 3 : Initialisation de la veille GCNV.

Étape 3 : Initialisation de la veille GCNV

Remplissez les volumes ASM de secours dans oracle-pool-b en utilisant la réplication Google Cloud NetApp Volumes (SnapMirror-basée, mode par défaut), les instantanés de volume ou le clonage, puis exécutez Oracle finalise. iSCSI et ASM sont identiques à Provisionner des volumes iSCSI GCNV.

API Utiliser

gcloud netapp storage-pools

Créer des pools Flex Unified en mode par défaut (--mode=default)

gcloud netapp volumes

volumes iSCSI, groupes d'hôtes, instantanés

gcloud netapp volumes replications

Réplication de volumes entre sites

Étape Action

1

Journal d'archivage principal + journalisation forcée (Étape 1 : Principal : mot de passe SYS, fichier de mots de passe et paramètres DG)

2

Mise en veille : BEGIN BACKUP enregistrement SCN, fichier de contrôle de secours

3

Réplication de volume (Créer des réplications de volume et Cutover : mettre au repos, arrêter la réplication, attacher des LUN de secours) ou instantané (Alternative — seed de snapshot)

4

Activé oracdb2 : iSCSI, multipath, montage ASM (Étape 4 : Configurer iSCSI Linux et le multipath pour les volumes iSCSI GCNV, Étape 5 : Partitionner les périphériques de stockage ASM sur les volumes iSCSI GCNV et )

5

Oracle finalise — récupération vers SCN, MONTÉ (Oracle finalise)

6

Reconstruction SRL (Étape 4 : Fichiers journaux de restauration en attente), MRP, courtier (Configurer Data Guard Broker, FSFO et Observer)

La réplication active RMAN reste valable pour les petits laboratoires. La réplication GCNV est préférable pour l’amorçage du serveur de secours en production.

Prérequis

  • `gcloud netapp`avec prise en charge de la réplication de volumes.

  • Deux pools en mode par défaut à des emplacements différents (oracle-pool-a, oracle-pool-b).

  • Volumes sources sur le pool principal attachés oracdb1-hg; volumes de destination créés par réplication.

  • Exécutez la réplication depuis Cloud Shell ou un poste de travail — pas depuis des machines virtuelles de base de données.

export PROJECT=<your-gcp-project>
export LOC_A=us-west1-a
export LOC_B=us-west1-b
export DEST_POOL="projects/${PROJECT}/locations/${LOC_B}/storagePools/oracle-pool-b"

Créer un pool de secours si nécessaire :

gcloud netapp storage-pools create oracle-pool-b \
  --project="${PROJECT}" --location="${LOC_B}" \
  --service-level=flex --type=unified --mode=default \
  --capacity=1024 --network=name=<your-vpc>

Créer des réplications de volume

gcloud netapp volumes replications create repl-oracdb2-data \
  --project="${PROJECT}" --location="${LOC_A}" --volume=oracdb1_data \
  --replication-schedule=EVERY_10_MINUTES \
  --destination-volume-parameters="storage_pool=${DEST_POOL},volume_id=oracdb2_data,share_name=oracdb2_data"

gcloud netapp volumes replications create repl-oracdb2-reco \
  --project="${PROJECT}" --location="${LOC_A}" --volume=oracdb1_reco \
  --replication-schedule=EVERY_10_MINUTES \
  --destination-volume-parameters="storage_pool=${DEST_POOL},volume_id=oracdb2_reco,share_name=oracdb2_reco"

Attendez que mirrorState soit REMIROTÉ / que la synchronisation initiale soit terminée.

Cutover : mettre au repos, arrêter la réplication, attacher des LUN de secours

Primaire:

ALTER DATABASE BEGIN BACKUP;
SELECT CURRENT_SCN FROM V$DATABASE;
ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/tmp/orcls_stby.ctl';

Autoriser le cycle de réplication final, puis :

gcloud netapp volumes replications stop repl-oracdb2-data \
  --project="${PROJECT}" --location="${LOC_A}" --volume=oracdb1_data --force

gcloud netapp volumes replications stop repl-oracdb2-reco \
  --project="${PROJECT}" --location="${LOC_A}" --volume=oracdb1_reco --force

Attachez les volumes de destination à oracdb2-hg (le LUN répliqué peut conserver le nom de la source — utilisez name=oracdb1_data_lun lors de la mise à jour) :

HG=$(gcloud netapp host-groups describe oracdb2-hg --project="${PROJECT}" \
  --location=us-west1 --format='value(name)')

gcloud netapp volumes update oracdb2_data --project="${PROJECT}" --location="${LOC_B}" \
  --block-devices="name=oracdb1_data_lun,host-groups=${HG},os-type=LINUX"

Copiez le fichier de contrôle vers oracdb2, puis sur le serveur principal :

ALTER DATABASE END BACKUP;

Alternative — seed de snapshot

Initialisation unique : instantané du volume source → création d’un volume à partir de l’instantané dans le pool de secours (Cloud Console ou API). Poursuivez Oracle finalise après l’attachement à oracdb2-hg.

iSCSI et ASM en veille (avant RMAN)

Sur oracdb2, connectez-vous aux portails iSCSI du standby pool. Si les en-têtes de disque ASM correspondent à la dénomination principale, utilisez des primary-style multipath aliases (lab : ora_oracdb1_data_01, ora_oracdb1_arch_01), définissez asm_diskstring='/dev/mapper/ora_oracdb1_*p*', chown grid:asmadmin sur les partitions, puis :

ALTER DISKGROUP DATA MOUNT FORCE;
ALTER DISKGROUP RECO MOUNT FORCE;
ALTER DISKGROUP FRA MOUNT FORCE;

Oracle finalise

STARTUP NOMOUNT;
RESTORE STANDBY CONTROLFILE FROM '/tmp/orcls_stby.ctl';
ALTER DATABASE MOUNT;
RECOVER DATABASE UNTIL SCN <quiesce_scn>;
ALTER DATABASE CONVERT TO PHYSICAL STANDBY;
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;

Après la conversion, reconstruisez les journaux de restauration de secours (le fichier de contrôle répliqué contient toujours +DATA/ORCL/… SRL paths — causes ORA-19527 / ORA-16086 sur le serveur principal). Voir Étape 4 : Fichiers journaux de restauration en attente.

Étape 4 : Fichiers journaux de restauration en attente

Requis sur les deux hôtes pour FSFO. Taille ≥ plus grande redo principale en ligne ; nombre = (groupes en ligne par thread) + 1.

Après l'initialisation GCNV : Supprimez tous les groupes de fichiers journaux de secours sur le serveur de secours et recréez-les sur +DATA uniquement (db_create_file_dest='+DATA'). Les chemins répliqués sous +DATA/ORCL/… causent ORA-19527 / ORA-16086 jusqu'à la reconstruction.

Primaire (orcl):

ALTER SYSTEM SET db_create_file_dest='+DATA' SCOPE=BOTH;
ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 ('+DATA') SIZE 1024M;
-- repeat (online log groups + 1) times

Standby (orcls) après la graine GCNV :

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
ALTER SYSTEM SET standby_file_management=MANUAL SCOPE=BOTH;
-- DROP STANDBY LOGFILE GROUP for each group# in v$standby_log;
ALTER SYSTEM SET db_create_file_dest='+DATA' SCOPE=BOTH;
ALTER SYSTEM SET standby_file_management=AUTO SCOPE=BOTH;
ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 ('+DATA') SIZE 1024M;
-- repeat (online groups + 1) times; one member per group
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

Étape 5 : Activez la restauration instantanée sur la base de secours et démarrez la récupération gérée

Activez la restauration flashback avant de démarrer la récupération gérée (flashback ne peut pas être activé pendant que MRP est actif).

# On oracdb2
sudo -u oracle bash -c '
. ~/.bash_profile
export ORACLE_SID=orcls
sqlplus / as sysdba <<SQL
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER SYSTEM SET db_flashback_retention_target=1440 SCOPE=BOTH;
ALTER DATABASE FLASHBACK ON;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
EXIT
SQL'

`USING CURRENT LOGFILE`permet l'application en temps réel (le redo est appliqué dès son arrivée dans les SRL).

Étape 6 : Activer la réexpédition sur le serveur principal

Remarque

LOG_ARCHIVE_DEST_2 a été délibérément défini sur DEFER dans Étape 2 : Veille : fichier init.ora minimal, fichier de mots de passe, NOMOUNT pour supprimer les erreurs continues ORA-12154 lors de la création de la veille. Activez-le maintenant que la veille est prête.

Passez LOG_ARCHIVE_DEST_STATE_2`à `ENABLE et forcez un basculement de journal afin que la première série de redo soit expédiée immédiatement :

sudo -u oracle bash -c '
. ~/.bash_profile
sqlplus / as sysdba <<SQL
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE SCOPE=BOTH;
ALTER SYSTEM SWITCH LOGFILE;
ALTER SYSTEM ARCHIVE LOG CURRENT;
SELECT dest_id, status, error FROM v$archive_dest_status WHERE dest_id IN (1,2);
EXIT
SQL
'
# Expected: dest_id=2, STATUS=VALID, ERROR null.

Si dest_2 affiche ORA-12154, relancez le primaire. Après Étape 1 : Activer le courtier sur les deux bases de données, gérez le transport via DGMGRL.

Étape 7 : Vérifier l’état cible de Data Guard

Sur le primaire (oracdb1):

sudo -u oracle sqlplus -s / as sysdba \
  <<<"SELECT database_role || ' | ' || open_mode FROM v\$database;"
# Expected: PRIMARY | READ WRITE

En mode veille (oracdb2 — Console Cloud SSH ou IAP depuis votre poste de travail :

gcloud compute ssh oracdb2 --tunnel-through-iap --zone=us-west1-b

sudo -u oracle bash <<'BASH'
. ~/.bash_profile
export ORACLE_SID=orcls

sqlplus -s / as sysdba <<'SQL'
SELECT database_role || ' | ' || open_mode
FROM v$database;

SELECT process, status, sequence#
FROM v$managed_standby
WHERE process IN ('MRP0','RFS');

EXIT
SQL
BASH

Attendu en veille : PHYSICAL STANDBY | MOUNTED; MRP0 avec APPLYING_LOG.

Si le standby signale MOUNTED mais que l’application n’est pas en cours d’exécution, redémarrez MRP sur oracdb2 :

sudo -u oracle bash -c '
. ~/.bash_profile
export ORACLE_SID=orcls
sqlplus / as sysdba <<SQL
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
EXIT
SQL'

Étape 8 : Enregistrez la base de données auprès d’Oracle Restart

Enregistrez le système de secours avec redémarrage après l'amorçage GCNV afin que les redémarrages récupèrent ASM, MOUNT et appliquent.

Sur oracdb2, capturez l’emplacement du spfile et enregistrez-le auprès d’Oracle Restart (remplacez <STANDBY_SPFILE_PATH> à partir de la requête, souvent sous +DATA) :

sudo -u oracle bash -c '
export ORACLE_SID=orcls
sqlplus -s / as sysdba <<< "SHOW PARAMETER spfile;"
'

sudo -u oracle bash -c '
export GRID_HOME=/u01/app/26ai/grid
export ORACLE_HOME=/u01/app/oracle/product/26ai/db_1
export PATH=$ORACLE_HOME/bin:$GRID_HOME/bin:$PATH

srvctl add database \
  -db orcls \
  -dbname orcl \
  -oraclehome /u01/app/oracle/product/26ai/db_1 \
  -spfile <STANDBY_SPFILE_PATH> \
  -pwfile /u01/app/oracle/product/26ai/db_1/dbs/orapworcls \
  -role PHYSICAL_STANDBY \
  -startoption MOUNT \
  -stopoption IMMEDIATE \
  -diskgroup DATA,RECO,FRA

srvctl config database -db orcls
srvctl status database -db orcls
'

Sur oracdb1, vérifiez que la ressource principale de la base de données Oracle Restart répertorie les dépendances du groupe de disques ASM. Ajoutez RECO si DBCA est enregistré uniquement DATA et FRA :

sudo -u oracle bash -c '
export GRID_HOME=/u01/app/26ai/grid
export ORACLE_HOME=/u01/app/oracle/product/26ai/db_1
export PATH=$ORACLE_HOME/bin:$GRID_HOME/bin:$PATH
srvctl config database -db orcl
srvctl modify database -db orcl -diskgroup DATA,RECO,FRA
srvctl config database -db orcl
'

Ajoutez le même service applicatif sur la ressource de base de données de secours (orcls sur oracdb2). Utilisez role PRIMARY des deux côtés afin que orclapp soit disponible après le basculement :

sudo -u oracle bash -c '
export GRID_HOME=/u01/app/26ai/grid
export ORACLE_HOME=/u01/app/oracle/product/26ai/db_1
export PATH=$ORACLE_HOME/bin:$GRID_HOME/bin:$PATH

srvctl add service \
  -db orcls \
  -service orclapp \
  -pdb orclpdb \
  -role PRIMARY \
  -policy AUTOMATIC

srvctl config service -db orcls -service orclapp
'

Sur oracdb2, confirmez la ressource de base de données de secours :

sudo -u oracle bash -c '
export GRID_HOME=/u01/app/26ai/grid
export ORACLE_HOME=/u01/app/oracle/product/26ai/db_1
export PATH=$ORACLE_HOME/bin:$GRID_HOME/bin:$PATH
srvctl status database -db orcls
'

Configurer Data Guard Broker, FSFO et Observer

Après ENABLE CONFIGURATION, gérez le transport et les rôles via DGMGRL (pas via SQL ad hoc LOG_ARCHIVE_DEST_*).

Étape 1 : Activer le courtier sur les deux bases de données

Sur les hôtes de base de données principal et de secours :

sudo -u oracle bash -c '
. ~/.bash_profile
sqlplus / as sysdba <<SQL
ALTER SYSTEM SET dg_broker_start=TRUE SCOPE=BOTH;
EXIT
SQL'

Sur l’hôte de base de données principal, connectez-vous avec l’authentification du système d’exploitation (le portefeuille Observer de Étape 5 : Démarrer l’observateur en tant qu’unité systemd n’est pas requis sur les hôtes de base de données) :

sudo -u oracle bash -c '
export ORACLE_HOME=/u01/app/oracle/product/26ai/db_1
export ORACLE_SID=orcl
export PATH=$ORACLE_HOME/bin:$PATH
dgmgrl /
'
Remarque

Sur l'hôte Observer uniquement, utilisez dgmgrl /@orcl après que le portefeuille de connexion automatique existe. Ne mettez pas de mots de passe sur la ligne de commandes dgmgrl.

DGMGRL> CREATE CONFIGURATION 'orcl_dg' AS
        PRIMARY DATABASE IS 'orcl' CONNECT IDENTIFIER IS orcl;
DGMGRL> ADD DATABASE 'orcls' AS CONNECT IDENTIFIER IS orcls;
DGMGRL> ENABLE CONFIGURATION;
DGMGRL> SHOW CONFIGURATION;
-- Expect: Configuration Status: SUCCESS, both members SUCCESS.

Exécutez VALIDATE DATABASE immédiatement : il détecte les fichiers de données orphelins, les SRL manquants, l’application des journaux de restauration non exécutée et d’autres pièges courants avant toute tentative de basculement. Tout WARNING ou non-NULL ERROR doit être corrigé avant Étape 3 : Configurer les propriétés FSFO et activer.

DGMGRL> VALIDATE DATABASE 'orcls';
DGMGRL> SHOW CONFIGURATION VERBOSE;

Étape 2 : Confirmer le retour en arrière (requis pour la réactivation automatique de FSFO)

Confirmez flashback_on sur les deux hôtes avant d'activer FSFO :

sudo -u oracle bash -c '
. ~/.bash_profile
sqlplus -s / as sysdba <<<"SELECT flashback_on FROM v\$database;"
'
# Expected on both hosts: YES

Sur le système principal uniquement, si la rétention n'est pas déjà configurée :

sudo -u oracle bash -c '
. ~/.bash_profile
export ORACLE_SID=orcl
sqlplus / as sysdba <<SQL
ALTER SYSTEM SET db_flashback_retention_target=1440 SCOPE=BOTH;
EXIT
SQL'

Étape 3 : Configurer les propriétés FSFO et activer

-- Transport mode and protection mode
DGMGRL> EDIT DATABASE 'orcl'  SET PROPERTY LogXptMode='SYNC';
DGMGRL> EDIT DATABASE 'orcls' SET PROPERTY LogXptMode='SYNC';
DGMGRL> EDIT CONFIGURATION SET PROTECTION MODE AS MaxAvailability;

-- FSFO targets (each side names the other)
DGMGRL> EDIT DATABASE 'orcl'  SET PROPERTY FastStartFailoverTarget = 'orcls';
DGMGRL> EDIT DATABASE 'orcls' SET PROPERTY FastStartFailoverTarget = 'orcl';

-- 30 s = default; lower for faster RTO but more sensitive to network blips
DGMGRL> EDIT CONFIGURATION SET PROPERTY FastStartFailoverThreshold = 30;
DGMGRL> EDIT CONFIGURATION SET PROPERTY FastStartFailoverAutoReinstate = TRUE;

DGMGRL> ENABLE FAST_START FAILOVER;
DGMGRL> SHOW FAST_START FAILOVER;
-- Expected: Threshold 30 seconds, Target orcls, Observer not yet registered.

Étape 4 : Installez Oracle Instant Client sur l’hôte Observer

# On oradg-obs, as root (use -el8 / -el9 if the Observer is on an older OL/RHEL)
sudo dnf install -y oracle-instantclient-release-el10
sudo dnf install -y oracle-instantclient-basic \
                    oracle-instantclient-sqlplus \
                    oracle-instantclient-tools

# Dedicated 'oracle' OS user (owns the wallet and the systemd unit)
sudo useradd -u 54321 -m oracle
sudo passwd -l oracle

# Oracle environment for the user
sudo mkdir -p /etc/oracle/network/admin
sudo chown -R oracle:oracle /etc/oracle
sudo -u oracle tee /home/oracle/.bash_profile >/dev/null <<'EOF'
export ORACLE_HOME=/usr/lib/oracle/26/client64
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export PATH=$ORACLE_HOME/bin:$PATH
export TNS_ADMIN=/etc/oracle/network/admin
EOF

# tnsnames.ora — must reach both DB hosts on TCP/1521
sudo tee /etc/oracle/network/admin/tnsnames.ora >/dev/null <<'EOF'
orcl =
  (DESCRIPTION =
  (ADDRESS = (PROTOCOL = TCP)(HOST = oracdb1)(PORT = 1521))
                (CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = orcl)))
orcls =
  (DESCRIPTION =
  (ADDRESS = (PROTOCOL = TCP)(HOST = oracdb2)(PORT = 1521))
                (CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = orcls)))
EOF
sudo chown oracle:oracle /etc/oracle/network/admin/tnsnames.ora

Étape 5 : Démarrer l’observateur en tant qu’unité systemd

Les identifiants résident dans un portefeuille à connexion automatique — jamais sur une dgmgrl ligne de commandes (visible par ps / journalctl). Connectez-vous avec /@<tns_alias> uniquement sur l’Observer.

Remarque
  • Utilisez un compte dédié : Stockez les informations d’identification d’un compte d’administrateur Data Guard dédié (par exemple, SYSDG) dans le portefeuille plutôt que SYS.

  • Portefeuille de connexion automatique requis : Le service systemd Observer nécessite un portefeuille de connexion automatique cwallet.sso). Si cwallet.sso est absent après l’exécution de mkstore, utilisez orapki du package tools d’Instant Client ou d’un répertoire d’installation de base de données pour créer le portefeuille de connexion automatique, puis réajoutez les informations d’identification enregistrées.

  1. Créez le portefeuille sur l'Observateur avec les identifiants des deux membres :

sudo -iu oracle bash <<'BASH'
mkdir -p $TNS_ADMIN/wallet
mkstore -wrl $TNS_ADMIN/wallet -create     # prompts for a wallet password — store in your secrets manager
mkstore -wrl $TNS_ADMIN/wallet -createCredential orcl  sys ChangeMe!1
mkstore -wrl $TNS_ADMIN/wallet -createCredential orcls sys ChangeMe!1
BASH

sudo tee /etc/oracle/network/admin/sqlnet.ora >/dev/null <<'EOF'
WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = /etc/oracle/network/admin/wallet)))
SQLNET.WALLET_OVERRIDE = TRUE
EOF
sudo chown oracle:oracle /etc/oracle/network/admin/sqlnet.ora
sudo chmod -R 0700 /etc/oracle/network/admin/wallet

sudo -iu oracle ls -l /etc/oracle/network/admin/wallet
# Expected: cwallet.sso and ewallet.p12

sudo -iu oracle bash <<'BASH'
sqlplus -L "/@orcl as sysdba" <<'SQL'
SELECT database_role FROM v$database;
EXIT
SQL
BASH

sudo -iu oracle bash <<'BASH'
sqlplus -L "/@orcls as sysdba" <<'SQL'
SELECT database_role FROM v$database;
EXIT
SQL
BASH

sudo -iu oracle dgmgrl /@orcl  'SHOW CONFIGURATION;'
sudo -iu oracle dgmgrl /@orcls 'SHOW CONFIGURATION;'
sudo -iu oracle orapki wallet create \
  -wallet /etc/oracle/network/admin/wallet \
  -auto_login
sudo -iu oracle ls -l /etc/oracle/network/admin/wallet
# Expected: cwallet.sso and ewallet.p12
  1. Unité Systemd + rotation des journaux :

sudo tee /etc/systemd/system/dgmgrl-observer.service >/dev/null <<'EOF'
[Unit]
Description=Oracle Data Guard Fast-Start Failover Observer
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=oracle
Group=oracle
Environment=ORACLE_HOME=/usr/lib/oracle/26/client64
Environment=LD_LIBRARY_PATH=/usr/lib/oracle/26/client64/lib
Environment=TNS_ADMIN=/etc/oracle/network/admin
Environment=PATH=/usr/lib/oracle/26/client64/bin:/usr/bin:/bin
ExecStart=/usr/lib/oracle/26/client64/bin/dgmgrl -silent /@orcl "START OBSERVER FILE IS '/var/lib/oracle/dgmgrl-observer.dat'"
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF
sudo install -d -o oracle -g oracle -m 0755 /var/lib/oracle
sudo install -o oracle -g oracle -m 0640 /dev/null /var/log/dgmgrl-observer.log

sudo tee /etc/logrotate.d/dgmgrl-observer >/dev/null <<'EOF'
/var/log/dgmgrl-observer.log {
    weekly
    rotate 8
    compress delaycompress missingok notifempty
    create 0640 oracle oracle
    copytruncate
}
EOF

sudo systemctl daemon-reload && sudo systemctl enable --now dgmgrl-observer.service
sudo systemctl status dgmgrl-observer.service

Vérifier auprès du principal — L'observateur doit lire CONNECTED (un DISCONNECTED observateur suspend silencieusement FSFO) :

DGMGRL> SHOW FAST_START FAILOVER;
DGMGRL> SHOW CONFIGURATION;       -- Configuration Status: SUCCESS, FSFO: ENABLED

Étape 6 : Tester FSFO (basculement et reprise après incident)

Changement prévu :

DGMGRL> VALIDATE DATABASE 'orcls';
DGMGRL> SWITCHOVER TO 'orcls';
DGMGRL> SHOW CONFIGURATION;
DGMGRL> SWITCHOVER TO 'orcl';        -- restore topology

Basculement imprévu : Utilisez une réinitialisation de la machine virtuelle (test de type plantage) dans une fenêtre de test ; un arrêt normal peut ne pas déclencher FSFO. Tail /var/log/dgmgrl-observer.log on oradg-obs ; restaurez la topologie une fois terminé.