# Cómo ejecutar SQL Tuning Advisor desde un Standby en Oracle Active Data Guard desde OEM

En entornos Oracle con Active Data Guard, es posible ejecutar SQL Tuning Advisor desde la base standby y generar reportes de la primaria. Esto permite analizar SQL de alta carga sin afectar la producción.

---

## 1\. Preparar un Database Link

Para que la standby pueda consultar la primaria, necesitamos un database link privado:

1. Crear entradas TNS :
    

```plaintext
PDB_XXXXXX_PRI=
    (DESCRIPTION_LIST=
      (LOAD_BALANCE=off) (FAILOVER=on)
          (DESCRIPTION= (CONNECT_TIMEOUT=15)(TRANSPORT_CONNECT_TIMEOUT=3)(RETRY_COUNT=3)
             (ADDRESS_LIST= (LOAD_BALANCE=on)
                (ADDRESS=(PROTOCOL=TCP)(HOST=racscan-pri.xxxxx.xxx)(PORT=1521)))
                  (CONNECT_DATA=(SERVICE_NAME=mant.xxxxx.xxx)))
           (DESCRIPTION= (CONNECT_TIMEOUT=15)(TRANSPORT_CONNECT_TIMEOUT=3)(RETRY_COUNT=3)
                (ADDRESS_LIST= (LOAD_BALANCE=on)
                    (ADDRESS=(PROTOCOL=TCP)(HOST= racscan-stb.xxxxx.xxx)(PORT=1521)))
                         (CONNECT_DATA=(SERVICE_NAME=mant.xxxxx.xxx))))
```

2. Desbloquear el usuario SYS$UMF:
    

```plaintext
ALTER USER "SYS$UMF" IDENTIFIED BY sysumf ACCOUNT UNLOCK;
```

3. Crear el database link desde la primaria:
    

```plaintext
CREATE DATABASE LINK lnk_to_pri
CONNECT TO SYS$UMF IDENTIFIED BY "sysumf"
USING 'PDB_PRIMARY';
```

4. Verificar la conexión desde Standby:
    

```plaintext
SQL>  select * from dual@lnk_to_pri;

D
-
X
```

---

## 2\. Generar la tarea SQL Tuning

Desde OEM la tarea automática se llamará como:

SQL\_TUNING\_STDBY\_xxxx

* Pertenecen a SYSTEM.
    
* Desde la standby, se pueden consultar mediante DBMS\_SQLTUNE.
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1763405141652/a044688a-66a3-4696-b749-6c5112b634cc.png align="center")
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1763405156474/9cb8dcdc-3c90-4678-b0b0-ebb22c59a020.png align="center")
    

---

## 3\. Generar el reporte desde la standby

Podremos ver resultados desde OEM o consultar desde BBDD:

```plaintext
SET SERVEROUTPUT ON SIZE UNLIMITED

DECLARE
l_report CLOB;
BEGIN
l_report := DBMS_SQLTUNE.report_tuning_task(
task_name => 'SQL_TUNING_STDBY_xxxx,
type => 'TEXT',
level => 'TYPICAL',
section => 'ALL',
owner_name => 'SYSTEM'
);
DBMS_OUTPUT.put_line(l_report);
END;
/
```

* type =&gt; 'TEXT' devuelve un reporte legible en consola.
    
* section =&gt; 'ALL' incluye todo el detalle del tuning.
    
* owner\_name =&gt; 'SYSTEM' permite acceder a tareas de otro usuario.
    

---

## 4\. Guardar el reporte en un archivo

```plaintext
SPOOL sql_tuning_report.txt

DECLARE
l_report CLOB;
BEGIN
l_report := DBMS_SQLTUNE.report_tuning_task(
task_name => 'SQL_TUNING_STDBY_xxxx',
type => 'TEXT',
level => 'ALL',
section => 'ALL',
owner_name => 'SYSTEM'
);
DBMS_OUTPUT.put_line(l_report);
END;
/

SPOOL OFF
```

Esto genera un archivo sql\_tuning\_report.txt con todas las recomendaciones, índices sugeridos y sugerencias de reescritura.

---

## Beneficios de usar SQL Tuning en Standby

* Ejecutar tuning sin impactar la primaria
    
* Compatible con Active Data Guard
    
* Permite optimizaciones periódicas desde standby
    
* Acceso a recomendaciones completas incluso si la tarea fue ejecutada en la primaria
    

---

Nota: Siempre usar database links privados y privilegios mínimos necesarios (SYS$UMF).
