Skip to main content
NetApp database solutions
O português é fornecido por meio de tradução automática para sua conveniência. O inglês precede o português em caso de inconsistências.

Implante a alta disponibilidade do Oracle Database 26ai com o Google Cloud NetApp Volumes

Colaboradores netapp-martyh

Este guia mostra como provisionar instâncias de computação e armazenamento, instalar o Oracle Grid Infrastructure e o Oracle Database, inicializar um banco de dados standby e configurar o Oracle Data Guard com Fast-Start Failover.

Antes de começar

Antes de começar, certifique-se de que possui o seguinte:

  • Um projeto do Google Cloud com permissões para Compute Engine, rede VPC, configuração de firewall, IAM e NetApp Volumes

    Tarefa Acesso necessário

    Criar VMs do Compute Engine

    Administrador de instância de computação (ou equivalente)

    Firewall / Políticas de Firewall

    Administrador de rede ou administrador de políticas delegado

    Criar pools e volumes GCNV

    Administrador do NetApp Volumes

    Configurar PSA

    Administrador de rede em host project

    SSH via IAP

    Usuário do túnel protegido por IAP + login do sistema operacional (se utilizado)

  • A NetApp Volumes API habilitada

  • Uma VPC e uma sub-rede configuradas para a região de destino

  • Acesso a Serviços Privados (PSA) configurado para Google Cloud NetApp Volumes

  • Oracle Linux 10 para todas as máquinas virtuais necessárias

  • A resolução de DNS e de nomes de host está configurada para os hosts do banco de dados e para o host do Observer

  • Mídia de instalação e arquivos de patch do Oracle disponíveis para Oracle Database 26ai e Grid Infrastructure

  • Familiaridade com os conceitos de Oracle Data Guard, Oracle Restart e armazenamento iSCSI

  • A sincronização de tempo está configurada para todas as máquinas virtuais.

    Você pode usar os seguintes comandos:

    gcloud services enable netapp.googleapis.com
    chronyc tracking
    timedatectl

Exemplo de configuração usada neste guia

Este guia utiliza as seguintes premissas de implementação:

  • Três máquinas virtuais do Google Compute Engine:

    • oracdb1 para o banco de dados principal

    • oracdb2 para o banco de dados em espera

    • oradg-obs para o observador de failover de inicialização rápida

  • Um pool de storage GCNV Flex Unified por zona de banco de dados

  • Cinco volumes iSCSI GCNV por host de banco de dados

  • Oracle Data Guard Broker e Fast-Start Failover para failover automático

  • Armazenamento dedicado por host de banco de dados; hosts primários e de espera não compartilham volumes iSCSI

Substitua todos os valores de exemplo nos comandos por valores do seu ambiente, incluindo nomes de host, endereços IP, zonas, nomes de projeto, IPs do portal, senhas e nomes de arquivos de mídia do Oracle.

Objetivos

Neste procedimento, você conclui as seguintes tarefas:

  • Provisione instâncias do Compute Engine para o banco de dados primário, o banco de dados em espera e o Observer

  • Configurar storage iSCSI GCNV e dispositivos multipath para Oracle

  • Instale o Oracle Grid Infrastructure e o Oracle Database 26ai em ambos os hosts de banco de dados

  • Crie o banco de dados Oracle principal

  • Inicialize o banco de dados em espera usando replicação GCNV, snapshots ou clones

  • Configurar o Oracle Data Guard Broker, Fast-Start Failover e Observer

Opções de implantação

Esta seção compara padrões práticos de implantação de HA/DR para Oracle Database no Google Compute Engine (GCE) com Google Cloud NetApp Volumes (GCNV) armazenamento em bloco iSCSI. Também destaca como a replicação do GCNV acelera a inicialização do standby. Use esta matriz para escolher um nível antes de começar. Este guia implementa Prod HA (Data Guard + FSFO) — a última linha.

Ambiente Exigência Arquitetura recomendada HA DR Automação Principal benefício

Desenvolvimento/Teste

Menor custo

Instância única

Não

Sim

Não

Clone do Snapshot

Produção Básica (Reiniciar)

Reduzir o tempo de inatividade causado por falhas

+ Oracle Restart

Não

Sim

Somente local

Reinício automático

Prod HA (sem DG)

Manual DR aceitável

+ Snapshots / RMAN

Parcial

Sim

Parcial

Recuperação de clone GCNV

Prod HA (DG + FSFO)

Alta disponibilidade verdadeira (sem DBA)

Data Guard + FSFO

Sim

Sim

Completo

Alta disponibilidade verdadeira + failover rápido

HA / DR / Automação: Sim = atende à meta do tier; Não = não está no escopo; Parcial = apenas etapas manuais ou em camada de storage.

Visão geral

Essa arquitetura implementa alta disponibilidade do Oracle Database 26ai no Google Cloud usando o armazenamento iSCSI do Google Cloud NetApp Volumes (GCNV) e o Oracle Data Guard. O GCNV oferece armazenamento em blocos de alto desempenho e suporta inicialização em standby na camada de storage. O Data Guard fornece sincronização contínua, switchover e Fast-Start Failover.

Camada Papel

GCNV

Armazenamento em blocos, inicialização em espera, replicação de armazenamento

Data Guard

Sincronização contínua, aplicação de redo, switchover, FSFO

A replicação GCNV reduz significativamente o tempo de inicialização do standby em comparação com a duplicação ativa do RMAN, movendo os dados na camada de storage em vez de através dos canais do banco de dados Oracle. Prefira a replicação GCNV para o seeding do standby em produção quando seu ambiente suportar.

Componente Detalhe

Hosts de banco de dados

oracdb1/ oracdb2 — diferentes zonas, cinco volumes iSCSI GCNV cada

Storage

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

Inicialização em espera

GCNV replicar / snapshot / clonar → Oracle finalizar → Data Guard

HA

Reiniciar, standby físico (MOUNTED), Broker, FSFO, Observer (oradg-obs)

Aplicativos

Serviço orclapp

Zoneamento: Um pool GCNV Flex Unified por zona de banco de dados; volumes dedicados por host. Os discos de inicialização contêm apenas o sistema operacional. Fora do escopo: TDE, RAC, NVMe/TCP, OEM, Active Data Guard (o standby permanece MOUNTED).

Arquitetura

Diagrama de referência

A arquitetura fornece três caminhos de dados independentes. A replicação de storage e o transporte de redo do Data Guard são caminhos separados.

Oracle 26ai HA no GCNV - arquitetura de referência
Figura 1. Implantação do GCNV Oracle - arquitetura de referência

Replicação de armazenamento ≠ replicação de refazer. O caminho 1 move os arquivos de dados na camada GCNV para inicialização do standby. O caminho 2 mantém os bancos de dados sincronizados após a migração. O caminho 3 orquestra as transições de função e o failover automático por meio do Oracle Data Guard Broker e do Observer.

Funções da plataforma

Plataforma Entrega

GCNV

volumes iSCSI, snapshots, replicação de volumes (linha de base + incrementais) — inicialização em standby

Data Guard

Redo transport, MRP, Broker, FSFO — sincronização contínua e failover

A replicação GCNV executa uma cópia de linha de base e, em seguida, atualizações incrementais de bloco por política. O Data Guard é responsável pela aplicação de redo e pelo FSFO após a inicialização do standby.

Topologia e armazenamento

Papel VM Zona Pool GCNV Volumes (por host)

Primário

oracdb1

us-west1-a

oracle-pool-a

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

Espera

oracdb2

us-west1-b

oracle-pool-b

Mesmo padrão de nomenclatura

Observador

oradg-obs

us-west1-c

Somente disco de inicialização

Storage Apoio Usar

SO

Disco de inicialização GCE

Somente SO

/u01

GCNV iSCSI

Homes Grid/DB, staging (XFS)

+DATA / +RECO / +FRA

GCNV iSCSI

ASM EXTERNO — datafiles, arquivos, FRA

Tipos de máquinas

Exemplo n4-highmem-8 neste guia; cargas de trabalho OLTP normalmente usam c4-standard-*.

Provisionar Compute Engine

Etapa 1: criar as VMs

Crie três VMs em zonas diferentes da mesma região (isolamento de falhas zonal). Prefira uma região com menor emissão de carbono para TCO e sustentabilidade, desde que atenda às necessidades de latência e conformidade (por exemplo us-west1 vs us-central1). Use o Cloud Console, gcloud, Terraform ou seu fluxo de trabalho de provisionamento padrão.

VM Zona Tipo de máquina Disco de inicialização Rede Propósito

oracdb1

us-west1-a

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

OL 10, 50 GB Hyperdisk Balanceado (somente SO)

oracle-vpc / oracle-subnet, gVNIC

Banco de dados primário

oracdb2

us-west1-b

Igual ao primário

OL 10, 50 GB Hyperdisk Balanceado (somente SO)

Mesmo

Banco de dados em espera

oradg-obs

us-west1-c

e2-medium

OL 10, 20 GB Hyperdisk Balanced

Mesmo

Observador FSFO (somente Instant Client)

Observação

Nível de rede: Premium quando latência ou egress (acima de ~200 GiB/mês) são importantes; Standard para menor TCO em desenvolvimento/teste.

Habilite Secure Boot, vTPM e Integrity Monitoring em todos os três. O disco de inicialização contém apenas o sistema operacional. /u01 Os diretórios Grid/DB, staging e todos os dados ASM usam volumes iSCSI GCNV (consulte Provisionar volumes iSCSI GCNV) — não anexe um disco de dados GCE separado para /u01.

Etapa 2: firewall da VPC — adicione TCP/1521 à lista de permissões em todas as três zonas

Permita TCP/1521 entre os três IPs internos das VMs /32 em todas as zonas (us-west1-a/b/c aqui). Use regras de firewall da VPC ou políticas de firewall com a mesma lista de permissões. A ausência de regras interrompe o transporte de redo e a conectividade do Observer.

Console da Nuvem: Rede VPC → Firewall → Criar regra allow-oracle-net-dbhosts em oracle-vpc — Entrada, Permitir, origens = três /32 IPs, TCP 1521. Espelhar saída se necessário. Validar em 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
Porta Esperado Significado

22

Conectado

O caminho SSH funciona

1521

Conexão recusada

Firewall aberto; o ouvinte Grid inicia durante Etapa 1: Instale o Oracle Grid Infrastructure (Oracle Restart) em cada host do banco de dados

Qualquer

Tempo esgotado

Corrigir firewall ou roteamento

Execute a partir de todas as três máquinas virtuais em direção a cada endereço IP do par.

Etapa 3: Nome do host, DNS e /etc/hosts

Após cada inicialização da máquina virtual, defina o nome do host e adicione /etc/hosts entradas nos três hosts para que a resolução de nomes direta e inversa funcione para Oracle Net, o broker e o 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

Substitua os endereços IP internos do GCE (visíveis na lista Compute Engine → VM instances, coluna Internal IP).

Validar a partir de cada host:

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

Etapa 4: configuração básica do SO (somente para hosts de banco de dados)

Observação

Pré-requisito: HTTPS de saída para yum.oracle.com (NAT na nuvem ou espelhamento interno em sub-redes privadas).

Executar em oracdb1 e oracdb2 (a configuração do observador é abordada em Etapa 4: Instale o Oracle Instant Client no host do 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
Observação

Postura de segurança (OL 10): Os comandos abaixo configuram o SELinux como permissivo e desativam firewalld. Esta é apenas uma postura mínima de laboratório. Para configurações mais robustas de SELinux e firewall, consulte a política de segurança da sua organização.

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

Etapa 5: Capture o nome do iniciador iSCSI (IQN)

Após a reinicialização, capture o IQN de cada host do banco de dados. Você usará esses IQNs para criar os grupos de hosts GCNV em Etapa 2: criar os grupos de hosts.

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

Repita em oracdb2. Registre o IQN de cada host — um grupo de hosts por host para que a reinicialização ou regeneração do IQN de um único host não afete a visibilidade do volume iSCSI GCNV de outro host.

Observação

VMs clonadas: Se ambos os hosts compartilharem o mesmo IQN, regenere em oracdb2 (stop iscsi, clear /var/lib/iscsi/nodes/*, new InitiatorName in /etc/iscsi/initiatorname.iscsi, reiniciar iscsid).

Provisionar volumes iSCSI GCNV

Etapa 1: Crie um pool de storage GCNV Flex Unified iSCSI por zona de banco de dados

Um pool Flex Unified por zona de banco de dados (consulte Arquitetura).

Crie dois pools para este projeto de alta disponibilidade (repita os passos para cada zona):

Nome do pool Zona Usado por

oracle-pool-a

us-west1-a

oracdb1 (primário)

oracle-pool-b

us-west1-b

oracdb2 (espera)

NetApp Volumes → Storage pools → Criar para cada pool:

  • Nível de serviço: Flex (não Premium)

  • Tipo: Unificado

  • Zona: corresponde à zona da VM do banco de dados (us-west1-a/ us-west1-b)

  • Aviso: conectado a oracle-vpc

  • Capacidade: dimensionada para a carga de trabalho; utilize a taxa de transferência/IOPS provisionada personalizada quando refazer, backup ou restaurar exceder a capacidade padrão (até 5120 MiB/s ou 160K IOPS por pool, conforme os limites do produto)

Aguarde READY. Ajuste o tamanho dos pools de acordo com o tamanho do seu banco de dados (os tamanhos em Etapa 3: Crie os volumes iSCSI do GCNV são exemplos).

Observação

Modo padrão (este guia): Os pools Flex Unified usam o modo padrão (--mode=default). Crie pools e volumes iSCSI com o Cloud Console ou gcloud netapp. A replicação de volumes, snapshots e clones usa as APIs do Google Cloud (Etapa 3: inicialização do modo de espera do GCNV).

Etapa 2: Crie os grupos de hosts (um por host de banco de dados)

Crie um grupo de hosts por host de banco de dados para que cada VM veja apenas seus próprios volumes — os hosts primário e de espera não devem compartilhar volumes iSCSI GCNV. O Observer não possui recursos GCNV. No Console da Nuvem:

  1. NetApp Volumes → Grupos de hosts → Criar

  2. Nome: oracdb1-hg · Região: us-west1 · Tipo: iniciador iSCSI · Tipo de SO: Linux

  3. Anfitriões: cole o IQN de oracdb1(o valor de /etc/iscsi/initiatorname.iscsi)

  4. Descrição: “Host primário do Oracle oracdb1” · Criar

  5. Repita para oracdb2-hg com oracdb2 o IQN de

Etapa 3: Crie os volumes iSCSI do GCNV (por host de banco de dados)

Cada host de banco de dados recebe cinco volumes iSCSI GCNV no pool de sua zona — um para /u01 e quatro para dispositivos de suporte ASM:

Volume iSCSI GCNV Tamanho Usar Alias de multipath

ora_<host>_u01

100 GiB

/u01 Volume iSCSI GCNV — Grid/Oracle homes, staging

/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 (listrado)

/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

Nomes de volumes: apenas letras, números e sublinhados (sem hífens).

Observação

Layout mínimo (apenas para validação): Dois LUNs por host (*_data, *_reco) com arch_01p1+RECO e arch_01p2+FRA é aceitável para laboratório; produção usa cinco volumes por Etapa 3: Crie os volumes iSCSI do GCNV.

Em oracdb1: crie todos os cinco volumes em oracle-pool-a, grupo de hosts oracdb1-hg.

Em oracdb2: crie todos os cinco volumes em oracle-pool-b, grupo de hosts oracdb2-hg.

NetApp Volumes → Volumes → Criar — iSCSI, pool e grupo de hosts corretos, Linux. Registro por pool:

Etapa 4: configure o iSCSI e o multipath do Linux para volumes iSCSI do GCNV

Execute oracdb1 usando os portais do pool desse host e, em seguida, oracdb2 usando os portais do pool de espera.

Se a saída do host for restrita, permita TCP/3260 de cada VM de banco de dados para seus IPs de portal iSCSI GCNV (além do TCP/1521 entre VMs Etapa 2: firewall da VPC — adicione TCP/1521 à lista de permissões em todas as três zonas).

  1. Descubra os alvos, faça login e persista a inicialização do nó:

    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

Após reinicializar, verifique novamente antes de iniciar Oracle:

+

sudo iscsiadm --mode session
sudo multipath -ll
  1. Configurar 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. Adicione aliases WWID descobertos pelo host /etc/multipath.conf (não tente adivinhar — multipath.confnão expande variáveis de shell). Descobrir WWIDs:

    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

    Adicione aliases concretos para esse host a /etc/multipath.conf, depois sudo systemctl restart multipathd.

    Em oracdb1, anexe:

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

+ Em oracdb2, use o mesmo padrão com ora_oracdb2_* aliases, depois:

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

Etapa 5: Particione os dispositivos de suporte ASM nos volumes iSCSI do GCNV

Particione os quatro dispositivos de suporte do ASM (não u01) com uma partição GPT cada. O ASM consome a partição bruta. Execute em cada host. Todos os blocos subsequentes usam HOST=$(hostname -s) para selecionar automaticamente os dispositivos do 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

Etapa 6: Formate e monte /u01 no volume iSCSI local do GCNV

O ora_<host>_u01 volume iSCSI do GCNV contém o Grid home, o Oracle home e o staging. Formate XFS no dispositivo multipath (não particionado para ASM). Use UUID em /etc/fstab (não um rótulo de sistema de arquivos compartilhado):

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

Reinicie uma vez e confirme /u01 montagens antes de Instale o software Oracle.

Instale o software Oracle

Execute o Grid e, em seguida, a instalação do home do banco de dados em cada host do banco de dados antes de Crie o banco de dados principal.

Etapa 1: Instale o Oracle Grid Infrastructure (Oracle Restart) em cada host do banco de dados

Execute toda esta seção em oracdb1, depois repita em oracdb2. Ambos os hosts recebem seu próprio Grid home, instância ASM e grupos de discos — Data Guard replica pela Oracle Net, não pelo armazenamento.

Prepare os binários do Oracle em /u01

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

Descompacte o diretório inicial do Grid no local

O 26ai Grid GoldImage é instalado descompactando no local no diretório inicial do 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

Nível de RU do Grid. Este guia pressupõe que o Grid GoldImage já inclua sua RU validada. Se o Grid GoldImage for mais antigo que a RU de destino, aplique o patch no diretório home do Grid durante a configuração usando o fluxo documentado pela Oracle gridSetup.sh -applyRU ou use um Grid GoldImage com a RU incluída. Mantenha os diretórios home do Grid e do banco de dados no mesmo nível de patch pretendido.

Disparo único gridSetup — arquivo de resposta HA_CONFIG completo

Build /tmp/grid.rsp em cada host (responseFileVersion é obrigatório; substitua HOST e utilize senhas fortes):

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

Execute gridSetup para copiar os binários e preparar a configuração:

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
'

Espere Successfully Setup Software with warning(s). e código de saída 6 (avisos) ou 0.

Execute orainstRoot.sh e root.sh como root

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

root.sh cria os crsctl / srvctl / asmcmd wrappers e inicia o OHAS.

gridSetup.sh -executeConfigTools — abra o ASM e crie +DATA

Execute os assistentes de configuração (NETCA, ASMCA, CVU) no arquivo de resposta — isso cria a instância ASM e o +DATA grupo de discos:

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
'

Aguarde Successfully Configured Software. após NETCA / ASMCA / CVU.

Criar +RECO e +FRA grupos de discos

A instalação única cria apenas +DATA. Crie os outros dois via asmca:

HOST=$(hostname -s)

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

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

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

Verifique o ASM e o 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.

Repita esta seção em oracdb2. O HOST=$(hostname -s) padrão em e seleciona automaticamente os dispositivos iSCSI GCNV desse host. Use os mesmos nomes de grupo de discos ASM — o Data Guard replica pela Oracle Net, não pelo armazenamento.

Etapa 2: Instale o Oracle Database 26ai em cada host do banco de dados

Execute esta seção em oracdb1, depois em oracdb2. O banco de dados standby é criado em Crie o banco de dados de espera.

Descompacte a pasta DB home e o patch RU

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

Consulte a documentação da Oracle para obter informações sobre o layout do diretório RU e o caminho -applyRU.

Instalação silenciosa somente por software com a 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
'

Em OL 8/9, omita -applyOneOffs da runInstaller linha.

Como root, execute o script de pós-instalação:

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

Configure o ambiente Oracle

Em cada host de banco de dados (orcl em oracdb1, orcls em 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

(Utilize ORACLE_SID=orcls no host de espera. O banco de dados de espera é criado em Crie o banco de dados de espera.)

Crie o banco de dados principal (oracdb1 apenas)

Execute dbca em modo silencioso nos 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
'

Aponte os logs de arquivamento para +RECO (o servidor em espera usa configurações correspondentes em Etapa 2: modo de espera: arquivo pfile init.ora mínimo, arquivo de senha, 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
'

Verifique se o banco de dados está em execução no 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

Crie um serviço de aplicação baseado em funções (Oracle Restart). As aplicações devem conectar-se via orclapp, não pelo nome do banco de dados, para que a recuperação em caso de falha seja 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
'

Após a ativação do Broker, orclapp executa somente no PRIMÁRIO. Multiplexe os arquivos de controle em grupos de discos ASM; dimensione a memória de acordo com a carga de trabalho (este guia usa 4 GB / 3 GB SGA como exemplos).

Crie o banco de dados de espera

Construa orcls em oracdb2 (volumes dedicados em oracle-pool-b). Conclua a configuração inicial primária e de standby, depois Etapa 3: inicialização do modo de espera do GCNV, as tarefas de conclusão de standby e Configurar o Data Guard Broker, FSFO e Observer. Destino: primário LEITURA GRAVAÇÃO; standby FÍSICO, MONTADO, MRP aplicando.

Etapa 1: Primário: senha do SYS, arquivo de senhas e parâmetros do DG

Em oracdb1 como oracle:

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

Sobre 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

Reinicie através do Oracle Restart em 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 deve listar <SID> e <SID>_DGMGRL.

Etapa 2: modo de espera: arquivo pfile init.ora mínimo, arquivo de senha, NOMOUNT

Copie o arquivo de senha principal para o dispositivo de 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

Em oracdb2, defina a propriedade e crie o pfile de standby. No primário, copie *.compatible primeiro:

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

Em oracdb2, substitua esse valor por <COPY_FROM_PRIMARY> no bloco abaixo:

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 sem arquivos de dados até Etapa 3: inicialização do modo de espera do GCNV.

Etapa 3: inicialização do modo de espera do GCNV

Popule os volumes ASM em espera em oracle-pool-b*usando Google Cloud NetApp Volumes replication (SnapMirror-baseado, Default-mode), snapshots de volume ou clone, depois execute Oracle finaliza. iSCSI e ASM são os mesmos que Provisionar volumes iSCSI GCNV.

API Usar

gcloud netapp storage-pools

Criar modo padrão pools Flex Unified (--mode=default)

gcloud netapp volumes

volumes iSCSI, grupos de hosts, snapshots

gcloud netapp volumes replications

Replicação de volume entre locais

Etapa Ação

1

Archivelog primário + force logging (Etapa 1: Primário: senha do SYS, arquivo de senhas e parâmetros do DG)

2

Quiescer: BEGIN BACKUP, registrar SCN, standby controlfile

3

Replicação de volume (Criar replicações de volume e Cutover — quiesce, interrompe a replicação, anexa LUNs em espera) ou instantâneo (Alternativa — snapshot seed)

4

Em oracdb2: iSCSI, multipath, montagem ASM (Etapa 4: configure o iSCSI e o multipath do Linux para volumes iSCSI do GCNV, Etapa 5: Particione os dispositivos de suporte ASM nos volumes iSCSI do GCNV, e )

5

Oracle finalize — recuperar para SCN, MOUNTED (Oracle finaliza)

6

Reconstrução SRL (Etapa 4: arquivos de redo log em espera), MRP, corretor (Configurar o Data Guard Broker, FSFO e Observer)

O duplicado ativo do RMAN continua válido para laboratórios de pequeno porte. A replicação do GCNV é preferencial para o seeding de standby em produção.

Pré-requisitos

  • gcloud netapp com suporte para replicação de volume.

  • Duas pools em Default-mode em locais diferentes (oracle-pool-a, oracle-pool-b).

  • Volumes de origem no pool primário anexados a oracdb1-hg; volumes de destino criados por replicação.

  • Execute a replicação a partir do Cloud Shell ou da estação de trabalho — não a partir de 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"

Crie o pool de standby, se necessário:

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>

Criar replicações de volume

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

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

Aguarde até mirrorState estar ESPELHADO / a sincronização inicial estar concluída.

Cutover — quiesce, interrompe a replicação, anexa LUNs em espera

Principal:

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

Permita o ciclo de replicação final e, em seguida:

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

Anexe os volumes de destino a oracdb2-hg(o LUN replicado pode manter o nome de origem — use name=oracdb1_data_lun na atualização):

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"

Copie o arquivo de controle para oracdb2, depois no primário:

ALTER DATABASE END BACKUP;

Alternativa — snapshot seed

Semente única: snapshot no volume de origem → criar volume a partir do snapshot no pool de espera (Cloud Console ou API). Prosseguir para Oracle finaliza após anexar ao oracdb2-hg.

ISCSI e ASM em espera (antes do RMAN)

Em oracdb2, faça login nos portais iSCSI do standby pool. Se os cabeçalhos de disco ASM corresponderem à nomenclatura primária, use primary-style multipath aliases (lab: ora_oracdb1_data_01, ora_oracdb1_arch_01), defina asm_diskstring='/dev/mapper/ora_oracdb1_*p*', chown grid:asmadmin nas partições e, em seguida:

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;

Após a conversão, recrie os logs de redo em espera (o arquivo de controle replicado ainda contém +DATA/ORCL/…`caminhos SRL — causa `ORA-19527/ `ORA-16086`no primário). Veja Etapa 4: arquivos de redo log em espera.

Etapa 4: arquivos de redo log em espera

Necessário em ambos os hosts para FSFO. Tamanho ≥ maior redo log online primário; contagem = (grupos online por thread) + 1.

Após a inicialização do GCNV: Remova todos os grupos de arquivos de log de espera no standby e recrie no +DATA apenas (db_create_file_dest='+DATA'. Caminhos replicados sob +DATA/ORCL/… causam ORA-19527 / ORA-16086 até serem reconstruídos.

Primário (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

Em espera (orcls) após a inicialização do 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;

Etapa 5: habilite o flashback no standby e inicie a recuperação gerenciada

Ative o flashback antes de iniciar a recuperação gerenciada (o flashback não pode ser ativado enquanto o MRP estiver ativo).

# 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 a aplicação em tempo real (redo log aplicado assim que chega aos SRLs).

Etapa 6: habilite o envio de redo no primário

Observação

LOG_ARCHIVE_DEST_2 foi configurado deliberadamente para DEFER em Etapa 2: modo de espera: arquivo pfile init.ora mínimo, arquivo de senha, NOMOUNT suprimir erros contínuos de ORA-12154 durante a criação do standby. Ative-o agora que o standby está pronto.

Alterne LOG_ARCHIVE_DEST_STATE_2 para ENABLE e force uma troca de log para que a primeira rodada de redo ships seja iniciada imediatamente:

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.

Se dest_2 mostrar ORA-12154, reinicie o primário. Após Passo 1: Habilite o broker em ambos os bancos de dados, gerencie o transporte via DGMGRL.

Etapa 7: verificar o estado do Data Guard de destino

Na primária (oracdb1):

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

Em modo de espera (oracdb2 — Console na nuvem SSH, ou IAP a partir da sua estação de trabalho):

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

Esperado em standby: PHYSICAL STANDBY | MOUNTED; MRP0 com APPLYING_LOG.

Se o standby reportar MOUNTED, mas o apply não estiver em execução, reinicie o MRP em 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'

Etapa 8: registre o banco de dados standby com o Oracle Restart

Registre o sistema em espera com Reiniciar após o seeding do GCNV para que as reinicializações recuperem ASM, MOUNT e apply.

Em oracdb2, capture a localização do spfile e registre-se no Oracle Restart (substitua <STANDBY_SPFILE_PATH> da consulta, geralmente em +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
'

Em oracdb1, verifique se o recurso de reinicialização do banco de dados Oracle primário lista as dependências do grupo de discos ASM. Adicione RECO se o DBCA estiver registrado apenas DATA e 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
'

Adicione o mesmo serviço de aplicação no recurso de banco de dados em espera (orcls em oracdb2). Use role PRIMARY em ambos os lados para que orclapp esteja disponível após switchover:

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
'

Em oracdb2, confirme o recurso de banco de dados em 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
'

Configurar o Data Guard Broker, FSFO e Observer

Após ENABLE CONFIGURATION, gerencie o transporte e as funções por meio do DGMGRL (não SQL ad-hoc LOG_ARCHIVE_DEST_*).

Passo 1: Habilite o broker em ambos os bancos de dados

Nos hosts de banco de dados primário e standby:

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

No host do banco de dados principal, conecte-se com autenticação do SO (a carteira Observer de Passo 5: Inicie o Observer como uma unidade systemd não é necessária nos hosts do banco de dados):

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 /
'
Observação

Somente no host do Observer, use dgmgrl /@orcl após a carteira de login automático existir. Não insira senhas na dgmgrl linha de comando.

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.

Execute VALIDATE DATABASE`imediatamente — isso detecta arquivos de dados órfãos, SRLs ausentes, redo apply não em execução e outras armadilhas comuns antes de você tentar um switchover. Qualquer `WARNING`ou não-NULL `ERROR deve ser corrigido antes de Etapa 3: configure as propriedades do FSFO e habilite.

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

Etapa 2: confirme o flashback (necessário para a reativação automática do FSFO)

Confirme flashback_on em ambos os hosts antes de ativar o FSFO:

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

Somente na primária, caso retenção ainda não esteja definida:

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'

Etapa 3: configure as propriedades do FSFO e habilite

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

Etapa 4: Instale o Oracle Instant Client no host do 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

Passo 5: Inicie o Observer como uma unidade systemd

As credenciais ficam armazenadas em uma carteira com login automático — nunca em uma dgmgrl linha de comando (visível para ps/ journalctl). Conecte-se com /@<tns_alias> somente no Observer.

Observação
  • Use uma conta dedicada: Armazene as credenciais de uma conta administrativa dedicada do Data Guard (por exemplo, SYSDG) na carteira em vez de SYS.

  • Carteira de login automático necessária: O serviço systemd do Observer requer uma carteira de login automático cwallet.sso). Se cwallet.sso estiver faltando após executar mkstore, use orapki do pacote tools do Instant Client ou de um diretório home do banco de dados para criar a carteira de login automático e, em seguida, adicione novamente as credenciais armazenadas.

  1. Crie a carteira no Observer com as credenciais de ambos os membros:

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. Unidade Systemd + rotação de logs:

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

Verificar a partir do primário — O observador deve ler CONNECTED (um DISCONNECTED observador suspende silenciosamente o FSFO):

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

Etapa 6: Teste FSFO (switchover e failover)

Switchover planejado:

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

Failover não planejado: Use um Reset da VM (teste de falha simulada) em uma janela de teste; uma Parada normal pode não acionar o FSFO. Tail /var/log/dgmgrl-observer.log on oradg-obs; restaure a topologia ao concluir.