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.