Implante a alta disponibilidade do Oracle Database 26ai com o Google Cloud NetApp Volumes
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:
-
oracdb1para o banco de dados principal -
oracdb2para o banco de dados em espera -
oradg-obspara 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.
Seções para leitura de acordo com seu nível
Dependendo do nível de alta disponibilidade (HA) que você deseja alcançar, leia as seções na matriz abaixo. Por exemplo, se você deseja Prod HA com Data Guard e FSFO, leia todas as seções. Se você deseja Dev/Test ou Prod Basic com Restart, leia apenas a primeira coluna.
| Desenvolvimento/Teste ou Prod Básico (Reiniciar) | Prod HA (sem Data Guard) | Prod HA (Data Guard + FSFO) |
|---|---|---|
Crie o banco de dados de espera (por meio de Etapa 3: inicialização do modo de espera do GCNV apenas) |
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 |
|
Storage |
|
Inicialização em espera |
GCNV replicar / snapshot / clonar → Oracle finalizar → Data Guard |
HA |
Reiniciar, standby físico (MOUNTED), Broker, FSFO, Observer ( |
Aplicativos |
Serviço |
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.
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 |
|
|
|
|
Espera |
|
|
|
Mesmo padrão de nomenclatura |
Observador |
|
|
— |
Somente disco de inicialização |
| Storage | Apoio | Usar |
|---|---|---|
SO |
Disco de inicialização GCE |
Somente SO |
|
GCNV iSCSI |
Homes Grid/DB, staging (XFS) |
|
GCNV iSCSI |
ASM EXTERNO — datafiles, arquivos, FRA |
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 |
|---|---|---|---|---|---|
|
|
|
OL 10, 50 GB Hyperdisk Balanceado (somente SO) |
|
Banco de dados primário |
|
|
Igual ao primário |
OL 10, 50 GB Hyperdisk Balanceado (somente SO) |
Mesmo |
Banco de dados em espera |
|
|
|
OL 10, 20 GB Hyperdisk Balanced |
Mesmo |
Observador FSFO (somente Instant Client) |
|
|
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 |
|---|---|---|
|
Conectado |
O caminho SSH funciona |
|
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)
|
|
Pré-requisito: HTTPS de saída para |
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
|
|
Postura de segurança (OL 10): Os comandos abaixo configuram o SELinux como permissivo e desativam |
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.
|
|
VMs clonadas: Se ambos os hosts compartilharem o mesmo IQN, regenere em |
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 |
|---|---|---|
|
|
|
|
|
|
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).
|
|
Modo padrão (este guia): Os pools Flex Unified usam o modo padrão ( |
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:
-
NetApp Volumes → Grupos de hosts → Criar
-
Nome:
oracdb1-hg· Região:us-west1· Tipo: iniciador iSCSI · Tipo de SO: Linux -
Anfitriões: cole o IQN de
oracdb1(o valor de/etc/iscsi/initiatorname.iscsi) -
Descrição: “Host primário do Oracle oracdb1” · Criar
-
Repita para
oracdb2-hgcomoracdb2o 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 |
|---|---|---|---|
|
100 GiB |
|
|
|
50 GiB |
ASM |
|
|
50 GiB |
ASM |
|
|
100 GiB |
ASM |
|
|
100 GiB |
ASM |
|
Nomes de volumes: apenas letras, números e sublinhados (sem hífens).
|
|
Layout mínimo (apenas para validação): Dois LUNs por host ( |
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:
-
IPs do portal iSCSI →
<ISCSI_PORTAL_1>,<ISCSI_PORTAL_2>(portais do pool primário emoracdb1; portais do pool de espera emoracdb2— eles podem ser diferentes) -
Número de série do volume do Console da Nuvem — use com o WWID descoberto pelo host em Etapa 4: configure o iSCSI e o multipath do Linux para volumes iSCSI do GCNV
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).
-
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
-
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
-
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 doneAdicione aliases concretos para esse host a
/etc/multipath.conf, depoissudo 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 |
|---|---|
|
Criar modo padrão pools Flex Unified ( |
|
volumes iSCSI, grupos de hosts, snapshots |
|
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: |
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 |
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 netappcom 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
|
|
|
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 /
'
|
|
Somente no host do Observer, use |
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.
|
|
|
-
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
-
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.