Déployez Oracle Database 26ai à haute disponibilité avec Google Cloud NetApp Volumes
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 :
-
oracdb1pour la base de données principale -
oracdb2pour la base de données de secours -
oradg-obspour 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.
Sections à lire pour votre niveau
Selon le niveau de haute disponibilité (HA) que vous souhaitez atteindre, lisez les sections du tableau ci-dessous. Par exemple, si vous souhaitez une HA en production avec Data Guard et FSFO, lisez toutes les sections. Si vous souhaitez Dev/Test ou Prod Basic avec Restart, lisez uniquement la première colonne.
| Développement/Test ou Prod Basic (Redémarrage) | Haute disponibilité de production (sans Data Guard) | Haute disponibilité de production (Data Guard + FSFO) |
|---|---|---|
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 |
|
Stockage |
|
Initialisation en veille |
GCNV réplication/instantané/clonage → Oracle finaliser → Data Guard |
HA |
Redémarrage, veille physique (MONTÉ), Broker, FSFO, Observer ( |
Applications |
Service |
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.
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 |
|
|
|
|
Attendre |
|
|
|
Même modèle de dénomination |
Observateur |
|
|
— |
disque de démarrage uniquement |
| Stockage | Support | Utiliser |
|---|---|---|
Système d'exploitation |
disque de démarrage GCE |
Système d'exploitation uniquement |
|
GCNV iSCSI |
Domiciles Grid/DB, staging (XFS) |
|
GCNV iSCSI |
ASM EXTERNE — fichiers de données, archives, FRA |
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 |
|---|---|---|---|---|---|
|
|
|
OL 10, Hyperdisk équilibré de 50 Go (OS only) |
|
Base de données principale |
|
|
Identique au primaire |
OL 10, Hyperdisk équilibré de 50 Go (OS only) |
Même |
Base de données de secours |
|
|
|
OL 10, 20 Go Hyperdisk Balanced |
Même |
Observateur FSFO (Client instantané uniquement) |
|
|
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 |
|---|---|---|
|
Connecté |
Le chemin SSH fonctionne |
|
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)
|
|
Prérequis : HTTPS sortant vers |
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
|
|
Configuration de sécurité (OL 10) : Les commandes ci-dessous configurent SELinux en mode permissif et le désactivent |
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.
|
|
VM clonées : Si les deux hôtes partagent le même IQN, régénérez sur |
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 |
|---|---|---|
|
|
|
|
|
|
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).
|
|
Mode par défaut (ce guide) : Les pools Flex Unified utilisent le mode par défaut ( |
É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 :
-
NetApp Volumes → Groupes d'hôtes → Créer
-
Nom :
oracdb1-hg· Région :us-west1· Type : Initiateur iSCSI · Type de système d’exploitation : Linux -
Hôtes : collez l’IQN à partir de
oracdb1(la valeur de/etc/iscsi/initiatorname.iscsi) -
Description : « Hôte principal Oracle oracdb1 » · Créer
-
Répétez pour
oracdb2-hgavecoracdb2l’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 |
|---|---|---|---|
|
100 Gio |
`/u01`Volume iSCSI GCNV — Répertoires Grid/Oracle, zone de transit |
|
|
50 Gio |
ASM |
|
|
50 Gio |
ASM |
|
|
100 Gio |
ASM |
|
|
100 Gio |
ASM |
|
Noms de volumes : lettres, chiffres, traits de soulignement uniquement (pas de traits d'union).
|
|
Configuration minimale (validation uniquement) : Deux LUN par hôte ( |
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 :
-
Adresses IP des portails iSCSI →
<ISCSI_PORTAL_1>,<ISCSI_PORTAL_2>(portails du pool principal suroracdb1; portails du pool de secours suroracdb2— ils peuvent différer) -
Numéro de série du volume depuis la console cloud — à utiliser avec le WWID découvert par l’hôte dans Étape 4 : Configurer iSCSI Linux et le multipath pour les volumes iSCSI GCNV
É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).
-
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
-
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
-
Ajoutez les alias WWID détectés par l'hôte
/etc/multipath.conf(ne devinez pas —multipath.confne 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 doneAjoutez des alias concrets pour cet hôte à
/etc/multipath.conf, puissudo 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 |
|---|---|
|
Créer des pools Flex Unified en mode par défaut ( |
|
volumes iSCSI, groupes d'hôtes, instantanés |
|
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 : |
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é |
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
|
|
|
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 /
'
|
|
Sur l'hôte Observer uniquement, utilisez |
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.
|
|
|
-
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
-
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é.