Implementa Oracle Database 26ai de alta disponibilidad con Google Cloud NetApp Volumes
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:
-
oracdb1para la base de datos principal -
oracdb2para la base de datos de reserva -
oradg-obspara 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 |
Sí |
No |
Clon de instantánea |
Prod Basic (Reinicio) |
Reduce el tiempo de inactividad provocado por los fallos del sistema |
+ Oracle Restart |
No |
Sí |
Solo local |
Reinicio automático |
Prod HA (sin DG) |
DR manual aceptable |
+ Instantáneas / RMAN |
Parcial |
Sí |
Parcial |
Recuperación del clon GCNV |
Prod HA (DG + FSFO) |
Alta disponibilidad real (sin DBA) |
Data Guard + FSFO |
Sí |
Sí |
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.
Secciones que debes leer para tu nivel
Dependiendo del nivel de alta disponibilidad (HA) que quieras alcanzar, lee las secciones de la matriz a continuación. Por ejemplo, si quieres alta disponibilidad en producción con Data Guard y FSFO, lee todas las secciones. Si quieres Dev/Test o Prod Basic con Restart, lee solo la primera columna.
| Desarrollo/pruebas o Prod Basic (Reinicio) | Prod HA (sin Data Guard) | Prod HA (Data Guard + FSFO) |
|---|---|---|
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 |
|
Almacenamiento |
|
Inicialización en modo de espera |
GCNV replicar / instantánea / clonar → Oracle finalizar → Data Guard |
HA |
Reinicio, espera física (MOUNTED), Broker, FSFO, Observador ( |
Aplicaciones |
Servicio |
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.
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 |
|
|
|
|
Apoyar |
|
|
|
Mismo patrón de nomenclatura |
Observador |
|
|
— |
Solo disco de arranque |
| Almacenamiento | Respaldo | Uso |
|---|---|---|
Sistema operativo |
Disco de arranque de GCE |
Solo sistema operativo |
|
GCNV iSCSI |
Directorios de Grid/DB, staging (XFS) |
|
GCNV iSCSI |
ASM EXTERNO — archivos de datos, archivos, FRA |
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 |
|---|---|---|---|---|---|
|
|
|
OL 10, 50 GB Hyperdisk Balanced (solo para el sistema operativo) |
|
Base de datos principal |
|
|
Igual que el principal |
OL 10, 50 GB Hyperdisk Balanced (solo para el sistema operativo) |
Lo mismo |
Base de datos en espera |
|
|
|
OL 10, 20 GB Hyperdisk equilibrado |
Lo mismo |
FSFO Observer (solo para Instant Client) |
|
|
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 |
|---|---|---|
|
Conectado |
La ruta SSH funciona |
|
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)
|
|
Requisito previo: Conexión HTTPS saliente a |
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
|
|
Configuración de seguridad (OL 10): Los siguientes comandos configuran SELinux en modo permisivo y desactivan |
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.
|
|
Máquinas virtuales clonadas: Si ambos hosts comparten el mismo IQN, regénéralo en |
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 |
|---|---|---|
|
|
|
|
|
|
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).
|
|
Modo predeterminado (esta guía): Los grupos unificados de Flex utilizan el modo predeterminado ( |
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:
-
NetApp Volúmenes → Grupos de hosts → Crear
-
Nombre:
oracdb1-hg· Región:us-west1· Tipo: iniciador iSCSI · Tipo de SO: Linux -
Servidores: pega el IQN de
oracdb1(el valor de/etc/iscsi/initiatorname.iscsi) -
Descripción: «Oracle primary host oracdb1» · Crear
-
Repite para
oracdb2-hgcon el IQN deoracdb2
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 |
|---|---|---|---|
|
100 GiB |
|
|
|
50 GiB |
ASM |
|
|
50 GiB |
ASM |
|
|
100 GiB |
ASM |
|
|
100 GiB |
ASM |
|
Nombres de volúmenes: solo letras, números y guiones bajos (sin guiones).
|
|
Configuración mínima (solo para validación): Dos LUN por host ( |
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:
-
Direcciones IP del portal iSCSI →
<ISCSI_PORTAL_1>,<ISCSI_PORTAL_2>(portales del grupo principal enoracdb1; portales del grupo de reserva enoracdb2— pueden variar) -
Número de serie de volumen desde la Cloud Console: úsalo con el WWID detectado por el host en Paso 4: Configura iSCSI y multivía en Linux para los volúmenes iSCSI de GCNV
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).
-
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
-
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
-
Agrega los alias de WWID detectados por el host a
/etc/multipath.conf(no adivines —multipath.confno 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 doneAñade los alias concretos de ese host a
/etc/multipath.conf, luego asudo 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 |
|---|---|
|
Crear grupos unificados Flex en modo predeterminado ( |
|
Volúmenes iSCSI, grupos de hosts, instantáneas |
|
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: |
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 |
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 netappcon 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
|
|
|
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 /
'
|
|
Solo en el host Observer, usa |
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.
|
|
|
-
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
-
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.