Skip to main content
NetApp database solutions
Se proporciona el idioma español mediante traducción automática para su comodidad. En caso de alguna inconsistencia, el inglés precede al español.

Implementa Oracle Database 26ai de alta disponibilidad con Google Cloud NetApp Volumes

Colaboradores netapp-martyh

Esta guía explica cómo aprovisionar instancias de computación y almacenamiento, instalar Oracle Grid Infrastructure y Oracle Database, inicializar una base de datos en espera y configurar Oracle Data Guard con Fast-Start Failover.

Antes de empezar

Antes de empezar, asegúrate de que dispones de lo siguiente:

  • Un proyecto de Google Cloud con permisos para Compute Engine, redes VPC, configuración de cortafuegos, IAM y NetApp Volumes

    Tarea Acceso obligatorio

    Crear máquinas virtuales de Compute Engine

    Administrador de instancias informáticas (o equivalente)

    Cortafuegos / Políticas de cortafuegos

    Administrador de red o administrador de políticas delegado

    Crear grupos y volúmenes GCNV

    Administrador de volúmenes de NetApp

    Configura PSA

    Administrador de redes en el proyecto del host

    SSH a través de IAP

    Usuario del túnel protegido por IAP + inicio de sesión en el sistema operativo (si se usa)

  • La API de volúmenes de NetApp está habilitada

  • Una VPC y una subred configuradas para la región de destino

  • Private Services Access (PSA) configurado para Google Cloud NetApp Volumes

  • Oracle Linux 10 para todas las máquinas virtuales necesarias

  • Se ha configurado el DNS y la resolución de nombres de host para los hosts de la base de datos y el host Observer

  • Medios de instalación y archivos de parches de Oracle disponibles para Oracle Database 26ai y Grid Infrastructure

  • Familiaridad con Oracle Data Guard, Oracle Restart y conceptos de almacenamiento iSCSI

  • La sincronización de la hora está configurada para todas las máquinas virtuales.

    Puedes utilizar los siguientes comandos:

    gcloud services enable netapp.googleapis.com
    chronyc tracking
    timedatectl

Ejemplo de configuración utilizado en esta guía

Esta guía parte de los siguientes supuestos de implementación:

  • Tres máquinas virtuales de Google Compute Engine:

    • oracdb1 para la base de datos principal

    • oracdb2 para la base de datos de reserva

    • oradg-obs para el observador de conmutación por error de inicio rápido

  • Un grupo de almacenamiento unificado GCNV Flex por zona de base de datos

  • Cinco volúmenes iSCSI de GCNV por cada host de base de datos

  • Oracle Data Guard Broker y Fast-Start Failover para la conmutación automática por error

  • Almacenamiento dedicado por servidor de base de datos; los servidores principal y de reserva no comparten volúmenes iSCSI

Sustituye todos los valores de ejemplo en los comandos por los valores de tu entorno, incluidos los nombres de host, las direcciones IP, las zonas, los nombres de los proyectos, las IP del portal, las contraseñas y los nombres de los archivos multimedia de Oracle.

Objetivos

En este procedimiento, debes realizar las siguientes tareas:

  • Proporciona instancias de Compute Engine para la base de datos principal, la base de datos de reserva y Observer

  • Configura el almacenamiento iSCSI de GCNV y los dispositivos multivía para Oracle

  • Instala Oracle Grid Infrastructure y Oracle Database 26ai en ambos hosts de bases de datos

  • Crear la base de datos Oracle principal

  • Inicializa la base de datos de reserva usando la replicación GCNV, instantáneas o clones

  • Configura Oracle Data Guard Broker, Fast-Start Failover y el Observer

Opciones de implementación

En esta sección se comparan patrones prácticos de implementación de alta disponibilidad (HA) y recuperación ante desastres (DR) para Oracle Database en Google Compute Engine (GCE) con el almacenamiento en bloques iSCSI de Google Cloud NetApp Volumes (GCNV). También se destaca cómo la replicación de GCNV acelera la inicialización del servidor en espera. Usa esta matriz para elegir un nivel antes de empezar. Esta guía implementa Prod HA (Data Guard + FSFO), la fila inferior.

Ambiente Requisito Arquitectura recomendada HA DR Automatización Ventaja principal

Desarrollo y pruebas

Costo más bajo

Instancia única

No

No

Clon de instantánea

Prod Basic (Reinicio)

Reduce el tiempo de inactividad provocado por los fallos del sistema

+ Oracle Restart

No

Solo local

Reinicio automático

Prod HA (sin DG)

DR manual aceptable

+ Instantáneas / RMAN

Parcial

Parcial

Recuperación del clon GCNV

Prod HA (DG + FSFO)

Alta disponibilidad real (sin DBA)

Data Guard + FSFO

Completo

Alta disponibilidad real + conmutación rápida por fallo

HA / DR / Automatización: Sí = cumple el objetivo del nivel; No = no entra dentro del alcance; Parcial = solo a nivel de almacenamiento o pasos manuales.

Descripción general

Esta arquitectura implementa la alta disponibilidad de Oracle Database 26ai en Google Cloud utilizando el almacenamiento iSCSI de Google Cloud NetApp Volumes (GCNV) y Oracle Data Guard. GCNV ofrece almacenamiento en bloques de alto rendimiento y admite la inicialización en modo de espera en la capa de almacenamiento. Data Guard proporciona sincronización continua, conmutación de sitios y conmutación por error de inicio rápido.

Capa Role

GCNV

Almacenamiento en bloques, inicialización en espera, replicación de almacenamiento

Data Guard

Sincronización continua, aplicación de redo, conmutación de sitios, FSFO

La replicación GCNV reduce significativamente el tiempo de inicialización del sistema en espera en comparación con la duplicación activa de RMAN, ya que transfiere los datos en el nivel de almacenamiento en lugar de hacerlo a través de los canales de la base de datos Oracle. Prefiere la replicación GCNV para la inicialización de sistemas en espera de producción cuando tu entorno lo permita.

Componente Detalle

Servidores de bases de datos

oracdb1 / oracdb2 — diferentes zonas, cinco volúmenes iSCSI de GCNV cada uno

Almacenamiento

/u01 + ASM +DATA, +RECO, +FRA en GCNV (EXTERNO)

Inicialización en modo de espera

GCNV replicar / instantánea / clonar → Oracle finalizar → Data Guard

HA

Reinicio, espera física (MOUNTED), Broker, FSFO, Observador (oradg-obs)

Aplicaciones

Servicio orclapp

División en zonas: Una pool GCNV Flex Unified por zona de base de datos; volúmenes dedicados por host. Los discos de arranque son solo para el sistema operativo. Fuera del alcance: TDE, RAC, NVMe/TCP, OEM, Active Data Guard (el standby permanece MOUNTED).

Arquitectura

Diagrama de referencia

La arquitectura ofrece tres rutas de datos independientes. La replicación de almacenamiento y el transporte de redo de Data Guard son rutas independientes.

Oracle 26ai HA en GCNV - arquitectura de referencia
Figura 1. GCNV Oracle Deployment - arquitectura de referencia

La replicación de almacenamiento ≠ la replicación de redo. La ruta 1 traslada los archivos de datos en la capa GCNV para la inicialización del sistema en espera. La ruta 2 mantiene las bases de datos sincronizadas tras la transición. La ruta 3 coordina las transiciones de roles y la conmutación automática por error a través de Oracle Data Guard Broker y el Observer.

Funciones de la plataforma

Plataforma Ofrece

GCNV

Volúmenes iSCSI, instantáneas, replicación de volúmenes (copia de referencia + incrementales) — inicialización en espera

Data Guard

Reejecución del transporte, MRP, Broker, FSFO — sincronización continua y conmutación por error

La replicación GCNV ejecuta una copia de referencia y luego actualizaciones incrementales por bloques según la política. Data Guard se encarga de la aplicación de redo y FSFO después de que el servidor en espera está inicializado.

Topología y almacenamiento

Role VM Zona Pool GCNV Volúmenes (por host)

Primario

oracdb1

us-west1-a

oracle-pool-a

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

Apoyar

oracdb2

us-west1-b

oracle-pool-b

Mismo patrón de nomenclatura

Observador

oradg-obs

us-west1-c

Solo disco de arranque

Almacenamiento Respaldo Uso

Sistema operativo

Disco de arranque de GCE

Solo sistema operativo

/u01

GCNV iSCSI

Directorios de Grid/DB, staging (XFS)

+DATA / +RECO / +FRA

GCNV iSCSI

ASM EXTERNO — archivos de datos, archivos, FRA

Tipos de máquinas

Ejemplo n4-highmem-8 en esta guía; las cargas de trabajo OLTP suelen utilizar c4-standard-*.

Provisionar Compute Engine

Paso 1: crear las máquinas virtuales

Crea tres máquinas virtuales en diferentes zonas de la misma región (aislamiento de fallos zonales). Prefiere una región con menos emisiones de carbono para el TCO y la sostenibilidad donde cumpla con las necesidades de latencia y cumplimiento (por ejemplo us-west1 vs us-central1). Usa Cloud Console, gcloud, Terraform o tu flujo de aprovisionamiento estándar.

VM Zona Tipo de máquina Disco de arranque Red Objetivo

oracdb1

us-west1-a

n4-highmem-8 (ejemplo) o c4-standard-*

OL 10, 50 GB Hyperdisk Balanced (solo para el sistema operativo)

oracle-vpc / oracle-subnet, gVNIC

Base de datos principal

oracdb2

us-west1-b

Igual que el principal

OL 10, 50 GB Hyperdisk Balanced (solo para el sistema operativo)

Lo mismo

Base de datos en espera

oradg-obs

us-west1-c

e2-medium

OL 10, 20 GB Hyperdisk equilibrado

Lo mismo

FSFO Observer (solo para Instant Client)

Nota

Nivel de red: Premium cuando la latencia o el tráfico de salida (>~200 GiB/mes) importan; Standard para un menor TCO en desarrollo y pruebas.

Habilita Secure Boot, vTPM y Integrity Monitoring en los tres. El disco de arranque solo contiene el sistema operativo. /u01, los directorios de Grid/DB, el entorno de staging y todos los datos ASM utilizan volúmenes iSCSI de GCNV (consulta Provisiona volúmenes iSCSI de GCNV); no conectes un disco de datos GCE independiente para /u01.

Paso 2: Cortafuegos de VPC — añadir el puerto TCP/1521 a la lista de permisos en las tres zonas

Permite TCP/1521 entre las tres VM /32 IPs internas en cada zona (us-west1-a/b/c aquí). Usa reglas de firewall de VPC o políticas de firewall con la misma lista de permitidos. Faltan reglas que rompen el transporte de redo y la conectividad de Observer.

Cloud Console: Red VPC → Cortafuegos → Crear regla allow-oracle-net-dbhosts en oracle-vpc — Ingreso, Permitir, fuentes = tres /32 IPs, TCP 1521. Refleja la salida si es necesario. Valida desde cada 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
Puerto Previsto Significado

22

Conectado

La ruta SSH funciona

1521

Conexión rechazada

El cortafuegos está abierto; el listener de Grid se inicia durante Paso 1: instalar Oracle Grid Infrastructure (Oracle Restart) en cada servidor de base de datos

O bien

Tiempo de espera

Corregir el firewall o el enrutamiento

Ejecuta desde las tres máquinas virtuales hacia cada dirección IP de par.

Paso 3: Nombre de host, DNS y /etc/hosts

Después de que se inicie cada máquina virtual, configura el nombre de host y añade /etc/hosts entradas en los tres hosts para que la resolución de nombres directa e inversa funcione para Oracle Net, el broker y el 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

Sustituye las direcciones IP internas de GCE (visibles en la lista Compute Engine → VM instances, en la columna Internal IP).

Valida desde cada host:

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

Paso 4: Configuración de referencia del sistema operativo (solo para hosts de bases de datos)

Nota

Requisito previo: Conexión HTTPS saliente a yum.oracle.com (Cloud NAT o servidor espejo interno en subredes privadas).

Ejecútalo en oracdb1 y oracdb2 (la configuración de Observer se explica en Paso 4: instala Oracle Instant Client en el host 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
Nota

Configuración de seguridad (OL 10): Los siguientes comandos configuran SELinux en modo permisivo y desactivan firewalld. Esta es solo una configuración mínima para el laboratorio. Para una configuración reforzada de SELinux y del cortafuegos, consulta la línea base de seguridad de tu organización.

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

Paso 5: anota el nombre del iniciador iSCSI (IQN)

Tras el reinicio, anota el IQN de cada host de base de datos. Utilizarás estos IQN para crear los grupos de hosts de GCNV en Paso 2: Crear los grupos de hosts.

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

Repítelo en oracdb2. Registra el IQN de cada host — un grupo de host por host, así un reinicio o la regeneración del IQN de un host no puede afectar la visibilidad del volumen iSCSI GCNV de otro host.

Nota

Máquinas virtuales clonadas: Si ambos hosts comparten el mismo IQN, regénéralo en oracdb2 (detén iscsi, borra /var/lib/iscsi/nodes/*, nuevo InitiatorName en /etc/iscsi/initiatorname.iscsi, reinicia iscsid).

Provisiona volúmenes iSCSI de GCNV

Paso 1: Crea un grupo de almacenamiento GCNV Flex Unified iSCSI por cada zona de base de datos

Un grupo Flex Unified por zona de base de datos (véase Arquitectura).

Crea dos grupos para este diseño de alta disponibilidad (repite los pasos para cada zona):

Nombre del pool Zona Utilizado por

oracle-pool-a

us-west1-a

oracdb1 (primaria)

oracle-pool-b

us-west1-b

oracdb2 (en espera)

NetApp Volumes → Storage pools → Create para cada pool:

  • Nivel de servicio: Flex (no Premium)

  • Tipo: Unificado

  • Zona: debe coincidir con la zona de la máquina virtual de la base de datos (us-west1-a / us-west1-b

  • Aviso de interés público: conectado a oracle-vpc

  • Capacidad: dimensionada en función de la carga de trabajo; usa un rendimiento personalizado provisionado o IOPS cuando las operaciones de redo, copia de seguridad o restauración superen el margen predeterminado (hasta 5120 MiB/s o 160K IOPS por grupo, según los límites del producto)

Espera a READY. Adapta el tamaño de los grupos a las necesidades de tu base de datos (los tamaños que aparecen en Paso 3: Crear los volúmenes iSCSI de GCNV son ejemplos).

Nota

Modo predeterminado (esta guía): Los grupos unificados de Flex utilizan el modo predeterminado (--mode=default). Crea grupos y volúmenes iSCSI con Cloud Console o gcloud netapp. La replicación de volúmenes, las instantáneas y los clones utilizan las API de Google Cloud (Paso 3: inicialización del modo de espera de GCNV).

Paso 2: Crea los grupos de hosts (uno por cada host de base de datos)

Crea un grupo de hosts por cada host de base de datos, de modo que cada máquina virtual solo vea sus propios volúmenes; los hosts primario y de reserva no deben compartir volúmenes iSCSI de GCNV. El Observer no dispone de recursos GCNV. En la Consola en la nube:

  1. NetApp Volúmenes → Grupos de hosts → Crear

  2. Nombre: oracdb1-hg · Región: us-west1 · Tipo: iniciador iSCSI · Tipo de SO: Linux

  3. Servidores: pega el IQN de oracdb1 (el valor de /etc/iscsi/initiatorname.iscsi)

  4. Descripción: «Oracle primary host oracdb1» · Crear

  5. Repite para oracdb2-hg con el IQN de oracdb2

Paso 3: Crea los volúmenes iSCSI de GCNV (por cada host de base de datos)

Cada servidor de bases de datos dispone de cinco volúmenes iSCSI de GCNV en el grupo de su zona — uno para /u01 y cuatro dispositivos de respaldo ASM:

Volumen iSCSI de GCNV Size Uso Alias de multivía

ora_<host>_u01

100 GiB

/u01 Volumen iSCSI de GCNV — Grid/Oracle homes, entorno de prueba

/dev/mapper/ora_<host>_u01

ora_<host>_data_01

50 GiB

ASM +DATA

/dev/mapper/ora_<host>_data_01

ora_<host>_data_02

50 GiB

ASM +DATA (a rayas)

/dev/mapper/ora_<host>_data_02

ora_<host>_arch_01

100 GiB

ASM +RECO

/dev/mapper/ora_<host>_arch_01

ora_<host>_fra_01

100 GiB

ASM +FRA

/dev/mapper/ora_<host>_fra_01

Nombres de volúmenes: solo letras, números y guiones bajos (sin guiones).

Nota

Configuración mínima (solo para validación): Dos LUN por host (*_data, *_reco) con arch_01p1+RECO y arch_01p2+FRA es aceptable para laboratorio; en producción se usan cinco volúmenes por Paso 3: Crear los volúmenes iSCSI de GCNV.

En oracdb1: crea los cinco volúmenes en oracle-pool-a, grupo de hosts oracdb1-hg.

En oracdb2: crea los cinco volúmenes en oracle-pool-b, grupo de hosts oracdb2-hg.

NetApp Volúmenes → Volúmenes → Crear — iSCSI, pool correcto y grupo de hosts correcto, Linux. Registro por pool:

Paso 4: Configura iSCSI y multivía en Linux para los volúmenes iSCSI de GCNV

Ejecútalo en oracdb1 utilizando los portales del grupo de ese host, luego en oracdb2 utilizando los portales del grupo de reserva.

Si el tráfico saliente del host está restringido, permite TCP/3260 desde cada máquina virtual de base de datos hacia las IP del portal iSCSI de GCNV (además de TCP/1521 entre máquinas virtuales desde Paso 2: Cortafuegos de VPC — añadir el puerto TCP/1521 a la lista de permisos en las tres zonas).

  1. Descubre los objetivos, inicia sesión y mantén el inicio del nodo:

    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

Después de reiniciar, vuelve a comprobar antes de iniciar Oracle:

+

sudo iscsiadm --mode session
sudo multipath -ll
  1. Configura 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. Agrega los alias de WWID detectados por el host a /etc/multipath.conf (no adivines — multipath.conf no expande variables de shell). Detecta los 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

    Añade los alias concretos de ese host a /etc/multipath.conf, luego a sudo systemctl restart multipathd.

    En oracdb1, añade:

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  }
}

+ En oracdb2, utiliza el mismo patrón con ora_oracdb2_* alias, luego:

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

Paso 5: particionar los dispositivos de almacenamiento ASM en volúmenes iSCSI de GCNV

Particiona los cuatro dispositivos de soporte ASM (no u01) con una partición GPT cada uno. ASM utiliza la partición sin formato. Ejecuta en cada host. Todos los bloques posteriores utilizan HOST=$(hostname -s) para seleccionar automáticamente los dispositivos del host 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

Paso 6: formatea y monta /u01 en el volumen iSCSI local de GCNV

El volumen iSCSI de GCNV ora_<host>_u01 contiene Grid home, Oracle home y staging. Formatea XFS en el dispositivo multivía (sin particionar para ASM). Usa UUID en /etc/fstab (no una etiqueta de sistema de archivos compartido):

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

Reinicia una vez y confirma que se monten /u01 antes de Instala el software de Oracle.

Instala el software de Oracle

Ejecuta Grid y luego la instalación del home de la base de datos en cada host de base de datos antes de Crear la base de datos principal.

Paso 1: instalar Oracle Grid Infrastructure (Oracle Restart) en cada servidor de base de datos

Ejecuta todo lo de esta sección en oracdb1, luego repítelo en oracdb2. Ambos hosts tienen su propio Grid home, instancia ASM y grupos de discos; Data Guard replica a través de Oracle Net, no a través del almacenamiento.

Instala los binarios de Oracle en /u01

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

Descomprime el home de Grid en su lugar

26ai Grid GoldImage se instala descomprimiendo en el directorio de inicio de Grid de destino:

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

Nivel de RU de Grid. Esta guía asume que el Grid GoldImage ya incluye tu RU validado. Si el Grid GoldImage es más antiguo que el RU objetivo, aplica el parche al home de Grid durante la configuración usando el flujo documentado por Oracle gridSetup.sh -applyRU, o usa un Grid GoldImage con el RU incluido. Mantén los homes de Grid y de Database en el mismo nivel de parcheo previsto.

De una sola vez gridSetup — archivo de respuesta HA_CONFIG completo

Instala /tmp/grid.rsp en cada host (responseFileVersion es obligatorio; sustituye HOST y utiliza contraseñas seguras):

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

Ejecuta gridSetup para copiar los archivos binarios y preparar la configuración:

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
'

Espera Successfully Setup Software with warning(s). y el código de salida 6 (advertencias) o 0.

Ejecuta orainstRoot.sh y root.sh como root

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

root.sh crea los crsctl / srvctl / asmcmd wrappers y levanta OHAS.

gridSetup.sh -executeConfigTools — abre ASM y crea +DATA

Ejecuta los asistentes de configuración (NETCA, ASMCA, CVU) con el archivo de respuesta de — esto crea la instancia ASM y el grupo de discos +DATA:

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
'

Espera Successfully Configured Software. después de NETCA / ASMCA / CVU.

Crear +RECO y +FRA grupos de discos

La instalación de un solo paso solo crea +DATA. Crea los otros dos a través de 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
"

Verifica ASM y 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.

Repite esta sección en oracdb2. El patrón HOST=$(hostname -s) en y selecciona automáticamente los dispositivos iSCSI GCNV de ese host. Utiliza los mismos nombres de grupos de discos ASM — Data Guard replica a través de Oracle Net, no almacenamiento.

Paso 2: Instala Oracle Database 26ai en cada servidor de base de datos

Ejecuta esta sección en oracdb1 y luego en oracdb2. La base de datos de espera se crea en Crear la base de datos de reserva.

Descomprime el DB home y el parche 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

Consulta la documentación de Oracle para ver la estructura del directorio RU y la ruta -applyRU.

Instalación silenciosa exclusivamente mediante software con la RU aplicada

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
'

En OL 8/9, omite -applyOneOffs de la línea runInstaller.

Como root, ejecuta el script de posinstalación:

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

Configura el entorno de Oracle

En cada host de base de datos (orcl en oracdb1, orcls en 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

(Usa ORACLE_SID=orcls en el host de reserva. La base de datos de reserva se crea en Crear la base de datos de reserva.)

Crea la base de datos principal (oracdb1 solo)

Ejecuta dbca en modo silencioso sobre los grupos de discos 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
'

Apunta los archivelogs a +RECO (el standby usa la configuración correspondiente en Paso 2: Standby: archivo pfile init.ora mínimo, archivo de contraseñas, 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
'

Comprueba que la base de datos está en funcionamiento en 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

Crear un servicio de aplicaciones basado en roles (Oracle Restart). Las aplicaciones deben conectarse a través de orclapp, no al nombre de la base de datos, para que la conmutación por error sea transparente.

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
'

Después de habilitar Broker, orclapp se ejecuta solo en PRIMARY. Multiplexa los archivos de control entre grupos de discos ASM; ajusta el tamaño de la memoria a la carga de trabajo (en esta guía se usan 4 GB / 3 GB de SGA como ejemplos).

Crear la base de datos de reserva

Crea orcls en oracdb2 (volúmenes dedicados en oracle-pool-b). Completa la configuración inicial del primario y del standby, luego Paso 3: inicialización del modo de espera de GCNV, las tareas de finalización del standby y Configura Data Guard Broker, FSFO y Observer. Destino: primario READ WRITE; standby PHYSICAL STANDBY, MOUNTED, MRP aplicando.

Paso 1: Primario: contraseña SYS, archivo de contraseñas y parámetros DG

En oracdb1 como oracle:

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

En 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

Reinicia mediante Oracle Restart en cada host:

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 debe incluir <SID> y <SID>_DGMGRL.

Paso 2: Standby: archivo pfile init.ora mínimo, archivo de contraseñas, NOMOUNT

Copia el archivo de contraseñas principal al servidor en espera (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

En oracdb2, configura los permisos de propiedad y crea el archivo pfile de espera. En el primario, copia *.compatible primero:

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

En oracdb2, sustituye ese valor por <COPY_FROM_PRIMARY> en el bloque siguiente:

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 sin archivos de datos hasta Paso 3: inicialización del modo de espera de GCNV.

Paso 3: inicialización del modo de espera de GCNV

Rellena los volúmenes ASM en espera en oracle-pool-b*usando Google Cloud NetApp Volumes replication (basado en SnapMirror, Default-mode), instantáneas de volumen o clon, luego ejecuta Oracle finaliza. iSCSI y ASM son lo mismo que Provisiona volúmenes iSCSI de GCNV.

API Uso

gcloud netapp storage-pools

Crear grupos unificados Flex en modo predeterminado (--mode=default)

gcloud netapp volumes

Volúmenes iSCSI, grupos de hosts, instantáneas

gcloud netapp volumes replications

Replicación de volumen entre ubicaciones

Paso Acción

1

Archivelog principal + force logging (Paso 1: Primario: contraseña SYS, archivo de contraseñas y parámetros DG)

2

Quiesce: BEGIN BACKUP, registrar SCN, archivo de control en espera

3

Replicación de volúmenes (Crear replicaciones de volumen y Transición — poner en modo inactivo, detener la replicación, conectar los LUN de espera) o instantánea (Alternativa — semilla de instantánea)

4

En oracdb2: iSCSI, multivía, montaje ASM (Paso 4: Configura iSCSI y multivía en Linux para los volúmenes iSCSI de GCNV, Paso 5: particionar los dispositivos de almacenamiento ASM en volúmenes iSCSI de GCNV y )

5

Oracle finaliza: recuperación en SCN, MOUNTED (Oracle finaliza)

6

Reconstrucción de SRL (Paso 4: Archivos de registro de recuperación en espera), MRP, broker (Configura Data Guard Broker, FSFO y Observer)

La réplica activa de RMAN sigue siendo válida para laboratorios pequeños. Se prefiere la replicación GCNV para la inicialización de sistemas de reserva en producción.

Prerrequisitos

  • gcloud netapp con compatibilidad con la replicación de volúmenes.

  • Dos grupos Default-mode en diferentes ubicaciones (oracle-pool-a, oracle-pool-b).

  • Los volúmenes de origen del grupo primario se encuentran en oracdb1-hg; los volúmenes de destino se crean mediante replicación.

  • Ejecuta la replicación desde Cloud Shell o desde una estación de trabajo, no desde DB VMs.

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"

Crea un grupo de reserva si es necesario:

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>

Crear replicaciones de volumen

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"

Espera hasta que mirrorState esté MIRRORED / se complete la sincronización inicial.

Transición — poner en modo inactivo, detener la replicación, conectar los LUN de espera

Principal:

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

Deja que se complete el ciclo de replicación final y, a continuación:

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

Asigna los volúmenes de destino a oracdb2-hg (el LUN replicado puede conservar el nombre de origen — usa name=oracdb1_data_lun al actualizar):

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"

Copia el archivo de control en oracdb2, luego en el servidor principal:

ALTER DATABASE END BACKUP;

Alternativa — semilla de instantánea

Inicialización única: instantánea en el volumen de origen → crear volumen a partir de la instantánea en el grupo de espera (Cloud Console o API). Continúa con Oracle finaliza después de adjuntar a oracdb2-hg.

ISCSI en modo de espera y ASM (antes de RMAN)

En oracdb2, inicia sesión en los portales iSCSI de standby pool. Si los encabezados de los discos ASM coinciden con la nomenclatura principal, usa alias multivía al estilo principal (laboratorio: ora_oracdb1_data_01, ora_oracdb1_arch_01), configura asm_diskstring='/dev/mapper/ora_oracdb1_*p*', chown grid:asmadmin en las particiones y luego:

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

Oracle finaliza

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;

Después de convertir, reconstruye los registros de recuperación en espera (el archivo de control replicado todavía tiene rutas SRL de +DATA/ORCL/… — esto causa ORA-19527 / ORA-16086 en el primario). Consulta Paso 4: Archivos de registro de recuperación en espera.

Paso 4: Archivos de registro de recuperación en espera

Requerido en ambos hosts para FSFO. Tamaño ≥ el registro de recuperación primario en línea más grande; recuento = (grupos en línea por subproceso) + 1.

Después de la instalación inicial de GCNV: Elimina todos los grupos de archivos de registro de espera en el servidor de espera y vuelve a crearlos únicamente en +DATA (db_create_file_dest='+DATA'). Las rutas replicadas en +DATA/ORCL/… provocan ORA-19527 / ORA-16086 hasta que se reconstruyan.

Principal (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

En espera (orcls) después de la siembra de 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;

Paso 5: Habilita flashback en el servidor de reserva e inicia la recuperación gestionada

Habilita flashback antes de iniciar la recuperación gestionada (flashback no se puede habilitar mientras MRP esté activo).

# 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 permite la aplicación en tiempo real (el redo se aplica en cuanto llega a los SRL).

Paso 6: Habilita el envío de registros de recuperación en el primario

Nota

LOG_ARCHIVE_DEST_2 se configuró deliberadamente como DEFER en Paso 2: Standby: archivo pfile init.ora mínimo, archivo de contraseñas, NOMOUNT para evitar errores continuos de ORA-12154 durante la creación del standby. Actívalo ahora que el standby está listo.

Cambia LOG_ARCHIVE_DEST_STATE_2 a ENABLE y fuerza un cambio de registro para que la primera ronda de redo se envíe de inmediato:

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 muestra ORA-12154, reinicia el primario. Después de Paso 1: Habilitar el broker en ambas bases de datos, gestiona el transporte vía DGMGRL.

Paso 7: verifica el estado de Data Guard del destino

En la primaria (oracdb1):

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

En el servidor de espera (oracdb2 — Cloud Console SSH o IAP desde tu estación de trabajo):

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

Se espera que estén disponibles en el standby: PHYSICAL STANDBY | MOUNTED; MRP0 con APPLYING_LOG.

Si el sistema en espera informa MOUNTED pero apply no se está ejecutando, reinicia MRP en 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'

Paso 8: registra la base de datos de reserva con Oracle Restart

Registra el sistema de reserva con Reiniciar tras la inicialización de GCNV para que los reinicios recuperen ASM, MOUNT y apliquen.

En oracdb2, anota la ubicación del spfile y regístralo en Oracle Restart (sustituye <STANDBY_SPFILE_PATH> de la consulta, normalmente bajo +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
'

En oracdb1, verifica que el recurso principal de la base de datos Oracle Restart liste las dependencias del grupo de discos ASM. Agrega RECO si DBCA solo registró DATA y 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
'

Agrega el mismo servicio de aplicación al recurso de la base de datos en espera (orcls en oracdb2). Utiliza role PRIMARY en ambos lados para que orclapp esté disponible tras la conmutación de sitios:

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
'

En oracdb2, confirma el recurso de la base de datos en espera:

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
'

Configura Data Guard Broker, FSFO y Observer

Después de ENABLE CONFIGURATION , gestiona el transporte y los roles mediante DGMGRL (no ad-hoc LOG_ARCHIVE_DEST_* SQL).

Paso 1: Habilitar el broker en ambas bases de datos

En los hosts de bases de datos primario y de reserva:

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

En el servidor de base de datos principal, conéctate mediante la autenticación del sistema operativo (el wallet Observer de Paso 5: Inicia el Observer como una unidad de systemd no es necesario en los hosts de base de datos):

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 /
'
Nota

Solo en el host Observer, usa dgmgrl /@orcl después de que exista el wallet de inicio de sesión automático. No pongas contraseñas en la línea de comandos 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.

Ejecuta VALIDATE DATABASE inmediatamente: detecta archivos de datos huérfanos, SRL faltantes, la aplicación de redo que no se está ejecutando y otros problemas habituales antes de que intentes una conmutación de sitios. Cualquier WARNING o no NULL ERROR debe corregirse antes de Paso 3: Configura las propiedades de FSFO y actívalo.

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

Paso 2: Confirma el flashback (requisito para la reactivación automática de FSFO)

Confirma flashback_on en ambos hosts antes de habilitar FSFO:

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

Solo en el primario, si la retención aún no está configurada:

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'

Paso 3: Configura las propiedades de FSFO y actívalo

-- 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.

Paso 4: instala Oracle Instant Client en el host 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

Paso 5: Inicia el Observer como una unidad de systemd

Las credenciales se almacenan en una cartera de inicio de sesión automático — nunca en una dgmgrl línea de comandos (visible para ps / journalctl). Conéctate con /@<tns_alias> solo en el Observer.

Nota
  • Utiliza una cuenta específica: Guarda en el monedero las credenciales de una cuenta administrativa específica de Data Guard (por ejemplo, SYSDG) en lugar de SYS.

  • Se requiere una cartera de inicio de sesión automático: El servicio systemd de Observer requiere una cartera de inicio de sesión automático cwallet.sso). Si cwallet.sso falta después de ejecutar mkstore, usa orapki del paquete tools de Instant Client o de un database home para crear la cartera de inicio de sesión automático y luego vuelve a añadir las credenciales almacenadas.

  1. Crea el monedero en el Observer con las credenciales de ambos miembros:

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. Unidad de Systemd + rotación de registros:

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

Verifica desde el primario: Observer debe leer CONNECTED (un DISCONNECTED Observer suspende silenciosamente FSFO):

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

Paso 6: Probar FSFO (conmutación de sitios y conmutación por error)

Conmutación de sitios programada:

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

Conmutación por error no planificada: Utiliza la opción Reiniciar de la máquina virtual (prueba de tipo crash) en una ventana de prueba; una Parada normal puede que no active FSFO. Tail /var/log/dgmgrl-observer.log on oradg-obs; restaura la topología cuando termines.