E ai pessoal, espero que todos estejam bem! Durante os estudos recentes de Data Guard eu cheguei a montar um laboratório realizando um switchover através de comandos SQL e logo após isso, uma outra operação de switchover por meio do Broker.
Estarei documentando o passo a passo do que foi realizado por aqui, e espero que seja uma leitura útil para quem está estudando esse tema.
Operação de Switchover via SQL
Primeiramente irei verificar o lag da minha configuração dataguard antes de desabilitá-la
[oracle@ol7-dba ~]$ dgmgrl sys/oracle@orclDGMGRL for Linux: Release 19.0.0.0.0 - Production on Fri May 31 22:13:50 2024Version 19.3.0.0.0Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.Welcome to DGMGRL, type "help" for information.Connected to "orcl"Connected as SYSDBA.DGMGRL> show configuration;Configuration - dg_config Protection Mode: MaxPerformance Members: orcl - Primary database orcldg - Physical standby database Fast-Start Failover: DisabledConfiguration Status:SUCCESS (status updated 53 seconds ago)DGMGRL> show configuration lag;Configuration - dg_config Protection Mode: MaxPerformance Members: orcl - Primary database orcldg - Physical standby database Transport Lag: 0 seconds (computed 1 second ago) Apply Lag: 0 seconds (computed 1 second ago) Fast-Start Failover: DisabledConfiguration Status:SUCCESS (status updated 57 seconds ago)DGMGRL> disable configuration;Disabled.DGMGRL>
Para verificar no meu banco primário se uma operação de switchover irá ocorrer corretamente eu posso utilizar o seguinte comando
SQL> ALTER DATABASE SWITCHOVER TO orcldg VERIFY;Database altered.SQL>
E caso o comando não tenha resultado em nenhuma mensagem de warning, então significa que o seu banco primário está apto a uma role transition com o seu standby
Antes do procedimento, irei apenas verificar o nível de proteção e em seguida já irei realizar o switchover
SQL> SELECT PROTECTION_MODE, PROTECTION_LEVEL, DATABASE_ROLE ROLE, SWITCHOVER_STATUS FROM V$DATABASE;PROTECTION_MODE PROTECTION_LEVEL ROLE SWITCHOVER_STATUS-------------------- -------------------- ---------- --------------------MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE PRIMARY TO STANDBYSQL> ALTER DATABASE SWITCHOVER TO orcldg;Database altered.SQL>
Após isso, caso eu tente validar a view V$DATABASE ou V$INSTANCE, eu irei receber a mensagem de Oracle not available
SQL> SELECT PROTECTION_MODE, PROTECTION_LEVEL, DATABASE_ROLE ROLE, SWITCHOVER_STATUS FROM V$DATABASE;SELECT PROTECTION_MODE, PROTECTION_LEVEL, DATABASE_ROLE ROLE, SWITCHOVER_STATUS FROM V$DATABASE*ERROR at line 1:ORA-01034: ORACLE not availableProcess ID: 4348Session ID: 256 Serial number: 22332SQL> SELECT STATUS FROM V$INSTANCE;SELECT STATUS FROM V$INSTANCE*ERROR at line 1:ORA-01034: ORACLE not availableProcess ID: 4348Session ID: 256 Serial number: 22332SQL>
Agora no meu antigo standby, e atual primário, eu já consigo verificar que a role mudou em relação à consulta anterior que eu havia feito, também já consigo realizar a abertura do meu banco
SQL> SQL>PROTECTION_MODE PROTECTION_LEVEL ROLE SWITCHOVER_STATUS-------------------- -------------------- ----------------- --------------------MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE PHYSICAL STANDBY NOT ALLOWEDSQL>SQL>SQL> SELECT PROTECTION_MODE, PROTECTION_LEVEL, DATABASE_ROLE ROLE, SWITCHOVER_STATUS FROM V$DATABASE;PROTECTION_MODE PROTECTION_LEVEL ROLE SWITCHOVER_STATUS-------------------- -------------------- ---------- --------------------MAXIMUM PERFORMANCE UNPROTECTED PRIMARY NOT ALLOWEDSQL> SELECT STATUS FROM V$INSTANCE;STATUS------------MOUNTEDSQL> ALTER DATABASE OPEN;Database altered.SQL>
Irei realizar a abertura do meu standby atual em modo mount e já ativar o redo apply do mesmo
SQL> STARTUP MOUNTORACLE instance started.Total System Global Area 1426059984 bytesFixed Size 9134800 bytesVariable Size 360908752 bytesDatabase Buffers 1040187392 bytesRedo Buffers 7639040 bytesDatabase mounted.SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;Database altered.SQL> SELECT PROTECTION_MODE, PROTECTION_LEVEL, DATABASE_ROLE ROLE, SWITCHOVER_STATUS FROM V$DATABASE;PROTECTION_MODE PROTECTION_LEVEL ROLE SWITCHOVER_STATUS-------------------- -------------------- ----------------- --------------------MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE PHYSICAL STANDBY TO PRIMARYSQL> SELECT STATUS FROM V$INSTANCE;STATUS------------MOUNTEDSQL>
Consigo visualizar que o meu primary já está sem me retornar nenhum erro referente a verificação e logo em seguida iniciarei o switchover
SQL> ALTER DATABASE SWITCHOVER TO orcl VERIFY;Database altered.SQL> ALTER DATABASE SWITCHOVER TO orcl;Database altered.SQL>
Após a operação, irei reabrir o meu primary atual, deixar o meu standby em modo MOUNT e já iniciar o redo apply do mesmo
SQL> startup mountORACLE instance started.Total System Global Area 1426059984 bytesFixed Size 9134800 bytesVariable Size 352321536 bytesDatabase Buffers 1056964608 bytesRedo Buffers 7639040 bytesDatabase mounted.SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;Database altered.SQL> SELECT PROTECTION_MODE, PROTECTION_LEVEL, DATABASE_ROLE ROLE, SWITCHOVER_STATUS FROM V$DATABASE;PROTECTION_MODE PROTECTION_LEVEL ROLE SWITCHOVER_STATUS-------------------- -------------------- ----------------- --------------------MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE PHYSICAL STANDBY NOT ALLOWEDSQL>
Operação de Switchover via BROKER
Nessa etapa, será feito o mesmo procedimento anterior, porém dessa vez via BROKER.
Começarei verificando o transporte entre os bancos através dos seguintes comandos:
DGMGRL> SHOW DATABASE orcl;Database - orcl Role: PRIMARY Intended State: TRANSPORT-ON Instance(s): orclDatabase Status:SUCCESSDGMGRL> SHOW DATABASE orcldg;Database - orcldg Role: PHYSICAL STANDBY Intended State: APPLY-ON Transport Lag: 0 seconds (computed 1 second ago) Apply Lag: 0 seconds (computed 1 second ago) Average Apply Rate: 5.00 KByte/s Real Time Query: OFF Instance(s): orclDatabase Status:SUCCESSDGMGRL>
Particularmente eu prefiro realizar esse tipo de operação através do próprio BROKER, principalmente por conta da praticidade de realizar o switchover por lá, basicamente basta eu realizar o comando ” SWITCHOVER TO orcldg ” que ele já irá realizar todo o procedimento anterior sozinho.
Mas antes disso irei realizar algumas validações:
DGMGRL> VALIDATE DATABASE orcldg; Database Role: Physical standby database Primary Database: orcl Ready for Switchover: Yes Ready for Failover: Yes (Primary Running) Flashback Database Status: orcl : Off orcldg: Off Managed by Clusterware: orcl : NO orcldg: NO Validating static connect identifier for the primary database orcl... The static connect identifier allows for a connection to database "orcl".DGMGRL>
Através do comando acima eu consigo validar que o meu banco está pronto para uma operação de switchover. Agora em seguida irei validar se há alguma divergência entre os SPFILEs dos bancos:
DGMGRL> VALIDATE DATABASE orcldg SPFILE;Connecting to "orcl".Connected to "orcl"Connecting to "orcldg".Connected to "orcldg"No parameter differences found.DGMGRL>
Também irei validar tanto se o meu primário está transportando redo quanto se o meu standby está aplicando esse redo corretamente
DGMGRL> SHOW DATABASE orcl;Database - orcl Role: PRIMARY Intended State: TRANSPORT-ON Instance(s): orclDatabase Status:SUCCESSDGMGRL> SHOW DATABASE orcldg;Database - orcldg Role: PHYSICAL STANDBY Intended State: APPLY-ON Transport Lag: 0 seconds (computed 0 seconds ago) Apply Lag: 0 seconds (computed 0 seconds ago) Average Apply Rate: 4.00 KByte/s Real Time Query: ON Instance(s): orclDatabase Status:SUCCESSDGMGRL>
E por fim vou finalmente realizar o switchover utilizando o Broker
DGMGRL> switchover to orcldg;Performing switchover NOW, please wait...Operation requires a connection to database "orcldg"Connecting ...Connected to "orcldg"Connected as SYSDBA.New primary database "orcldg" is opening...Operation requires start up of instance "orcl" on database "orcl"Starting instance "orcl"...Connected to an idle instance.ORACLE instance started.Connected to "orcl"Database mounted.Connected to "orcl"Switchover succeeded, new primary is "orcldg"DGMGRL> show configuration;Configuration - dg_config Protection Mode: MaxPerformance Members: orcldg - Primary database orcl - Physical standby database orcldg2 - Logical standby database Fast-Start Failover: DisabledConfiguration Status:SUCCESS (status updated 111 seconds ago)DGMGRL>