Si quieres configurar un Oracle 19c Data Guard entonces necesitas tener 2 servidores.
Un Data Guard físico es la configuración por defecto de Oracle Data Guard.
Proporciona una copia físicamente idéntica de la base de datos primaria, con estructuras de base de datos en disco que son idénticas a la base de datos primaria bloque por bloque. El esquema de la base de datos, incluidos los índices, es el mismo.
Una base de datos standby física se mantiene sincronizada con la base de datos primaria, a través de Redo Apply, que recupera los datos de archivelog recibidos de la base de datos primaria y aplica el archivelog a la base de datos física en espera.
En el servidor 1, deberías tener una base de datos ya creada y en el servidor 2, sólo necesitas los binarios sin base de datos creada.
Uso /etc/hosts para configurar la resolución de nombres.
Aquí está mi /etc/hosts en ambos servidores
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.130 srv1.localdomain srv1
192.168.1.131 srv2.localdomain srv2
En esta guía te mostraré cómo crear una base de datos standby entre Barcelona y París.
Es bastante fácil si sigues este paso a paso de configuración de data guard.
BCN es la base de datos primaria en el servidor srv1.
PARIS es la base de datos standby en el servidor srv2.
Índice
1. Preparar la base de datos primaria
Primero debes activar el archivelog en tu base de datos.
Activar archivelog
sqlplus / as sysdba
select log_mode from v$database ;
alter system set log_archive_dest_1 = 'LOCATION=USE_DB_RECOVERY_FILE_DEST' scope=both;
shutdown immediate
startup mount
alter database archivelog;
alter database open;
alter system switch logfile;
select name from v$archived_log;
Activar el force logging
select force_logging from v$database;
alter database force logging;
select force_logging from v$database;
Comprobar el tamaño de los redo logs
select group#, thread#, bytes/1024/1024 mb from v$log;
select thread#, instance from v$thread ;
Crear los standby redo logs
Debes crear los standby logfiles del mismo tamaño que el resultado que tuviste en la consulta anterior, y también del mismo número.
Como tengo 3 redo logs y su tamaño es de 200m, entonces creo 3 standby logfiles de 200m cada uno.
alter database add standby logfile thread 1 size 200m;
alter database add standby logfile thread 1 size 200m;
alter database add standby logfile thread 1 size 200m;
Comprobar los standby redo logs
select group#, thread#, sequence#, bytes/1024/1024 mb, archived, status
from v$standby_log;
select member from v$logfile where type = 'STANDBY';
Comprobar db_unique_name
show parameter db_unique_name
Configurar log_archive_config
alter system set log_archive_config='DG_CONFIG=(BCN,PARIS)' scope=both;
Establecer log_archive_dest_2
alter system set log_archive_dest_2='SERVICE=PARIS ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=PARIS' scope=both;
Establecer fal_server
show parameter fal_server ;
alter system set fal_server ='PARIS' scope=both;
fal_client ya no es necesario en Oracle 19c.
Configurar el standby_file_management
show parameter standby_file_management
alter system set standby_file_management='AUTO' scope=both;
Obten una lista de parámetros dependientes del directorio y crea los directorios necesarios en el servidor standby:
select name, value from v$parameter
where upper(value) like upper('%/bcn/%');
Crearás el directorio adump más adelante.
Activa el flashback
alter database flashback on;
Comprueba el password file.
ls /u01/app/oracle/product/19.0.0/db_1/dbs/orapw*
Añade a tnsnames.ora
vi $TNS_ADMIN/tnsnames.ora
BCN =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = srv1.localdomain)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = BCN.localdomain)
)
)
LISTENER_BCN =
(ADDRESS = (PROTOCOL = TCP)(HOST = srv1.localdomain)(PORT = 1521))
PARIS =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = srv2.localdomain)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = PARIS.localdomain)
)
)
En el servidor primario, añade una entrada estática para el listener
vi $TNS_ADMIN/listener.ora
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = srv1.localdomain)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(GLOBAL_DBNAME=BCN.localdomain)
(SID_NAME=BCN)
(ORACLE_HOME=/u01/app/oracle/product/19.0.0/db_1)
)
)
Recarga el listener
lsnrctl reload
2. Prepara la base de datos standby
Crea un archivo init con sólo el db_name.
Recuerda que db_name será el mismo tanto en la base de datos primaria como en la base standby.
Sólo el db_unique_name será diferente.
echo 'DB_NAME=BCN' > $ORACLE_HOME/dbs/initPARIS.ora
Copia el archivo de passwords del servidor primario al servidor standby.
scp oracle@srv1:/u01/app/oracle/product/19.0.0/db_1/dbs/orapwBCN /u01/app/oracle/product/19.0.0/db_1/dbs/orapwPARIS
ls -al /u01/app/oracle/product/19.0.0/db_1/dbs/orapwPARIS
Copia el archivo tnsnames.ora
scp oracle@srv1:/u01/app/oracle/product/19.0.0/db_1/network/admin/tnsnames.ora /u01/app/oracle/product/19.0.0/db_1/network/admin/tnsnames.ora
En el servidor standby, añade una entrada estática en el listener que será necesaria para duplicar una base de datos
vi $TNS_ADMIN/listener.ora
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = srv2.localdomain)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(GLOBAL_DBNAME=PARIS.localdomain)
(SID_NAME=PARIS)
(ORACLE_HOME=/u01/app/oracle/product/19.0.0/db_1)
)
)
Recarga el listener
lsnrctl reload
Crea la carpeta adump
mkdir -p /u01/app/oracle/admin/PARIS/adump
Inicia la BD standby en nomount
sqlplus / as sysdba
startup nomount
exit
3. Duplica la base de datos
Conéctate a RMAN
Debe conectarse a la base de datos primaria y a la base de datos en espera al mismo tiempo.
rman TARGET sys/oracle@BCN AUXILIARY sys/oracle@PARIS
Duplica la base de datos
DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE DORECOVER
SPFILE
SET DB_UNIQUE_NAME 'PARIS' COMMENT 'Is standby'
SET LOG_ARCHIVE_DEST_2 'SERVICE=BCN ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=BCN'
SET AUDIT_FILE_DEST '/u01/app/oracle/admin/PARIS/adump'
SET CONTROL_FILES '/u01/app/oracle/oradata/PARIS/controlfile/control01.ctl'
SET FAL_SERVER 'BCN'
NOFILENAMECHECK;
Una vez realizado el comando de duplicar, ya habrás creado tu base de datos standby.
Ahora conéctate a la base de datos standby y verifica su rol.
sqlplus / as sysdba
select database_role from v$database;
show parameter db_name
show parameter db_unique_name
El db_name debe ser el mismo que el de la base de datos primaria y el db_unique_name debe ser PARIS.
Ahora inicia el proceso de aplicación de redo en la base de datos standby.
alter database recover managed standby database
disconnect from session;
Comprueba en la base de datos standby que esté aplicando los arhivelogs con esto.
select role, thread#, sequence#, action
from v$dataguard_process;
Ahora ve al servidor primario y comprueba también los archivelogs y haz un switch logfile para generar un nuevo archivelog
select sequence#, first_time, next_time
from v$archived_log
order by sequence#;
alter system switch logfile;
Ahora ve a la base de datos standby y comprueba que se ha aplicado el nuevo archivelog.
select sequence#, first_time, next_time, applied
from v$archived_log
order by sequence#;
Deten el proceso de recuperación en la standby
alter database recover managed standby database cancel;
Activa el flashback en la standby
alter database flashback on;
Vuelva a iniciar el proceso de recuperación en la standby
alter database recover managed standby database
disconnect from session;
4. Realiza un switchover con sqlplus
Primero confirma que la sincronización está lista para realizar un switchover
sqlplus / as sysdba
alter database switchover to PARIS verify;
Si no aparece ningún error en el comando anterior, entonces todo está bien.
Si tienes errores, consulta el alert log para tener más detalles.
En la base de datos primaria, comprueba que no hay ningún gap
select status, gap_status
from v$archive_dest_status
where dest_id = 2;
Switchover a la base de datos standby
Ejecutar desde la base de datos primaria:
alter database switchover to PARIS;
Ahora ve a srv2 (que es ahora la base de datos primaria) y abre la base de datos
sqlplus / as sysdba
alter database open;
Ahora ve a srv1 (la nueva base de datos standby) y monta la base de datos
startup mount
alter database recover managed standby database disconnect;
En srv1 verifica que todo está bien
select database_role from v$database;
select role, thread#, sequence#, action from v$dataguard_process;
Ahora volvamos todo al punto de partida.
Realizarás un switchback.
Comprueba primero que ambas bases de datos están listas.
alter database switchover to BCN verify;
Ahora ve a srv2 y ejecuta el switchover de nuevo.
alter database switchover to BCN;
Y abre la base de datos en srv1
alter database open;
En srv2 monta la base de datos e inicia de nuevo el proceso de recuperación
startup mount
alter database recover managed standby database disconnect;
En srv2 verifica que el switchback ha sido correcto
select database_role from v$database;
5. Solución de problemas
Si tienes problemas, comprueba los parámetros en la base de datos primaria y en la base de datos standby con esta consulta.
set linesize 200 pages 50
col value for a85
col name for a50
select name, value
from gv$parameter
where name in ('db_name','db_unique_name','log_archive_config',
'log_archive_dest_1','log_archive_dest_2','log_archive_dest_3',
'log_archive_dest_state_1','log_archive_dest_state_2','log_archive_dest_state_3',
'remote_login_passwordfile','log_archive_format','log_archive_max_processes',
'fal_server','fal_client','db_file_name_convert',
'log_file_name_convert', 'standby_file_management')
order by 1;
Esto fue impresionante, muchas gracias