Skip to main content

Command Palette

Search for a command to run...

[19c] AWR en Active Data Guard Standby Database

Updated
•4 min read•View as Markdown
[19c] AWR en Active Data Guard Standby Database
D

Ingeniero informático, Oracle ACE, DBA y Arquitecto OCI, con más de 15 años de experiencia en plataformas Oracle. Certificado en OCI Certified Architect Professional y OCI Migration and Integration Certified Professional.

En el artículo de hoy vamos a ver como podemos generar AWR en una standby, algo muy sencillo de configurar y muy útil para ver cómo respira.

Así que sin más, vamos a ello.

Todo los pasos que tenemos que realizar, los vamos hacer desde la primary y a nivel de CDB$Root, no a nivel de PDB. Hay algún paso, que habría que conectarse a la standby, pero ese paso lo haremos vía DBLink desde la primary.

SYS$UMF

El primer paso que debemos hacer es desbloquear este usuario**,** por defecto suele venir bloqueado. ¿Porqué es importante este paso? Porque ese usuario es el encargado de administrar RMF (Remote Management Framework).

SQL> alter user sys$umf identified by oracle account unlock;
SQL>
Select username, account_Status 
  From dba_users 
 Where username=upper('sys$umf');

USERNAME   ACCOUNT_STATUS
---------- --------------------------------
SYS$UMF    OPEN

Antes de crearlos, vamos a modificar el tnsnames porque vamos a ir por local naming.

Incluimos las cadenas de ambas cdb$root tanto en la primary como la standby.

SQL> ! tail -10 $ORACLE_HOME/network/admin/tnsnames.ora

PRIMARY =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = XXX.XXX.XXX)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XXXXXX.XXXXX.XXXXXX)
    )
  )
STANDBY     =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = XXX.XXX.XXX)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XXXXXX.XXXXX.XXXXXX)
    )
  )

Ahora sí, definimos los DBLinks .

SQL> create database link DB_PRIMARY CONNECT TO sys$umf IDENTIFIED BY "XXXX" using 'PRIMARY';

Database link created.

SQL> create database link DB_STANDBY CONNECT TO sys$umf IDENTIFIED BY "XXXX" using 'STANDBY';

Database link created.

SQL> 
Select owner, username,db_link, host 
  From all_db_links 
 Where instr(host,'(')=0 AND username = 'SYS$UMF';

OWNER      USERNAME   DB_LINK        HOST
---------- ---------- ------------- ----------
SYS        SYS$UMF    DB_PRIMARY     PRIMARY
SYS        SYS$UMF    DB_STANDBY     STANDBY

Verificamos que funcionan:

SQL> select database_role from v$database@DB_STANDBY;

DATABASE_ROLE
----------------------------------------------------------------
PHYSICAL STANDBY

SQL> select database_role from v$database@DB_PRIMARY;

DATABASE_ROLE
----------------------------------------------------------------
PRIMARY

Configuración RMF

Antes de entrar a configurar RMF, debemos setear el siguiente parámetro oculto "_umf_remote_enabled" a TRUE.

SQL> alter system set "_umf_remote_enabled"=TRUE scope=BOTH;

SQL>
SELECT p.ksppinm  AS name,
       v.ksppstvl AS value,
       v.ksppstdf AS is_default,
       v.ksppstvf AS is_modified
FROM sys.x$ksppi p
JOIN sys.x$ksppcv v
  ON v.indx = p.indx
WHERE p.ksppinm In ('_umf_remote_enabled');


NAME			          VALUE	    IS_DEFAULT  IS_MODIFIED 
----------------------   --------   ---------- -------------- 
_umf_remote_enabled	       FALSE	  TRUE		      0   

Una vez seteado, configuramos ambos nodos que queremos registrar con la topología de RMF. Este sería el único paso que habría que ejecutar en la standby, pero en nuestro caso, lo haremos vía DBLink.

Begin
 dbms_umf.configure_node(node_name=>'UMF_PRIMARY');
  dbms_umf.configure_node@DB_STANDBY(node_name=>'UMF_STANDBY',DBLINK_TO_TARGET=>'DB_PRIMARY');
End;
/

Definimos la topología:


exec DBMS_UMF.create_topology (topology_name=>'TOPOLOGY_SHADOW');


SQL> select * from dba_umf_topology;

TOPOLOGY_NAME	      TARGET_ID TOPOLOGY_VERSION TOPOLOGY_STATE
-------------------- ---------- ---------------- ----------------
TOPOLOGY_SHADOW      4094168332 	           1  ACTIVE

Registramos el nodo con la topología definida en el punto anterior.


exec DBMS_UMF.register_node (
topology_name=>'TOPOLOGY_SHADOW', 
node_name=>'UMF_STANDBY', 
dblink_to_node=>'DB_STANDBY', 
dblink_from_node=>'DB_PRIMARY', 
as_source=>'FALSE',
as_candidate_target=>'FALSE');

SQL>  select * from dba_umf_registration;

TOPOLOGY_NAME	     NODE_NAME		     NODE_ID  NODE_TYPE AS_SOURCE	     AS_CANDIDATE_TARGET  STATE
-------------------- -------------------- ---------- ---------- -------------------- -------------------- --------------------------------------------------------------------------------
TOPOLOGY_SHADOW      UMF_PRIMARY	  4094168332	      0 FALSE		     FALSE		  OK
TOPOLOGY_SHADOW      UMF_STANDBY	  2902407351	      0 FALSE		     FALSE		  OK

Configuración AWR

Habilitamos AWR en nuestra standby.

exec DBMS_WORKLOAD_REPOSITORY.register_remote_database(node_name=>'UMF_STANDBY');

Generamos el primer snapshot de nuestra standby.

exec dbms_workload_repository.create_remote_snapshot(node_name=>'UMF_STANDBY');

Listo, en este punto tendremos activo la parte de AWR a nivel de standby, con la configuración por defecto ( cada hora snapshot y una retención de 8 días).

Dejo los pasos en caso que tengamos que deshabilitarlo de manera temporal, eliminarlo o incluso si lo tenemos activo y tenemos un switchover entre medias, que paso deberíamos ejecutar.

Desactivar

Desde nuestra primary, no desde la standby:

---Seteamos el parámetro _umf_remote_enabled a FALSE:
ALTER SYSTEM SET "_remote_awr_enabled" = FALSE SCOPE = BOTH SID = '*';

----> on DB_PRIMARY / desactivar
exec bms_workload_repository.modify_snapshot_settings(interval=>0, dbid => '&dbid_standby');

Eliminar

Desde nuestra primary, no desde la standby:

Begin
DBMS_WORKLOAD_REPOSITORY.unregister_remote_database(node_name=>'UMF_STANDBY',topology_name=>'TOPOLOGY_SHADOW',remote_check=>TRUE);
 DBMS_UMF.unregister_node (topology_name=>'TOPOLOGY_SHADOW', node_name=>'UMF_STANDBY');
 DBMS_UMF.drop_topology (topology_name=>'TOPOLOGY_SHADOW');
End;
/

drop database link DB_PRIMARY;
drop database link DB_STANDBY;

Switchover

Este paso habrá que realizarse desde la que es ahora nuestra primary.

exec DBMS_UMF.SWITCH_DESTINATION(topology_name => 'TOPOLOGY_SHADOW',force_switch => TRUE); 

Dejo todo en un único script por si queréis descargarlo.

awr_standby

Espero que os guste. ¡Nos vemos en el próximo artículo!