Converting a Snapshot Database into a Physical Standby Database (using SQL *Plus)

A conversão em questão é extremamente simples, uma vez que todos os Redos enviados pelo primary estejam já no ambiente Standby. Assim, durante o processo, o GRP será usado e os Redos, aplicados.

Validando ambientes que serão usados neste artigo:

Primary:
 
[oracle@fornix1 ~]$ sqlplus / as sysdba
 
SQL*Plus: Release 19.0.0.0.0 - Production on Thu Jun 3 05:39:07 2021
Version 19.3.0.0.0
 
Copyright (c) 1982, 2019, Oracle.  All rights reserved.
 
 
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
 
SQL> SELECT DB_UNIQUE_NAME,DATABASE_ROLE,OPEN_MODE FROM V$DATABASE;
 
DB_UNIQUE_NAME                 DATABASE_ROLE    OPEN_MODE
------------------------------ ---------------- --------------------
cortex                         PRIMARY          READ WRITE
Snapshot:
 
[oracle@fornix2 ~]$ sqlplus / as sysdba
 
SQL*Plus: Release 19.0.0.0.0 - Production on Thu Jun 3 05:40:13 2021
Version 19.3.0.0.0
 
Copyright (c) 1982, 2019, Oracle.  All rights reserved.
 
 
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
 
SQL> SELECT DB_UNIQUE_NAME,DATABASE_ROLE,OPEN_MODE FROM V$DATABASE;
 
DB_UNIQUE_NAME                 DATABASE_ROLE    OPEN_MODE
------------------------------ ---------------- --------------------
cortexDR                       SNAPSHOT STANDBY READ WRITE

Montando o Snapshot Database:

SQL> SHU IMMEDIATE;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> STARTUP MOUNT;
ORACLE instance started.
 
Total System Global Area 2583690520 bytes
Fixed Size                  8899864 bytes
Variable Size             553648128 bytes
Database Buffers         2013265920 bytes
Redo Buffers                7876608 bytes
Database mounted.

Emitindo comando para a conversão:

SQL> ALTER DATABASE CONVERT TO PHYSICAL STANDBY;
 
Database altered.

O alert nos reporta informações interessantes sobre o processo em si:

2021-06-03 05:44:35.545000 -03:00
ALTER DATABASE CONVERT TO PHYSICAL STANDBY
ALTER DATABASE CONVERT TO PHYSICAL STANDBY (CORTEXDR)
.... (PID:8900): Killing 2 processes (PIDS:8917,8919) (all RFS) in order to disallow current and future RFS connections. Requested by OS process 8900
Process termination requested for pid 8917 [source = rdbms], [info = 2] [request issued by pid: 8900, uid: 54321]
Process termination requested for pid 8919 [source = rdbms], [info = 2] [request issued by pid: 8900, uid: 54321]
2021-06-03 05:44:37.879000 -03:00
Flashback Restore Start
2021-06-03 05:44:39.381000 -03:00
Flashback Restore Complete
Drop guaranteed restore point
Guaranteed restore point  dropped
.... (PID:8900): Database role cleared from SNAPSHOT STANDBY [kcvs.c:8837]
Clearing standby activation ID 584140392 (0x22d14668)
The primary database controlfile was created using the
'MAXLOGFILES 16' clause.
There is space for up to 13 standby redo logfiles
Use the following SQL commands on the standby database to create
standby redo logfiles that match the primary database:
ALTER DATABASE ADD STANDBY LOGFILE 'srl1.f' SIZE 209715200;
ALTER DATABASE ADD STANDBY LOGFILE 'srl2.f' SIZE 209715200;
ALTER DATABASE ADD STANDBY LOGFILE 'srl3.f' SIZE 209715200;
ALTER DATABASE ADD STANDBY LOGFILE 'srl4.f' SIZE 209715200;
.... (PID:8900): Database role changed from PRIMARY to PHYSICAL STANDBY [kcvs.c:8842]
.... (PID:8900): RT: Role transition work is not done
.... (PID:8900): Redo network throttle feature is disabled at mount time
Physical Standby Database mounted.
In-memory operation on ADG is currently only supported on Engineered systems and PaaS.
inmemory_adg_enabled is turned off automatically.
Please contact our support team for EXADATA solutions
CONVERT TO PHYSICAL STANDBY: Complete - Database mounted as physical standby
Completed: ALTER DATABASE CONVERT TO PHYSICAL STANDBY
 rfs (PID:8975): Primary database is in MAXIMUM PERFORMANCE mode
 rfs (PID:8975): Selected LNO:4 for T-1.S-101 dbid 548968087 branch 1039033628

No primary, gerando um novo Redo e checando a sua sequence:

SQL> SELECT DB_UNIQUE_NAME,DATABASE_ROLE,OPEN_MODE FROM V$DATABASE;
 
DB_UNIQUE_NAME                 DATABASE_ROLE    OPEN_MODE
------------------------------ ---------------- --------------------
cortex                         PRIMARY          READ WRITE
 
SQL> ALTER SYSTEM SWITCH LOGFILE ;
 
System altered.
 
SQL> SELECT THREAD#, MAX(SEQUENCE#) FROM V$LOG GROUP BY THREAD# ;
 
   THREAD# MAX(SEQUENCE#)
---------- --------------
         1            102

No standby, já é possível ver o reflexo da conversão:

SQL> SELECT PROCESS,STATUS,SEQUENCE# FROM V$MANAGED_STANDBY;
 
PROCESS   STATUS        SEQUENCE#
--------- ------------ ----------
ARCH      CONNECTED             0
DGRD      ALLOCATED             0
DGRD      ALLOCATED             0
ARCH      CONNECTED             0
ARCH      CONNECTED             0
ARCH      CLOSING             101
RFS       IDLE                  0
RFS       IDLE                102
 
8 rows selected.
 
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;
 
Database altered.
 
SQL> SELECT PROCESS,STATUS,SEQUENCE# FROM V$MANAGED_STANDBY;
 
PROCESS   STATUS        SEQUENCE#
--------- ------------ ----------
ARCH      CONNECTED             0
DGRD      ALLOCATED             0
DGRD      ALLOCATED             0
ARCH      CONNECTED             0
ARCH      CONNECTED             0
ARCH      CLOSING             101
RFS       IDLE                  0
RFS       IDLE                102
MRP0      APPLYING_LOG        102
 
9 rows selected.

Obs: Este procedimento foi criado pelo senhor Ahmed Baraka (www.ahmedbaraka.com) e foi apenas reproduzido por mim em um laboratório pessoal para fins de aprendizado.

Leave a Comment

Your email address will not be published.