Configurardataguard DatafilesToAsm

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 22

Oracle - Configurar dataguard

Índice

Introducción
Checklist
Consideraciones
Pasos del procedimiento
Procedimiento detallado
Crear estructura de directorios en standby como en primaria
Sacar pfile de origen y adaptarlo en destino
Asegurar conectividad entre nodos
Crear standby logs en primary (antes de duplicar)
Habilitar Forced Logging en Primary
Duplicar la base de datos
Configurar parámetros de instancia para ambas
Iniciar replicación
Configurar primary para poder funcionar como standby
Crear un servicio común
Configurar Broker (DGMGRL)
Forzar archivelog cada 30 minutos
Configurar backup y mantenimiento de archivelogs aplicados

Introducción
Procedimiento para configurar de cero un DataGuard y crear base de datos standby a una base de datos ya existente. Incluida la posibilidad de un
entorno heterogéneo Filesystem ASM.

Checklist
Antes:

Disponer de un nuevo servidor con mismas características que el de la base de datos actual.
Es necesario tener ya instalado un RDBMS en la misma versión y nivel de parcheo que el de la base de datos actual.
Comprobar que el almacenamiento es suficiente para alojar la nueva base de datos.

Después:

Comprobar que la replicación está en curso.


Verificar que en el nodo standby los borrados periódicos de archivelogs ya aplicados se están limpiando.
Programar una intervención para realizar un switchover para validar funcionamiento inverso.

Consideraciones

Pasos del procedimiento


Crear estructura de directorios en standby como en primaria
Sacar pfile de origen y adaptarlo en destino
Asegurar conectividad entre nodos
Crear standby logs en primary (antes de duplicar)
Duplicar la base de datos
Configurar parametros de instancia para ambas
Iniciar replicación
Configurar primary para poder funcionar como standby
Crear un servicio común
Configurar DGMGRL
Configurar backup y mantenimiento de archivelogs aplicados

Procedimiento detallado
Nos conectaremos por ssh al nuevo sistema que será el standby.

Crear estructura de directorios en standby como en primaria


Es altamente recomendable usar la misma estructura de directorios en ambos nodos. Aun en entornos Filesystem ASM los directorios de instancia deben
ser iguales.

Para ello lanzamos en la base de datos primaria estas consultas y ejecutamos como oracle los resultados:

-- Extraer en primaria los directorios necesarios para la instancia


set pagesize 0
set feedback off
prompt DIRECTORIOS LOGS Y TRAZAS
select distinct 'mkdir -p '||value from v$parameter where name = 'audit_file_dest'
or name = 'background_dump_dest'
or name = 'core_dump_dest'
or name = 'user_dump_dest' order by 1;

-- Extraer en primaria los directorios necesarios para la base de datos, en caso de que la standby sea ASM no
es necesario este paso
set pagesize 0
set feedback off
prompt DIRECTORIOS FICHEROS DE BD (no necesario para ASM)
select distinct 'mkdir -p '||SUBSTR(name, 0, INSTR(name,'/',-1)-1) from v$controlfile
union select distinct 'mkdir -p '||SUBSTR(member, 0, INSTR(member,'/',-1)-1) from v$logfile
union select distinct 'mkdir -p '||SUBSTR(name, 0, INSTR(name,'/',-1)-1) from v$datafile
union select distinct 'mkdir -p '||SUBSTR(name, 0, INSTR(name,'/',-1)-1) from v$tempfile order by 1;

NOTA: En caso de usar ASM no es necesario crear los directorios de "FICHEROS DE BD".

Ejemplo:

DIRECTORIOS LOGS Y TRAZAS


mkdir -p /opt/oracle/admin/axprecm2/adump
mkdir -p /opt/oracle/diag/rdbms/axprecm2/axprecm2/cdump
mkdir -p /opt/oracle/product/12.1.0/rdbms/log

DIRECTORIOS FICHEROS DE BD (no necesario para ASM)


mkdir -p /oracle/logs/axprecm2
mkdir -p /oracle/oradata/axprecm2/sys
mkdir -p /oracle/oradata/axprecm2/ucontrolm
mkdir -p /oracle/oradata/axprecm2/uemuser
mkdir -p /oracle/orasystem/axprecm2
mkdir -p /oracle/orasystem/axprecm2/sys

Sacar pfile de origen y adaptarlo en destino


En la base de datos primaria obtenemos un pfile para copiar y adaptar a la nueva instancia standby en el nuevo sistema:

SQL> create pfile from spfile;


File created.

scp $ORACLE_HOME/dbs/init${ORACLE_SID}.ora <SERVER_STBY>:$ORACLE_HOME/dbs


rm $ORACLE_HOME/dbs/init${ORACLE_SID}.ora
Modificar los parámetros de la siguiente forma:

1. Quitamos los parámetros personalizados que comienzan por '<ORACLE_SID>.__'


2. El db_name de las dos bases de datos debe de ser igual. La diferencia se establece en el db_unique_name. Modificamos este parámetro con el
nombre de la standby y los demás en los que pudiera salir como por ejemplo "log_archive_dest_1":

*.db_unique_name='AXPRECM4'
*.log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES)
DB_UNIQUE_NAME=AXPRECM4'

3. Modificar el listener si procede, y en ese caso renombrar o crear dicho listener si no se va a usar el de por defecto 'LISTENER'. Ej:

*.local_listener='LISTENER_AXPRECM4'

4. En caso de usar distintas rutas o de ser un entorno heterogéneo Filesystem ASM, adaptar los siguientes parámetros. Ej:

*.db_recovery_file_dest='+DGRECO01'
*.db_create_file_dest='+DGDATA01'

5. Si el entorno es heterogéneo o las rutas no son iguales incluiremos además los parámentros "db_file_name_convert" y "log_file_name_convert"
para la conversión de rutas durante el restore de RMAN y futuras modificaciones de la estructura de la base de datos en el nodo primario, con el
siguiente formato:

*.db_file_name_convert='/<dir-origen-dbf>/','+<DG-dest>/<unique-name>/DATAFILE/', '/<dir-origen-dbf>
/','+<DG-dest>/<unique-name>/TEMPFILE/', '/<dir-origen-dbf>/','+<DG-dest>/<unique-name>/CONTROLFILE/', ...
*.log_file_name_convert='/<dir-origen>/','+<DG-dest>/<unique-name>/ONLINELOG/', ...

Para obtener los directorios de la base de datos origen nos valdremos de la ayuda de estas consultas:

-- Obtener directorios para db_file_name_convert


col tipo format a12
col dir format a60
break on TIPO
select distinct 'CONTROLFILE' TIPO, SUBSTR(name, 0, INSTR(name,'/',-1)-1)||'/' DIR from v$controlfile
union select distinct 'DATAFILE' TIPO, SUBSTR(name, 0, INSTR(name,'/',-1)-1)||'/' DIR from v$datafile
union select distinct 'TEMPFILE' TIPO, SUBSTR(name, 0, INSTR(name,'/',-1)-1)||'/' DIR from v$tempfile
order by 1, 2;

TIPO DIR
------------ ------------------------------------------------------------
CONTROLFILE /oracle/oradata/axprecm2/sys/
/oracle/orasystem/axprecm2/
DATAFILE /oracle/oradata/axprecm2/sys/
/oracle/oradata/axprecm2/ucontrolm/
/oracle/oradata/axprecm2/uemuser/
TEMPFILE /oracle/oradata/axprecm2/sys/

6 rows selected.

-- Obtener directorios para log_file_name_convert


col tipo format a12
col dir format a60
break on TIPO
select distinct 'ONLINELOG' TIPO, SUBSTR(member, 0, INSTR(member,'/',-1)-1)||'/' DIR from v$logfile
order by 1, 2;

TIPO DIR
------------ ------------------------------------------------------------
ONLINELOG /oracle/logs/axprecm2/
/oracle/orasystem/axprecm2/sys/

Ejemplo de pfile resultante:


*.archive_lag_target=1800
*.audit_file_dest='/opt/oracle/admin/axprecm4/adump'
*.audit_trail='XML','EXTENDED'
*.compatible='12.1.0.0.0'
*.cursor_sharing='FORCE'
*.db_block_size=8192
*.db_domain='central.inditex.grp'
*.db_name='axprecm2'
*.db_unique_name='axprecm4'
*.db_recovery_file_dest='+DGRECO01'
*.db_recovery_file_dest_size=30720m
*.db_create_file_dest='+DGDATA01'
*.diagnostic_dest='/opt/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=axprecm4XDB)'
*.local_listener='LISTENER_AXPRECM4'
*.log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES)
DB_UNIQUE_NAME=axprecm4'
*.log_archive_format='%t_%s_%r.dbf'
*.nls_length_semantics='CHAR'
*.open_cursors=300
*.optimizer_mode='ALL_ROWS'
*.pga_aggregate_target=1024m
*.processes=600
*.remote_login_passwordfile='EXCLUSIVE'
*.sessions=665
*.sga_target=4g
*.undo_tablespace='UNDOTBS1'
*.DB_FILE_NAME_CONVERT='/oracle/oradata/axprecm2/sys/','+DGDATA01/AXPRECM4/DATAFILE/','/oracle/oradata/axprecm2
/ucontrolm/','+DGDATA01/AXPRECM4/DATAFILE/','/oracle/oradata/axprecm2/uemuser/','+DGDATA01/AXPRECM4/DATAFILE/','
/oracle/oradata/axprecm2/sys/','+DGDATA01/AXPRECM4/TEMPFILE/','/oracle/oradata/axprecm2/sys/','+DGDATA01
/AXPRECM4/CONTROLFILE/','/oracle/orasystem/axprecm2/','+DGRECO01/AXPRECM4/CONTROLFILE/'
*.LOG_FILE_NAME_CONVERT='/oracle/logs/axprecm2/','+DGRECO01/AXPRECM4/ONLINELOG/','/oracle/orasystem/axprecm2/sys
/','+DGDATA01/AXPRECM4/ONLINELOG/'

Asegurar conectividad entre nodos


Todas las password del usuario SYS y todos los ficheros de passwords, tienen que ser iguales en todas las base de datos implicadas en el dataguard
primary y standby. si se tuviera una password de SYS en la primaria y otra distinta en las standby, no funcionaria el envío de redo entre la primary y esa
standby, produciéndose un gap.

Hemos de asegurarnos que el fichero de passwords es el mismo en las dos bases de datos. Hacemos una copia y nos aseguramos que el parámetro
remote_login_passwordfile tiene el valor EXCLUSIVE.

SQL> show parameter remote_login_passwordfile

NAME TYPE VALUE


------------------------------------ -------------------------------- ------------------------------
remote_login_passwordfile string EXCLUSIVE

[oracle@axpreoracm2 ~]$ ls -l $ORACLE_HOME/dbs/orapw${ORACLE_SID}


-rw-r-----. 1 oracle oinstall 7680 Mar 23 2017 /opt/oracle/product/12.1.0/dbs/orapwaxprecm2

Copiar en destino adaptando el SID si fuera necesario, o crearlo (con la misma clave de SYS) de la siguiente forma:

orapwd file=$ORACLE_HOME/dbs/orapw${ORACLE_SID}

Enter password for SYS: ********


Editar ambos tnsnames para añadir la nueva standby y también la línea de listener referenciado en 'local_listener'. EJ:

AXPRECM4 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = axpreoracm4.central.inditex.grp)(PORT = 11521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = axprecm4.central.inditex.grp)
(UR = A)
)
)

LISTENER_AXPRECM4 =
(ADDRESS = (PROTOCOL = TCP)(HOST = axpreoracm4.central.inditex.grp)(PORT = 11521))

Nota: para evitar el siguiente error durante el restore de RMAN en nomount, añadir la opción: (UR = A).

RMAN-04006: error from auxiliary database: ORA-12528: TNS:listener: all appropriate instances are
blocking new connections

Mas información en "Connections to NOMOUNT/MOUNTED or RESTRICTED Databases Fail (Doc ID 362656.1)"

Crear standby logs en primary (antes de duplicar)


Hemos de crear tantos grupos de standby redo log, o más, para el standby como número de grupos haya normalmente. Toda la información de los
ficheros de redo de la BD principal se pasa a los ficheros de standby de la bd de dataguard. Así, en caso de que hubiera un crash de la bd principal
podríamos recuperar toda la información.
Si no tuviéramos los ficheros de standby la información de redo no se pasaría hasta que la bd principal lo archivara en un arc. En este caso si se produce
un crash de la bd principal toda la información que se encuentra en el redo y que no se almacenó todavía en un arc se perdería.
Al crearlos antes de duplicar nos aseguramos que ambas bases de datos los tienen y pueden funcionar como standby.
==> NOTE:
==> 1. To check the number of Standby RedoLogs (SRL) : (maximum number of logfiles for each thread + 1) *
maximum number of threads
==> 2. The SRL size equal to Online RedoLogs (ORL) size.

col member format a60


select group#, type, member from v$logfile;

GROUP# TYPE MEMBER


---------- ------- ------------------------------------------------------------
1 ONLINE /oracle/logs/axprecm2/redo01a.log
1 ONLINE /oracle/orasystem/axprecm2/sys/redo01b.log
2 ONLINE /oracle/logs/axprecm2/redo02a.log
2 ONLINE /oracle/orasystem/axprecm2/sys/redo02b.log
3 ONLINE /oracle/logs/axprecm2/redo03a.log
3 ONLINE /oracle/orasystem/axprecm2/sys/redo03b.log

6 rows selected.

SQL> select distinct bytes/1024/1024 Mb from v$log;

MB
----------
250

ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 ('/oracle/logs/axprecm2/stby04a.log','/oracle/orasystem/axprecm2/sys


/stby04b.log') SIZE 250M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 ('/oracle/logs/axprecm2/stby05a.log','/oracle/orasystem/axprecm2/sys
/stby05b.log') SIZE 250M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 ('/oracle/logs/axprecm2/stby06a.log','/oracle/orasystem/axprecm2/sys
/stby06b.log') SIZE 250M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 ('/oracle/logs/axprecm2/stby07a.log','/oracle/orasystem/axprecm2/sys
/stby07b.log') SIZE 250M;

col member format a60


select group#, type, member from v$logfile;

GROUP# TYPE MEMBER


---------- ------- ------------------------------------------------------------
1 ONLINE /oracle/logs/axprecm2/redo01a.log
1 ONLINE /oracle/orasystem/axprecm2/sys/redo01b.loge
2 ONLINE /oracle/logs/axprecm2/redo02a.log
2 ONLINE /oracle/orasystem/axprecm2/sys/redo02b.log
3 ONLINE /oracle/logs/axprecm2/redo03a.log
3 ONLINE /oracle/orasystem/axprecm2/sys/redo03b.log
4 STANDBY /oracle/logs/axprecm2/stby04a.log
4 STANDBY /oracle/orasystem/axprecm2/sys/stby04b.log
5 STANDBY /oracle/logs/axprecm2/stby05a.log
5 STANDBY /oracle/orasystem/axprecm2/sys/stby05b.log
6 STANDBY /oracle/logs/axprecm2/stby06a.log
6 STANDBY /oracle/orasystem/axprecm2/sys/stby06b.log
7 STANDBY /oracle/logs/axprecm2/stby07a.log
7 STANDBY /oracle/orasystem/axprecm2/sys/stby07b.log

12 rows selected.

Habilitar Forced Logging en Primary


SQL> select force_logging from v$database;

FORCE_LOGGING
---------------------------------------
NO

SQL> ALTER DATABASE FORCE LOGGING;

Database altered.

SQL> select force_logging from v$database;

FORCE_LOGGING
---------------------------------------
YES <-----

Duplicar la base de datos


Levantar standby en nomount:

[oracle@axpreoracm4 dbs]$ @axprecm4


[oracle@axpreoracm4 dbs]$ sqlplus / as sysdba

SQL*Plus: Release 12.1.0.2.0 Production on Tue Aug 10 08:42:39 2021

Copyright (c) 1982, 2014, Oracle. All rights reserved.

Connected to an idle instance.

SQL> startup nomount


ORACLE instance started.

Total System Global Area 4294967296 bytes


Fixed Size 2932632 bytes
Variable Size 1040187496 bytes
Database Buffers 3238002688 bytes
Redo Buffers 13844480 bytes

SQL> create spfile from pfile;

File created.

SQL>

Verificar conectividad

TARGET (primary)
Servidor: axpreoracm2
SID: axprecm2
DB_UNIQUE_NAME: axprecm2
TNS: axprecm2

AUXILIARY (standby)
Servidor: axpreoracm4
SID: axprecm4
DB_UNIQUE_NAME: axprecm4
TNS: axprecm4
[oracle@axpreoracm2 ~]$ tnsping axprecm4
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = axpreoracm4.central.inditex.grp)(PORT =
11521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = axprecm4.central.inditex.grp)))
OK (40 msec)

[oracle@axpreoracm4 ~]$ tnsping axprecm2


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = axpreoracm2.central.inditex.grp)(PORT =
11521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = axprecm2.central.inditex.grp)))
OK (20 msec)

[oracle@axpreoracm4 ~]$ rman auxiliary 'sys@axprecm4' target 'sys@axprecm2'


target database Password:
connected to target database: AXPRECM2 (DBID=2460471875)
auxiliary database Password:
connected to auxiliary database: AXPRECM2 (not mounted)

Crear script de RMAN para el restore en standby:

[oracle@axpreoracm4 ~]$ cat /var/tmp/duplicate_from_active_script.rman


run
{
ALLOCATE auxiliary CHANNEL aux1 DEVICE TYPE DISK;
ALLOCATE auxiliary CHANNEL aux2 DEVICE TYPE DISK;
ALLOCATE auxiliary CHANNEL aux3 DEVICE TYPE DISK;
ALLOCATE CHANNEL ch1 DEVICE TYPE DISK;
ALLOCATE CHANNEL ch2 DEVICE TYPE DISK;
ALLOCATE CHANNEL ch3 DEVICE TYPE DISK;
DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE NOFILENAMECHECK;
RELEASE CHANNEL ch1;
RELEASE CHANNEL ch2;
RELEASE CHANNEL ch3;
RELEASE CHANNEL aux1;
RELEASE CHANNEL aux2;
RELEASE CHANNEL aux3;
}

Lanzar RMAN de duplicado con la siguiente sintaxis:

rman auxiliary 'sys@<STANDBY_UNIQUE_NAME>' target 'sys@<PRIMARY_UNIQUE_NAME>' @duplicate_from_active_script.


rman log=duplicate_from_active_script_$(date +%Y%m%d_%H:%M).log

-- Ejemplo:
rman auxiliary 'sys@axprecm4' target 'sys@axprecm2' @duplicate_from_active_script.rman
log=duplicate_from_active_script_$(date +%Y%m%d_%H:%M).log

Revisar log generado por si hubiera errores, si todo ha ido correctamente la instancia estará montada:

SQL> set head off


SQL> select * from v$instance;

1 axprecm4
axpreoracm4.central.inditex.grp
12.1.0.2.0 10-AUG-21 MOUNTED NO 1 STARTED
ALLOWED NO ACTIVE PRIMARY_INSTANCE NORMAL NO 0
REGULAR EE
Asegurar que el UNDO, TEMP y demás sigan la distribución esperada:

show parameter spfile


select name from v$controlfile;
select member from v$logfile;
select name from v$datafile;
select name from v$tempfile;
select INSTANCE_NAME,HOST_NAME,STATUS,DATABASE_STATUS,ARCHIVER from v$instance; --> Modo archiver = STARTED
select * from v$standby_log;

Nota: RMAN no restaura datafiles de tablespaces de tipo temporary, por lo que cuando la instancia se convierta en PRIMARY y pase a OPEN
por primera vez se recreará el tempfile durante el arranque. Si no, será necesario recrearlo la primera vez.

SQL> select name from v$tempfile;


+DGDATA01/AXPRECM4/DATAFILE/temp01.dbf

ASMCMD> ls +DGDATA01/AXPRECM4/DATAFILE/temp01.dbf
ASMCMD-8002: entry 'temp01.dbf' does not exist in directory '+DGDATA01/AXPRECM4/DATAFILE/'

Añadir en el oratab la nueva instancia en el nodo standby

$ vi /etc/oratab
axprecm4:/opt/oracle/product/12c:Y

Añadir a CRS y asegurar arranque:


srvctl add database -db <NOMBRE_DB> -instance <NOMBRE_DB> -o <ORACLE_HOME> -diskgroup "<DISKGROUPS>,<...>" -
role PHYSICAL_STANDBY -startoption mount

-- Ejemplo:
[oracle@axpreoracm4 ~]$ srvctl add database -db axprecm4 -instance axprecm4 -o /opt/oracle/product/12c -
diskgroup "DGDATA01,DGRECO01" -role PHYSICAL_STANDBY -startoption mount

[oracle@axpreoracm4 ~]$ crsctl status res -t


--------------------------------------------------------------------------------
Name Target State Server State details
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.DGDATA01.dg
ONLINE ONLINE axpreoracm4 STABLE
ora.DGRECO01.dg
ONLINE ONLINE axpreoracm4 STABLE
ora.LISTENER_AXPRECM4.lsnr
ONLINE ONLINE axpreoracm4 STABLE
ora.asm
ONLINE ONLINE axpreoracm4 Started,STABLE
ora.ons
OFFLINE OFFLINE axpreoracm4 STABLE
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.axprecm4.db
1 ONLINE INTERMEDIATE axpreoracm4 Mounted (Closed),HOM
E=/opt/oracle/produc
t/12c,STABLE
ora.cssd
1 ONLINE ONLINE axpreoracm4 STABLE
ora.diskmon
1 OFFLINE OFFLINE STABLE
ora.evmd
1 ONLINE ONLINE axpreoracm4 STABLE

[oracle@axpreoracm4 ~]$ crsctl config has


CRS-4621: Oracle High Availability Services autostart is disabled.
[oracle@axpreoracm4 ~]$ crsctl enable has
CRS-4622: Oracle High Availability Services autostart is enabled.
[oracle@axpreoracm4 ~]$ crsctl config has
CRS-4622: Oracle High Availability Services autostart is enabled.

En caso de que la release de Grid y RDBMS sean distintas ejecutar el comando 'srvctl' en el entorno del ORACLE_HOME de la base de datos.

Configurar parámetros de instancia para ambas


Confirmar que están en modo archivado:

SQL> SELECT log_mode FROM v$database;

LOG_MODE
------------
ARCHIVELOG
Obtener valores actuales de los parámetros que vamos a modificar:

set heading off


select name, value from v$parameter where name in
('log_archive_config','log_archive_dest_2','log_archive_dest_state_2','fal_client','fal_server','standby_file_ma
nagement');

log_archive_dest_2

log_archive_dest_state_2
enable

fal_client

fal_server

log_archive_config

standby_file_management
MANUAL

Configurar los siguientes parámetros de acuerdo a estos valores en ambas, para la que ahora es STBY configuramos los valores que debería tener
cuando se convierta en PRIMARY :

alter system set LOG_ARCHIVE_CONFIG='DG_CONFIG=(<PRIMARY>,<STANDBY>)' scope=BOTH; -- Conf para broker

alter system set FAL_CLIENT=<PRIMARY> scope=BOTH; -- BD que recibe los archivelog

alter system set FAL_SERVER=<STANDBY> scope=BOTH; -- BD que envia los archivelog

alter system set STANDBY_FILE_MANAGEMENT='AUTO' scope=BOTH; -- Replica las acciones sobre los datafiles en SO
(creación, modificación, borrado ...)

alter system set LOG_ARCHIVE_DEST_2='service="<STANDBY>", ASYNC NOAFFIRM delay=0 optional compression=disable


max_failure=0 max_connections=1 reopen=300 db_unique_name="<STANDBY>" net_timeout=30, valid_for=(online_logfile,
all_roles)' scope=BOTH; -- Configuración del envio de los archivelogs

alter system set LOG_ARCHIVE_DEST_STATE_2='ENABLE' scope=BOTH; -- Activar el envio

* Nota, para 12c y anteriores sustituir estas dos últimas lineas por:

alter system set LOG_ARCHIVE_DEST_2='SERVICE="<STANDBY>" ASYNC NOAFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)


DB_UNIQUE_NAME=<STANDBY>' scope=BOTH;

alter system set LOG_ARCHIVE_DEST_STATE_2='ENABLE' scope=BOTH;

Ejemplo:
-- Primary
alter system set LOG_ARCHIVE_CONFIG='DG_CONFIG=(AXPRECM2,AXPRECM4)' scope=BOTH;
alter system set FAL_CLIENT=AXPRECM2 scope=BOTH;
alter system set FAL_SERVER=AXPRECM4 scope=BOTH;
alter system set STANDBY_FILE_MANAGEMENT='AUTO' scope=BOTH;
alter system set LOG_ARCHIVE_DEST_2='SERVICE=AXPRECM4 NOAFFIRM ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
DB_UNIQUE_NAME=AXPRECM4' scope=BOTH;
alter system set LOG_ARCHIVE_DEST_STATE_2='ENABLE' scope=BOTH;

-- Standby
alter system set LOG_ARCHIVE_CONFIG='DG_CONFIG=(AXPRECM2,AXPRECM4)' scope=BOTH;
alter system set FAL_CLIENT=AXPRECM4 scope=BOTH;
alter system set FAL_SERVER=AXPRECM2 scope=BOTH;
alter system set STANDBY_FILE_MANAGEMENT='AUTO' scope=BOTH;
alter system set LOG_ARCHIVE_DEST_2='SERVICE=AXPRECM2 NOAFFIRM ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
DB_UNIQUE_NAME=AXPRECM2' scope=BOTH;
alter system set LOG_ARCHIVE_DEST_STATE_2='ENABLE' scope=BOTH;

Verificar:

set heading off


select name, value from v$parameter where name in
('log_archive_config','log_archive_dest_2','log_archive_dest_state_2','fal_client','fal_server','standby_file_ma
nagement');

log_archive_dest_2
SERVICE=AXPRECM4 NOAFFIRM ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQ
UE_NAME=AXPRECM4

log_archive_dest_state_2
ENABLE

fal_client
AXPRECM2

fal_server
AXPRECM4

log_archive_config
DG_CONFIG=(AXPRECM2,AXPRECM4)

standby_file_management
AUTO

Iniciar replicación
Arrancamos la replicación en la standby:
SQL> select database_role, switchover_status from v$database;

DATABASE_ROLE SWITCHOVER_STATUS
---------------- --------------------
PHYSICAL STANDBY RECOVERY NEEDED

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;

Database altered.

SQL> select database_role, switchover_status from v$database;

DATABASE_ROLE SWITCHOVER_STATUS
---------------- --------------------
PHYSICAL STANDBY NOT ALLOWED

Verificar correcto estado en la primary:

ALTER SYSTEM ARCHIVE LOG CURRENT;

set linesize 250


col "DESTINATION (DB_UNIQUE_NAME)" format a40
col "ERROR" format a40
SELECT DATABASE_ROLE, SWITCHOVER_STATUS , open_mode FROM V$DATABASE;
prompt ** Comprobar que esta lista para un posible switchover (TO STANDBY) y que el destino esta abierto (READ
WRITE)

SELECT DEST_ID, DESTINATION||' ('||DB_UNIQUE_NAME||')' as "DESTINATION (DB_UNIQUE_NAME)", STATUS, ERROR FROM


V$ARCHIVE_DEST WHERE DEST_ID in (2,3,4);
prompt ** Comprobar que todos los destinos configurados están VALID

select al.thread#, al.last_rec "Last Recd", la.last_app "Last Applied", al.last_rec - la.last_app "Diff"
from
(select thread#, max(sequence#) last_rec
from v$archived_log
where resetlogs_id = (select max(resetlogs_id) from v$archived_log)
group by thread#) al,
(select thread#, max(sequence#) last_app
from v$archived_log
where resetlogs_id = (select max(resetlogs_id) from v$archived_log)
and applied='YES' and registrar in ('RFS','LGWR','ARCH')
group by thread#) la
where al.thread#=la.thread#
and al.thread# != 0
order by al.thread#;
prompt ** Comprobar que la diferencia entre recibido y aplicado es 0 ó 1

Ejemplo de resultado:
DATABASE_ROLE SWITCHOVER_STATUS OPEN_MODE
---------------- -------------------- --------------------
PRIMARY TO STANDBY READ WRITE
** Comprobar que esta lista para un posible switchover (TO STANDBY) y que el destino esta abierto (READ WRITE)

DEST_ID DESTINATION (DB_UNIQUE_NAME) STATUS ERROR


---------- ---------------------------------------- --------- ----------------------------------------
2 AXPRECM4 (AXPRECM4) VALID
3 (NONE) INACTIVE
4 (NONE) INACTIVE
** Comprobar que todos los destinos configurados están VALID

THREAD# Last Recd Last Applied Diff


---------- ---------- ------------ ----------
1 185584 185583 1
** Comprobar que la diferencia entre recibido y aplicado es 0 ó 1

Configurar primary para poder funcionar como standby


Para entornos heterogeneos añadir los parámetros de conversión de rutas para la dirección inversa en la base de datos primary:

alter system set db_file_name_convert='/<dir-origen-dbf>/','+<DG-dest>/<unique-name>/DATAFILE/', '/<dir-origen-


dbf>/','+<DG-dest>/<unique-name>/TEMPFILE/', '/<dir-origen-dbf>/','+<DG-dest>/<unique-name>/CONTROLFILE/', ...
scope=spfile;
alter system set log_file_name_convert='/<dir-origen>/','+<DG-dest>/<unique-name>/ONLINELOG/', ... scope=spfile;

Obtener directorios para db_file_name_convert:

col tipo format a12


col dir format a60
break on TIPO
select distinct 'CONTROLFILE' TIPO, SUBSTR(name, 0, INSTR(name,'/',-1)-1)||'/' DIR from v$controlfile
union select distinct 'DATAFILE' TIPO, SUBSTR(name, 0, INSTR(name,'/',-1)-1)||'/' DIR from v$datafile
union select distinct 'TEMPFILE' TIPO, SUBSTR(name, 0, INSTR(name,'/',-1)-1)||'/' DIR from v$tempfile order by
1, 2;

-- En la primary :

TIPO DIR
------------ ------------------------------------------------------------
CONTROLFILE /oracle/oradata/axprecm2/sys/
/oracle/orasystem/axprecm2/
DATAFILE /oracle/oradata/axprecm2/sys/
/oracle/oradata/axprecm2/ucontrolm/
/oracle/oradata/axprecm2/uemuser/
TEMPFILE /oracle/oradata/axprecm2/sys/

-- En la secondary :

TIPO DIR
------------ ------------------------------------------------------------
CONTROLFILE +DGDATA01/AXPRECM4/CONTROLFILE/
+DGRECO01/AXPRECM4/CONTROLFILE/
DATAFILE +DGDATA01/AXPRECM4/DATAFILE/
TEMPFILE +DGDATA01/AXPRECM4/DATAFILE/

Obtener directorios para log_file_name_convert:


col tipo format a12
col dir format a60
break on TIPO
select distinct 'ONLINELOG' TIPO, SUBSTR(member, 0, INSTR(member,'/',-1)-1)||'/' DIR from v$logfile order by 1,
2;

-- En la primary:

TIPO DIR
------------ ------------------------------------------------------------
ONLINELOG /oracle/logs/axprecm2/
/oracle/orasystem/axprecm2/sys/

-- En la secondary:

TIPO DIR
------------ ------------------------------------------------------------
ONLINELOG +DGDATA01/AXPRECM4/ONLINELOG/
+DGRECO01/AXPRECM4/ONLINELOG/

Ejemplo:

alter system set DB_FILE_NAME_CONVERT='+DGDATA01/AXPRECM4/DATAFILE/','/oracle/oradata/axprecm2/sys/','+DGDATA01


/AXPRECM4/DATAFILE/','/oracle/oradata/axprecm2/ucontrolm/','+DGDATA01/AXPRECM4/DATAFILE/','/oracle/oradata
/axprecm2/uemuser/','+DGDATA01/AXPRECM4/TEMPFILE/','/oracle/oradata/axprecm2/sys/','+DGDATA01/AXPRECM4
/CONTROLFILE/','/oracle/oradata/axprecm2/sys/','+DGRECO01/AXPRECM4/CONTROLFILE/','/oracle/orasystem/axprecm2/'
scope=spfile;
alter system set LOG_FILE_NAME_CONVERT='+DGRECO01/AXPRECM4/ONLINELOG/','/oracle/logs/axprecm2/','+DGDATA01
/AXPRECM4/ONLINELOG/','/oracle/orasystem/axprecm2/sys/' scope=spfile;

Crear un servicio común


Para facilitar la reconexión de las aplicaciones tras un swichover independientemente de que nodo sea el PRIMARY, crearemos un nuevo servicio de red.
Ejemplo:

-- Conslutar servicios actuales


alter session set nls_date_format='DD/MM/YYYY HH24:MI';
col NAME format a30
col NETWORK_NAME format a30
col PDB format a30
set linesize 120
select NAME,NETWORK_NAME,CREATION_DATE,PDB,CON_ID FROM cdb_services;

NAME NETWORK_NAME CREATION_DATE


PDB CON_ID
------------------------------ ------------------------------ ---------------- ------------------------------
----------
SYS$BACKGROUND 22/03/2017 18:
42 0
SYS$USERS 22/03/2017 18:
42 0
axdscm2XDB axdscm2XDB 22/03/2017 18:
42 0
axdscm2.central.inditex.grp axdscm2.central.inditex.grp 22/03/2017 18:
42 0
axdscm2_DGB axdscm2_DGB 14/10/2021 12:
26 0

-- Crear nuevo de nombre neutro con los siguientes parámertros en la base de datos PRIMARY
BEGIN
DBMS_SERVICE.CREATE_SERVICE(
service_name => 'axdscm.central.inditex.grp',
network_name => 'axdscm.central.inditex.grp',
aq_ha_notifications => TRUE,
failover_method => 'BASIC',
failover_type => 'SELECT',
failover_retries => 180,
failover_delay => 1
);
END;
/

-- Verificar que se ha creado


NAME NETWORK_NAME CREATION_DATE
PDB CON_ID
------------------------------ ------------------------------ ---------------- ------------------------------
----------
SYS$BACKGROUND 22/03/2017 18:
42 0
SYS$USERS 22/03/2017 18:
42 0
axdscm2XDB axdscm2XDB 22/03/2017 18:
42 0
axdscm2.central.inditex.grp axdscm2.central.inditex.grp 22/03/2017 18:
42 0
axdscm2_DGB axdscm2_DGB 14/10/2021 12:
26 0
axdscm.central.inditex.grp axdscm.central.inditex.grp 20/10/2021 17:
54 0

-- Activarlo y comprobar en el listener que aparece y está ready


BEGIN
DBMS_SERVICE.start_service(
service_name => 'axdscm.central.inditex.grp'
);
END;
/

Services Summary...
Service "axdscm.central.inditex.grp" has 1 instance(s).
Instance "axdscm2", status READY, has 1 handler(s) for this service...
Service "axdscm2.central.inditex.grp" has 1 instance(s).
Instance "axdscm2", status READY, has 1 handler(s) for this service...
Service "axdscm2XDB.central.inditex.grp" has 1 instance(s).
Instance "axdscm2", status READY, has 1 handler(s) for this service...
Service "axdscm2_DGB.central.inditex.grp" has 1 instance(s).
Instance "axdscm2", status READY, has 1 handler(s) for this service...

Crear trigger, en caso de que el servicio no sea gestionado por Grid, para poder levantar el servicio adecuado al rol de cada instancia.

Si la STANDBY se va a abrir además como READ ONLY crear un servicio adicional "xxx_ro" y descomentarlo dichas líneas en el trigger.
CREATE OR REPLACE TRIGGER SYS.START_SRVC_ROLE after startup on database
declare
role varchar2(30);
begin
select database_role into role from v$database;
IF role = 'PRIMARY' THEN
DBMS_SERVICE.START_SERVICE('axdscm.central.inditex.grp');
--DBMS_SERVICE.STOP_SERVICE('axdscm_ro.central.inditex.grp');
ELSE
DBMS_SERVICE.STOP_SERVICE('axdscm.central.inditex.grp');
--DBMS_SERVICE.START_SERVICE('axdscm_ro.central.inditex.grp');
END IF;
END;
/

La nueva cadena de conexión a configurar en el cliente será de la siguiente forma:

AXDSCM =
(DESCRIPTION =
(ADDRESS_LIST =
(FAILOVER = ON)
(LOAD_BALANCE = OFF)
(ADDRESS=(PROTOCOL=TCP)(HOST=axdesoracm1.central.inditex.grp)(PORT=11521))
(ADDRESS=(PROTOCOL=TCP)(HOST=axdesoracm2.central.inditex.grp)(PORT=11521))
)
(CONNECT_DATA =
(SERVICE_NAME = axdscm.central.inditex.grp)
)
)

Configurar Broker (DGMGRL)


La consola broker de DGMGRL es una potente ayuda para gestionar la configuración del DataGuard.

Para evitar el error "ORA-16698: LOG_ARCHIVE_DEST_n parámeter set for object to be added" durante la configuración es necesario poner a null el
LOG_ARCHIVE_DEST_2 previamente en ambos nodos de manera temporal:

SHOW PARAMETER LOG_ARCHIVE_DEST_2;

ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='' SCOPE=MEMORY;

Arrancar el broker en ambos nodos:

##Comprobar parámetros de configuración del broker


show parameter dg_broker_config_file --> Tiene que tener configurados los ficheros
show parameter STANDBY_FILE_MANAGEMENT --> Tiene que ser AUTO
show parameter dg_broker_start --> Estará a FALSE la primera vez

##Activar broker en la PRIMARIA y STANDBY


alter system set dg_broker_start=TRUE SCOPE=BOTH SID='*';

##Proceso asociado al broker: DMON


ps -ef|grep dmon
oracle 128751 1 0 12:44 ? 00:00:00 ora_dmon_axprecm4

Configurar DataGuard en el primary:


##Primaria
dmgrl /
CREATE CONFIGURATION DGConfig AS PRIMARY DATABASE IS <db_unique_name PRIM> CONNECT IDENTIFIER IS <fal_client
PRIM>;
ADD DATABASE <db_unique_name STBY> AS CONNECT IDENTIFIER IS <fal_server STBY> MAINTAINED AS PHYSICAL;
ENABLE CONFIGURATION;
show configuration

##Ejemplo
DGMGRL> CREATE CONFIGURATION DGConfig AS PRIMARY DATABASE IS axprecm2 CONNECT IDENTIFIER IS axprecm2;
Configuration "dgconfig" created with primary database "axprecm2"

DGMGRL> ADD DATABASE axprecm4 AS CONNECT IDENTIFIER IS axprecm4 MAINTAINED AS PHYSICAL;


Database "axprecm4" added

DGMGRL> ENABLE CONFIGURATION;


Enabled.

DGMGRL> show configuration

Configuration - dgconfig

Protection Mode: MaxPerformance


Members:
axprecm2 - Primary database
axprecm4 - Physical standby database

Fast-Start Failover: DISABLED

Configuration Status:
SUCCESS (status updated 59 seconds ago)

Volver a configurar el parámetro LOG_ARCHIVE_DEST_2 con el valor inicial en ambos nodos si se ha reseteado.

Para evitar errores durante el switchover y que haya que levantar la nueva STBY a mano, revisar la configuración de la propiedad "staticconnectidentifier",
adaptando el servicio (tiene que ser uno GLOBAL)

###Ejemplo de error durante el switchover

DGMGRL> switchover to axinorcs3


Performing switchover NOW, please wait...
Operation requires a connection to instance "axinorcs3" on database "axinorcs3"
Connecting to instance "axinorcs3"...
Connected.
New primary database "axinorcs3" is opening...
Operation requires startup of instance "axinorcs2" on database "axinorcs2"
Starting instance "axinorcs2"...
Unable to connect to database
ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
Failed.
Warning: You are no longer connected to ORACLE.

Please complete the following steps to finish switchover:


start up and mount instance "axinorcs2" of database "axinorcs2"

Consultar servicio que usa DataGuard para conectarse a las instancias:


$ dmgrl /
DGMGRL> show database axprecm2 staticconnectidentifier;
StaticConnectIdentifier = '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=axpreoracm2.central.inditex.grp)
(PORT=11521))(CONNECT_DATA=(SERVICE_NAME=axprecm2_DGMGRL.central.inditex.grp)(INSTANCE_NAME=axprecm2)
(SERVER=DEDICATED)))'

DGMGRL> show database axprecm4 staticconnectidentifier;


StaticConnectIdentifier = '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=axpreoracm4.central.inditex.grp)
(PORT=11521))(CONNECT_DATA=(SERVICE_NAME=axprecm4_DGMGRL.central.inditex.grp)(INSTANCE_NAME=axprecm4)
(SERVER=DEDICATED)))'

Ni "SERVICE_NAME=axprecm2_DGMGRL.central.inditex.grp" ni "SERVICE_NAME=axprecm4_DGMGRL.central.inditex.grp" no existen en los listener.


Es necesario crearlos como servicios estáticos en el listener.ora para que pueda conectarse aun estándo la instancia detenida (durante el reinicio del
switchover).

Ejemplo de entrada en el listener.ora, GLOBAL_DBNAME es el nombre de servicio que tiene configurado DataGuard y SID_NAME la instancia local.
Editar el correspondiente en cada nodo:

SID_LIST_LISTENER_AXPRECM4 =
(SID_LIST=
(SID_DESC=
(GLOBAL_DBNAME=axprecm4_DGMGRL.central.inditex.grp)
(ORACLE_HOME=/opt/oracle/product/12c)
(SID_NAME=axprecm4)
)
)

Y recargar la nueva configuración en cada nodo:

[oracle@axpreoracm4 ~]$ lsnrctl reload LISTENER_AXPRECM4


The command completed successfully

[oracle@axpreoracm4 ~]$ lsnrctl status LISTENER_AXPRECM4


[...]
Service "axprecm4_DGMGRL.central.inditex.grp" has 1 instance(s).
Instance "axprecm4", status UNKNOWN, has 1 handler(s) for this service...

Mover archivos de configuración del Broker Filesystem hacia +ASM.


#- Mover archivos de configuración del Broker Filesystem hacia +ASM.
#- Primaria, se debe hacer lo mismo en la standby.

CMD> sudo su - oracle


CMD> @axprecm2
CMD> sqlplus "/as sysdba"

SQL> show parameters broker

NAME TYPE VALUE


------------------------------------ ----------- ------------------------------------------------------------
dg_broker_config_file1 string /opt/oracle/product/12.2/db/dbs/dr1axprecm2.dat
dg_broker_config_file2 string /opt/oracle/product/12.2/db/dbs/dr2axprecm2.dat
dg_broker_start boolean TRUE

CMD> dgmgrl /

DGMGRL> disable configuration;


Disabled.

CMD> sqlplus "/as sysdba"

SQL> alter system set dg_broker_start = FALSE scope=both;

System altered.

SQL> alter system set dg_broker_config_file1='+DGDATA01/AXPRECM2/dr1axprecm2.dat' scope=both;

System altered.

SQL> alter system set dg_broker_config_file2='+DGREC01/AXPRECM2/dr2axprecm2.dat' scope=both;

System altered.

CMD> sudo su - oracle

CMD> @ogi

CMD> asmcmd

ASMCMD> cp /opt/oracle/product/12.2/db/dbs/dr1axprecm2.dat +DGDATA01/AXPRECM2/dr1axprecm2.dat


copying /opt/oracle/product/12.2/db/dbs/dr1axprecm2.dat -> +DGDATA01/AXPRECM2/dr1axprecm2.dat
ASMCMD>
ASMCMD> cp /opt/oracle/product/12.2/db/dbs/dr2axprecm2.dat +DGREC01/AXPRECM2/dr2axprecm2.dat
copying /opt/oracle/product/12.2/db/dbs/dr2axprecm2.dat -> +DGREC01/AXPRECM2/dr2axprecm2.dat
ASMCMD>

CMD> @axprecm2

CMD> sqlplus "/as sysdba"

SQL> alter system set dg_broker_start=TRUE scope=both;

System altered.

CMD> dgmgrl /

DGMGRL> enable configuration;


Enabled.

DGMGRL> show configuration;


Forzar archivelog cada 30 minutos
En caso de baja actividad e bbdd añadimos este parámetro en cada instancia para forzar un switch logfile cada 30 minutos y que no cree falta alertas de
monitorización.

SQL> alter system set archive_lag_target=1800 scope=both;


System altered.

Configurar backup y mantenimiento de archivelogs aplicados


Configurar política de retención de archivelogs.

En primary:

$ rman target /
CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON ALL STANDBY BACKED UP 1 TIMES TO 'SBT_TAPE';

En standby:

$ rman target /
CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON ALL STANDBY;

Copiar scripts de backup del home de oracle al nuevo nodo:

Scripts de backup en el home de oracle: /home/oracle/NB_oracle_*sh

-rwxr-xr-x. 1 oracle oinstall 11483 Jul 24 2018 /home/oracle/NB_oracle_archives.sh


-rwxr-xr-x. 1 oracle oinstall 11948 Jul 24 2018 /home/oracle/NB_oracle_level0.sh

Adaptar las siguientes líneas al nuevo entorno:

ORACLE_SID=axprecm4
NB_ORA_CLIENT=axpreoracm4.central.inditex.grp
ORACLE_HOME=/opt/oracle/product/12c
$RMAN target $TARGET_CONNECT_STR catalog ******/******@****** msglog $RMAN_LOG_FILE append << EOF

Añadir script de limpieza de archivelogs ya aplicados 'delete_arc_applied_rman.sh' y programar en el crontab en ambos nodos (el script solo se
ejecutará en el que sea el standby). Revisar si es necesario en bases de datos 18c o superiores ya que se supone que los archives de la standby se
limpian automáticamente tras el backup y borrado de la primary.

Ejemplo crontab de oracle:

## Borrar los arcs aplicados en la stby


5 */6 * * * /oracle/jobs/delete_arc_applied_rman.sh >/dev/null 2>&1

Script 'delete_arc_applied_rman.sh':
#!/bin/bash
#---------------------------------------
# delete_arc_applied_rman.sh
# Limpiar de base de datos standby
# los archivelogs aplicados.
#---------------------------------------
# 12/08/2021 javierccha@ext.inditex.com
# v1.0 Inicial
# 21/10/2021 javierccha@ext.inditex.com
# v1.1 Comprobación STBY
#---------------------------------------

#--- Setup
RETENCION=12 # RETENCION en horas de archives aplicados a conservar
export ORACLE_BASE=/opt/oracle
export ORACLE_HOME=/opt/oracle/product/12.1.0
export ORACLE_SID=axdscm2
export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH

#--- Entorno y mantenimiento


DIR="$(dirname $0)/logs"
if [ ! -d "$DIR" ]; then mkdir "$DIR"; fi
LOG="${DIR}/$(basename $0|cut -d. -f1).$(date +%a).log"
if [ $(find $LOG -mtime +1) ]; then rm -f $LOG;fi
RC=0

#--- Ejecucion
(
echo
echo "===[$(date +"%d/%m/%Y %H:%M")]========================================================="
echo
DGR=$(timeout 60 sqlplus -s / as sysdba << EOF
SET FEEDBACK OFF
SET HEADING OFF
SELECT DATABASE_ROLE FROM V\$DATABASE;
EOF
)
if [ $? -eq 124 ]; then
echo " ERROR: TIMEOUT ejecutando SQL"
RC=100
else
if [ "$(echo $DGR|tr -d '\n')" != "PHYSICAL STANDBY" ]; then
echo " ERROR: La base de datos no está en modo STANDBY"
RC=200
else
echo " Borrando los archivelog aplicados en la STBY y mayores a $RETENCION horas:"
echo
${ORACLE_HOME}/bin/rman <<EOF
connect target /
delete noprompt archivelog all completed before 'sysdate-($RETENCION/24)' device type disk;
EOF
RC=$?
fi
fi
echo
if [ $RC -eq 0 ]; then
echo -e "===[$(date +"%d/%m/%Y %H:%M")]===============================================\e[92m[all OK]\e[0m=="
else
echo -e "===[$(date +"%d/%m/%Y %H:%M")]===========================================\e[91m[ERROR RC=$RC]\e[0m=="
fi
echo
exit $RC
) 2>&1|tee $LOG
exit ${PIPESTATUS[0]}

También podría gustarte