Implementar o Oracle Data Guard em uma máquina virtual do Azure baseada em Linux

Aplica-se a: ✔️ VMs do Linux

É possível usar a CLI do Azure para criar e gerenciar recursos do Azure da linha de comando ou em scripts. Este artigo descreve como usar a CLI do Azure para implantar um banco de dados Oracle Database 19c Versão 3 da imagem do Azure Marketplace. Este artigo mostra a você passo a passo como instalar e configurar o Data Guard em uma VM (máquina virtual) do Azure. Para proteger o ambiente, nenhuma porta será publicamente acessível e uma instância do Azure Bastion fornecerá acesso às VMs Oracle.

Antes de começar, verifique se a CLI do Azure está instalada. Para obter mais informações, consulte o Guia de instalação da CLI do Azure.

Preparar o ambiente

Suposições

Para instalar o Oracle Data Guard, você precisa criar duas VMs do Azure no mesmo conjunto de disponibilidade:

  • A VM primária (OracleVM1) tem uma instância do Oracle em execução.
  • A VM em espera (OracleVM2) tem o software Oracle apenas instalado.

A imagem do Azure Marketplace que você usa para criar as VMs é Oracle:oracle-database-19-3:oracle-database-19-0904:latest.

Observação

Lembre-se das versões que atingiram o fim da vida útil (EOL) e não têm mais suporte da Red Hat. As imagens carregadas que sejam iguais ou superiores ao EOL serão suportadas com base em um esforço comercial razoável. Para obter mais informações, confira a página da Web do Red Hat para ciclos de vida do produto.

Entrar no Azure

Entre na sua assinatura do Azure usando o comando az login e siga as instruções na tela.

az login

Definir variáveis de ambiente

Ajuste a variável LOCATION para seu ambiente:

LOCATION=eastus
RESOURCE_GROUP="Oracle-Lab"
VM_USERNAME="azureuser"
VM_PASSWORD="OracleLab123"
VNET_NAME="${RESOURCE_GROUP}VNet"

Habilitar a extensão do Azure Bastion

Inclua a extensão do Azure Bastion na CLI do Azure:

az extension add \
  --name bastion

Criar um grupo de recursos

Crie um grupo de recursos usando o comando az group create. Um grupo de recursos do Azure é um contêiner lógico no qual os recursos do Azure são implantados e gerenciados.

az group create \
  --name $RESOURCE_GROUP \
  --location $LOCATION

Criar uma rede virtual com duas sub-redes

Crie uma rede virtual em que conectaremos todos os serviços de computação. Uma sub-rede hospedará o Azure Bastion, um serviço do Azure que protege seus bancos de dados contra acesso público. A segunda sub-rede hospedará as duas VMs do banco de dados Oracle.

Além disso, crie um grupo de segurança de rede ao qual todos os serviços farão referência para determinar quais portas estão expostas publicamente. Somente a porta 443 será exposta. O serviço do Azure Bastion abrirá essa porta automaticamente quando você criar a instância de serviço.

az network vnet create \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION \
  --name $VNET_NAME \
  --address-prefix "10.0.0.0/16"
az network vnet subnet create \
  --resource-group $RESOURCE_GROUP \
  --name AzureBastionSubnet \
  --vnet-name $VNET_NAME \
  --address-prefixes 10.0.0.0/24
az network vnet subnet create \
  --resource-group $RESOURCE_GROUP \
  --name OracleSubnet \
  --vnet-name $VNET_NAME \
  --address-prefixes 10.0.1.0/24
az network nsg create \
  --name OracleVM-NSG \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION

Criar um conjunto de disponibilidade

A criação de um conjunto de disponibilidade é opcional, mas é recomendável. Para obter mais informações, confira as diretrizes de conjuntos de disponibilidade do Azure.

az vm availability-set create \
  --resource-group $RESOURCE_GROUP \
  --name OracleVMAvailabilitySet \
  --platform-fault-domain-count 2 \
  --platform-update-domain-count 2

Criar duas máquinas virtuais

Crie duas VMs usando o comando az vm create. O exemplo a seguir cria as VMs chamadas OracleVM1 e OracleVM2.

Crie OracleVM1 (primário):

az vm create \
  --resource-group $RESOURCE_GROUP \
  --name OracleVM1 \
  --availability-set OracleVMAvailabilitySet \
  --image Oracle:oracle-database-19-3:oracle-database-19-0904:latest \
  --size Standard_DS1_v2 \
  --authentication-type password \
  --admin-username $VM_USERNAME \
  --admin-password $VM_PASSWORD \
  --vnet-name $VNET_NAME \
  --subnet OracleSubnet \
  --nsg OracleVM-NSG \
  --os-disk-size-gb 32

Crie OracleVM2 (em espera):

az vm create \
  --resource-group $RESOURCE_GROUP \
  --name OracleVM2 \
  --availability-set OracleVMAvailabilitySet \
  --image Oracle:oracle-database-19-3:oracle-database-19-0904:latest \
  --size Standard_DS1_v2 \
  --authentication-type password \
  --admin-username $VM_USERNAME \
  --admin-password $VM_PASSWORD \
  --vnet-name $VNET_NAME \
  --subnet OracleSubnet \
  --nsg OracleVM-NSG \
  --os-disk-size-gb 32

Criar a instância de serviço do Azure Bastion

O Azure Bastion fornece um túnel seguro para todos os serviços hospedados na rede virtual. Ele serve como um jump box para eliminar o acesso direto aos bancos de dados Oracle.

Crie um endereço IP público para acessar o serviço do Azure Bastion:

az network public-ip create \
  --resource-group $RESOURCE_GROUP \
  --name OracleLabBastionPublicIP \
  --sku Standard

Crie a instância de serviço do Azure Bastion:

az network bastion create \
  --location $LOCATION \
  --name OracleLabBastion \
  --public-ip-address OracleLabBastionPublicIP \
  --resource-group $RESOURCE_GROUP \
  --vnet-name $VNET_NAME \
  --sku basic

Conectar-se à máquina virtual

Agora, você acessará OracleVM1 usando o serviço do Azure Bastion no portal do Azure.

Na caixa de pesquisa na parte superior da janela, insira OracleVM1. Na lista de resultados, selecione OracleVM1 para abrir essa VM.

Diagrama mostrando a caixa de pesquisa e os resultados da primeira VM do Oracle.

Na parte superior do painel, selecione Conectar>Bastion.

Diagrama mostrando as seleções de conexão via Azure Bastion.

Insira o nome de usuário e senha e, em seguida, selecione o botão Conectar.

Diagrama mostrando como inserir credenciais para se conectar via Azure Bastion.

Uma nova guia é aberta com uma conexão segura à máquina virtual, onde o software Oracle já está instalado a partir de uma imagem do Azure Marketplace.

Diagrama mostrando uma conexão via Azure Bastion em um navegador.

Configurar OracleVM1 (primário)

Desabilite o firewall:

sudo systemctl stop firewalld
sudo systemctl disable firewalld

Defina a senha de usuário oracle:

sudo passwd oracle

Insira a senha azureuser: OracleLab123.

Altere a senha de usuário oracle para OracleLab123. (Insira-a novamente para verificar.)

Criar o banco de dados no OracleVM1 (primário)

O software Oracle já está instalado na imagem do Azure Marketplace, portanto, a próxima etapa é instalar o banco de dados.

Mude para o superusuário Oracle:

sudo su - oracle

Crie o banco de dados:

dbca -silent \
   -createDatabase \
   -datafileDestination /u01/app/oracle/cdb1 \
   -templateName General_Purpose.dbc \
   -gdbname cdb1 \
   -sid cdb1 \
   -responseFile NO_VALUE \
   -characterSet AL32UTF8 \
   -sysPassword OracleLab123 \
   -systemPassword OracleLab123 \
   -createAsContainerDatabase true \
   -numberOfPDBs 1 \
   -pdbName pdb1 \
   -pdbAdminPassword OracleLab123 \
   -databaseType MULTIPURPOSE \
   -automaticMemoryManagement false \
   -storageType FS

A saída deve ser semelhante à seguinte resposta:

Copying database files
1% complete
2% complete
8% complete
13% complete
19% complete
27% complete
Creating and starting Oracle instance
29% complete
32% complete
33% complete
34% complete
38% complete
42% complete
43% complete
45% complete
Completing Database Creation
48% complete
51% complete
53% complete
62% complete
70% complete
72% complete
Creating Pluggable Databases
78% complete
100% complete
Look at the log file "/u01/app/oracle/cfgtoollogs/dbca/cdb1/cdb1.log" for further details.

Defina as variáveis ORACLE_SID e ORACLE_HOME:

$ ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1; export ORACLE_HOME
$ ORACLE_SID=cdb1; export ORACLE_SID

Opcionalmente, você pode adicionar ORACLE_HOME e ORACLE_SID ao arquivo /home/oracle/.bashrc, de maneira que essas configurações sejam salvas para logons futuros:

# add oracle home
export ORACLE_HOME= /u01/app/oracle/product/19.0.0/dbhome_1
# add oracle sid
export ORACLE_SID=cdb1

Configurar o Data Guard

Habilitar o modo de log de arquivo morto em myVM1 (primário)

Habilite o modo de log:

sqlplus / as sysdba
SQL> SELECT log_mode FROM v$database;
LOG_MODE
------------
NOARCHIVELOG
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
SQL> ALTER DATABASE ARCHIVELOG;
SQL> ALTER DATABASE OPEN;

Habilite o registro em log forçado e verifique se há pelo menos um arquivo de log:

SQL> ALTER DATABASE FORCE LOGGING;
SQL> ALTER SYSTEM SWITCH LOGFILE;

Crie logs de restauração em espera definindo o mesmo tamanho e quantidade dos logs de restauração do banco de dados primário:

SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/cdb1/standby_redo01.log') SIZE 200M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/cdb1/standby_redo02.log') SIZE 200M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/cdb1/standby_redo03.log') SIZE 200M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/cdb1/standby_redo04.log') SIZE 200M;

Ative o Flashback (que facilita muito a recuperação) e defina STANDBY_FILE_MANAGEMENT como AUTO. Saia do SQL*Plus depois disso.

SQL> ALTER SYSTEM SET db_recovery_file_dest_size=50G scope=both sid='*';
SQL> ALTER SYSTEM SET db_recovery_file_dest='/u01/app/oracle/cdb1' scope=both sid='*';
SQL> ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO SCOPE=BOTH;
SQL> ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO;
SQL> EXIT;

Configurar o serviço no OracleVM1 (primário)

Edite ou crie o arquivo tnsnames.ora, que está na pasta $ORACLE_HOME/network/admin.

Adicione as seguintes entradas:

cdb1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = OracleVM1)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = cdb1)
    )
  )
cdb1_stby =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = OracleVM2)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = cdb1)
    )
  )

Edite ou crie o arquivo listener.ora, que está na pasta $ORACLE_HOME/network/admin.

Adicione as seguintes entradas:

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = OracleVM1)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = cdb1_DGMGRL)
      (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
      (SID_NAME = cdb1)
    )
  )
ADR_BASE_LISTENER = /u01/app/oracle

Habilite o Data Guard Broker:

sqlplus / as sysdba
SQL> ALTER SYSTEM SET dg_broker_start=true;
SQL> CREATE pfile FROM spfile;
SQL> EXIT;

Copie o arquivo de parâmetro para o servidor em espera:

scp -p $ORACLE_HOME/dbs/initcdb1.ora oracle@OracleVM2:$ORACLE_HOME/dbs/

Inicie o ouvinte:

 lsnrctl stop
 lsnrctl start

Configurar o serviço no OracleVM2 (em espera)

Retorne ao portal do Azure. Pesquise OracleVM2 e selecione o recurso na lista de resultados.

Captura de tela da caixa de pesquisa e dos resultados da segunda VM Oracle.

Na parte superior do painel, selecione Conectar>Bastion.

Diagrama mostrando as seleções de conexão via Azure Bastion.

Insira o nome de usuário e senha e, em seguida, selecione o botão Conectar.

Captura de tela da inserção de credenciais de nome de usuário e senha para conexão via Azure Bastion.

Desabilitar o Firewall no OracleVM2 (em espera)

sudo systemctl stop firewalld
sudo systemctl disable firewalld

Configurar o ambiente para OracleVM1

Defina a senha de usuário oracle:

sudo passwd oracle

Insira a senha azureuser: OracleLab123.

Altere a senha de usuário oracle para OracleLab123. (Insira-a novamente para verificar.)

Alterne para o superusuário oracle:

$ sudo su – oracle

Defina as variáveis ORACLE_SID e ORACLE_HOME:

ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1; export ORACLE_HOME
ORACLE_SID=cdb1; export ORACLE_SID

Opcionalmente, você pode adicionar ORACLE_HOME e ORACLE_SID ao arquivo /home/oracle/.bashrc, de maneira que essas configurações sejam salvas para logons futuros:

# add oracle home
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
# add oracle sid
export ORACLE_SID=cdb1

Edite ou crie o arquivo tnsnames.ora, que está na pasta $ORACLE_HOME/network/admin.

Adicione as seguintes entradas:

cdb1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = OracleVM1)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = cdb1)
    )
  )
cdb1_stby =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = OracleVM2)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = cdb1)
    )
  )

Edite ou crie o arquivo listener.ora, que está na pasta $ORACLE_HOME/network/admin.

Adicione as seguintes entradas:

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = OracleVM2)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = cdb1_DGMGRL)
      (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
      (SID_NAME = cdb1)
    )
  )
ADR_BASE_LISTENER = /u01/app/oracle

Inicie o ouvinte:

 lsnrctl stop
 lsnrctl start

Restaure banco de dados para OracleVM2 (em espera)

Crie o arquivo de parâmetro /tmp/initcdb1_stby.ora com o seguinte conteúdo:

*.db_name='cdb1'

Crie as pastas:

$ mkdir -p /u01/app/oracle/cdb1
$ mkdir -p /u01/app/oracle/oradata/cdb1/pdbseed
$ mkdir -p /u01/app/oracle/oradata/cdb1/pdb1
$ mkdir -p /u01/app/oracle/fast_recovery_area/cdb1
$ mkdir -p /u01/app/oracle/admin/cdb1/adump

Crie um arquivo de senha:

$ orapwd file=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/orapwcdb1 password=OracleLab123 entries=10 force=y

Inicie o banco de dados em OracleVM2:

 export ORACLE_SID=cdb1
 sqlplus / as sysdba
SQL> CREATE spfile from pfile;
SQL> STARTUP NOMOUNT PFILE='/tmp/initcdb1_stby.ora';
SQL> EXIT;

Restaure o banco de dados usando a ferramenta Oracle Recovery Manager (RMAN):

$ rman TARGET sys/OracleLab123@cdb1 AUXILIARY sys/OracleLab123@cdb1_stby

Executar os seguintes comandos na RMAN:

DUPLICATE TARGET DATABASE
  FOR STANDBY
  FROM ACTIVE DATABASE
  DORECOVER
  SPFILE
    SET db_unique_name='CDB1_STBY' COMMENT 'Is standby'
  NOFILENAMECHECK;

Mensagens semelhantes às seguintes aparecem quando os comandos são concluídos:

media recovery complete, elapsed time: 00:00:00
Finished recover at 29-JUN-22
Finished Duplicate Db at 29-JUN-22

Saia da RMAN:

RMAN> EXIT;

Habilite o Data Guard Broker:

sqlplus / as sysdba
SQL> ALTER SYSTEM SET dg_broker_start=true;
SQL> EXIT;

Configurar o Data Guard Broker no OracleVM1 (primário)

Inicie o Data Guard Manager e faça logon usando SYS e uma senha. (Não use a autenticação do sistema operacional.)

$ dgmgrl sys/OracleLab123@cdb1
DGMGRL for Linux: Version 19.0.0.0 - 64bit Production
Copyright (c) 2000, 2013, Oracle. All rights reserved.
Welcome to DGMGRL, type "help" for information.
Connected as SYSDBA.
DGMGRL> CREATE CONFIGURATION my_dg_config AS PRIMARY DATABASE IS cdb1 CONNECT IDENTIFIER IS cdb1;
Configuration "my_dg_config" created with primary database "cdb1"
DGMGRL> ADD DATABASE cdb1_stby AS CONNECT IDENTIFIER IS cdb1_stby MAINTAINED AS PHYSICAL;
Database "cdb1_stby" added
DGMGRL> ENABLE CONFIGURATION;
Enabled.

Examine a configuração:

DGMGRL> SHOW CONFIGURATION;
Configuration - my_dg_config
  Protection Mode: MaxPerformance
  Members:
  cdb1      - Primary database
  cdb1_stby - Physical standby database
Fast-Start Failover: DISABLED
Configuration Status:
SUCCESS   (status updated 26 seconds ago)

Você concluiu a configuração do Oracle Data Guard. A próxima seção mostra como testar a conectividade e fazer transições.

Conectar o banco de dados do computador cliente

Atualizar o arquivo tnsnames.ora no computador cliente. Esse arquivo geralmente está em $ORACLE_HOME/network/admin.

cdb1=
  (DESCRIPTION=
    (ADDRESS=
      (PROTOCOL=TCP)
      (HOST=OracleVM1)
      (PORT=1521)
    )
    (CONNECT_DATA=
      (SERVER=dedicated)
      (SERVICE_NAME=cdb1)
    )
  )
cdb1_stby=
  (DESCRIPTION=
    (ADDRESS=
      (PROTOCOL=TCP)
      (HOST=OracleVM2)
      (PORT=1521)
    )
    (CONNECT_DATA=
      (SERVER=dedicated)
      (SERVICE_NAME=cdb1_stby)
    )
  )

Inicie o SQL*Plus:

$ sqlplus sys/OraPasswd1@cdb1
SQL*Plus: Release 19.0.0.0 Production on Wed May 10 14:18:31 2022
Copyright (c) 1982, 2016, Oracle.  All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 19.0.0.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
SQL>

Testar as configurações do Data Guard

Realizar a transição do banco de dados no OracleVM1 (primário)

Alterne de primário para em espera (cdb1 para cdb1_stby):

$ dgmgrl sys/OracleLab123@cdb1
DGMGRL for Linux: Version 19.0.0.0 - 64bit Production
Copyright (c) 2000, 2013, Oracle. All rights reserved.
Welcome to DGMGRL, type "help" for information.
Connected as SYSDBA.
DGMGRL> SWITCHOVER TO cdb1_stby;
Performing switchover NOW, please wait...
Operation requires a connection to instance "cdb1" on database "cdb1_stby"
Connecting to instance "cdb1"...
Connected as SYSDBA.
New primary database "cdb1_stby" is opening...
Operation requires start up of instance "cdb1" on database "cdb1"
Starting instance "cdb1"...
ORACLE instance started.
Database mounted.
Switchover succeeded, new primary is "cdb1_stby"
DGMGRL>

Agora você pode se conectar ao banco de dados em espera. Inicie o SQL*Plus:

$ sqlplus sys/OracleLab123@cdb1_stby
SQL*Plus: Release 19.0.0.0 Production on Wed May 10 14:18:31 2022
Copyright (c) 1982, 2016, Oracle.  All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
SQL>

Realizar a transição do banco de dados no OracleVM2 (em espera)

Para realizar a transição, execute o seguinte código em OracleVM2:

$ dgmgrl sys/OracleLab123@cdb1_stby
DGMGRL for Linux: Version 190.0.0.0 - 64bit Production
Copyright (c) 2000, 2013, Oracle. All rights reserved.
Welcome to DGMGRL, type "help" for information.
Connected as SYSDBA.
DGMGRL> SWITCHOVER TO cdb1;
Performing switchover NOW, please wait...
Operation requires a connection to instance "cdb1" on database "cdb1"
Connecting to instance "cdb1"...
Connected as SYSDBA.
New primary database "cdb1" is opening...
Operation requires start up of instance "cdb1" on database "cdb1_stby"
Starting instance "cdb1"...
ORACLE instance started.
Database mounted.
Switchover succeeded, new primary is "cdb1"

Novamente, você agora deve ser capaz de se conectar ao banco de dados primário. Inicie o SQL*Plus:

$ sqlplus sys/OracleLab123@cdb1
SQL*Plus: Release 19.0.0.0 Production on Wed May 10 14:18:31 2022
Copyright (c) 1982, 2016, Oracle.  All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
SQL>

Você concluiu a instalação e configuração do Data Guard no Oracle Linux.

Excluir a máquina virtual

Quando as VMs não forem mais necessárias, use o comando a seguir para remover o grupo de recursos, as VMs e todos os recursos relacionados:

az group delete --name $RESOURCE_GROUP

Próximas etapas