Para crear un standby lógico de Oracle, es necesario disponer primero de un data guard físico.
Asegúrese de leer este post primero y luego volver.
Un standby lógico contiene la misma información lógica que la base de datos de producción, aunque la organización física y la estructura de los datos pueden ser diferentes.
La base de datos lógica en espera se mantiene sincronizada con la base de datos primaria a través de SQL Apply, que transforma los datos del redo recibidos de la base de datos primaria en sentencias SQL y, a continuación, ejecuta las sentencias SQL en la base de datos en espera.
1. Compruebe ambas bases de datos
Primero comprueba que todas las mesas están en orden.
SELECT OWNER, TABLE_NAME FROM DBA_LOGSTDBY_NOT_UNIQUE WHERE (OWNER, TABLE_NAME)
NOT IN (SELECT DISTINCT OWNER, TABLE_NAME FROM DBA_LOGSTDBY_UNSUPPORTED) AND BAD_COLUMN = 'Y';
Asegúrese de que no hay ningún hueco entre la base de datos primaria y la base de datos en espera.
SELECT ARCH.THREAD# "Thread", ARCH.SEQUENCE# "Last Sequence Received", APPL.SEQUENCE# "Last Sequence Applied"
FROM (SELECT THREAD# ,SEQUENCE# FROM V$ARCHIVED_LOG WHERE (THREAD#,FIRST_TIME ) IN (SELECT THREAD#,MAX(FIRST_TIME) FROM V$ARCHIVED_LOG GROUP BY THREAD#)) ARCH,
(SELECT THREAD# ,SEQUENCE# FROM V$LOG_HISTORY WHERE (THREAD#,FIRST_TIME ) IN (SELECT THREAD#,MAX(FIRST_TIME) FROM V$LOG_HISTORY GROUP BY THREAD#)) APPL
WHERE ARCH.THREAD# = APPL.THREAD#
ORDER BY 1;
Detenga el proceso de aplicación en la base de datos en espera.
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
2. Preparar la base de datos primaria
Crea esta carpeta.
mkdir -p /u01/app/oracle/arch/standby
Modifique estos parámetros en la base de datos primaria
show parameter LOG_ARCHIVE_DEST_1
ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ONLINE_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=BCN' scope=both;
show parameter LOG_ARCHIVE_DEST_3
ALTER SYSTEM SET LOG_ARCHIVE_DEST_3='LOCATION=/u01/app/oracle/arch/standby VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE) DB_UNIQUE_NAME=BCN' scope=both;
Ahora ejecute esto en la base de datos primaria para construir un diccionario en los datos rehechos
EXECUTE DBMS_LOGSTDBY.BUILD;
3. Preparar la base de datos lógica
Convertir la base de datos en espera en una base de datos lógica
ALTER DATABASE RECOVER TO LOGICAL STANDBY PARIS;
Cree esta carpeta en el servidor en espera
mkdir -p /u01/app/oracle/arch/standby
Ahora detenga la base de datos en espera e iníciela en modo de montaje
shutdown immediate
startup mount
Modifique estos parámetros en la base de datos en espera
show parameter LOG_ARCHIVE_DEST_1
ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ONLINE_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=PARIS' scope=both;
show parameter LOG_ARCHIVE_DEST_2
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=BCN ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=BCN' SCOPE=BOTH ;
show parameter LOG_ARCHIVE_DEST_3
ALTER SYSTEM SET LOG_ARCHIVE_DEST_3='LOCATION=/u01/app/oracle/arch/standby VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE) DB_UNIQUE_NAME=PARIS' scope=both;
Abra la base de datos en espera con resetlogs.
ALTER DATABASE OPEN RESETLOGS;
Inicie el proceso de aplicación en la base de datos en espera.
ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
Ahora tiene una base de datos lógica en espera que funciona.
4. Pruebas
Si desea probar su nueva base de datos en espera lógica, puede crear un nuevo usuario y una nueva tabla en la base de datos primaria y, a continuación, insertar algunas filas y la tabla y las nuevas filas deberían replicarse en la base de datos en espera lógica.
4.1 En el primario
Tengo un PDB llamado pdb1, así que trabajaré con ese PDB.
SQL> alter session set container=pdb1;
Session altered.
SQL> create user fernando identified by fernando123;
User created.
SQL> grant dba to fernando;
Grant succeeded.
SQL> create table fernando.table1 (col1 number);
Table created.
SQL> insert into fernando.table1 values (1);
1 row created.
SQL> insert into fernando.table1 values (2);
1 row created.
SQL> commit;
Commit complete.
4.2 En espera
SQL> alter session set container=pdb1;
Session altered.
SQL> select * from fernando.table1;
COL1
----------
2
1