# [19c] AWR en Active Data Guard Standby Database

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
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
```

### Definir los DBLinks

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
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
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
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
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**.

```sql
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:

```sql

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.

```sql

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**.

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

Generamos el primer **snapshot** de nuestra **standby**.

```sql
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**:

```sql
---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**:

```sql
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**.

```sql
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](https://github.com/dbaenlasombra/OCI/blob/main/awr_standby.sql)

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