martes, 18 de febrero de 2020

Oracle Database 12.2: Reportes AWR a nivel PDB

Oracle Database 12.2: Reportes AWR a nivel PDB



Por Sebastián D’Alessandro
Publicado en Febrero 2018


Revisado por Lorenzo Mota


Introducción

Desde su aparición en Oracle Database 10g, Automatic Workload Repository (AWR) ha ido evolucionando constantemente con el correr de las versiones.
Oracle 12c introdujo un gran cambio en la arquitectura de la base de datos incorporando el concepto de “multitenant”.  En el primer release de 12c, los reportes de AWR solamente pueden ser generados a nivel “Container Database” (CDB). Esto nos impide, en cierta manera, poder analizar en profundidad el comportamiento de determinadas PDBs puntuales.
La versión 12.2 introduce una notable mejora en AWR,  la capacidad de poder correr snapshots  tanto a nivel CDB como de PDB cuando trabajamos en ambientes “multitenant”.
Esta nueva característica nos permite un diagnóstico más granular de problemas de performance focalizados en una PDB en particular, situación que resulta sumamente interesante y útil en soluciones DBaaS donde se espera que el rol de DBA tienda a ser el de un “pDBA” ( Pluggable Database Administrator), es decir un DBA responsable de la administración de una o varias PDBs en particular, pero que a nivel físico comparten recursos con otras en el mismo CDB.
Los reportes AWR a nivel PDB, están basados en la recolección de estadísticas que resultan útiles para evaluar el desempeño de una “Pluggable Database”, estos datos son recopilados siempre y cuando dicha PDB esté abierta en la base de datos “Container” (CDB) al momento de la toma del snapshot.
La información de AWR a nivel CDB es almacenada en el tablespace SYSAUX del CDB$ROOT y los snapshots de cada PDB en su correspondiente tablespace SYSAUX.
Podríamos decir entonces, que a partir de ahora tenemos en “multitenant” dos niveles de visualización e información en los reportes de AWR, uno a nivel general de “Container”  y otro particular para cada PDB.
Los snapshots a nivel CDB incluyen estadísticas correspondientes al CDB, adicionando además información de todas las PDBs que éste contiene, por ejemplo: “ASH”, “SQL statistics”, “file statistics”, etc.
A nivel PDB, los snapshots de AWR recopilan estadísticas de la “Pluggable Database” y suman también algunas estadísticas globales que pueden resultar útiles para el diagnóstico de problemas puntuales en esa base de datos. El administrador de la PDB puede realizar determinadas operaciones de gestión a ese nivel, por ejemplo configurar el periodo de retención, agendar y depurar snapshots, realizar capturas manuales, etc.
Algunas tareas de administración de snapshots a nivel CDB o PDB, como por ejemplo creación y depuración,  pueden ser realizadas tanto de forma “manual” como  “automática”.
En un ambiente “multitenant”, podemos entonces crear manualmente snapshots en cualquiera de los dos niveles según sea necesario.
En este artículo, vamos a ejemplificar operaciones de captura de snapshots y generación de reportes utilizando un “Container Database” llamado CDB12CR2 el cual contiene dentro una PDB con nombre PDB12CR2.



La siguiente salida muestra la estructura de la misma con sus correspondientes IDs:
SQL>  select name, con_id, dbid, con_uid, guid from v$containers 
      order by con_id;
  
  NAME         CON_ID       DBID     CON_UID GUID
  --------  ---------- ---------- ---------- --------------------------------
  CDB$ROOT          1  2233049298          1 4700A987085A3DFAE05387E5E50A8C7B
  PDB$SEED          2   806654536  806654536 4B07A0A8F95D27C7E053B800A8C0A206
  PDB12CR2          3  2086124034 2086124034 4B07B077947A2E0AE053B800A8C0F1F0



Por defecto, los snapshots  automáticos de AWR sólo están configurados para correr a nivel CDB. Oracle recomienda que en los PDBs sean ejecutados de forma manual, y sólo en los intervalos de tiempo donde sea necesario realizar el análisis (ver nota Doc ID 2295998.1 de MOS).
No obstante esto, es posible automatizar “captura” en las PBDs configurando el parámetro AWR_PDB_AUTOFLUSH_ENABLED en TRUE (por defecto se encuentra deshabilitado).



Generación de snapshots



Veamos entonces como realizar la toma de snapshots AWR utilizando ambos métodos (automático y manual):


1-Método Automático:
1) Configuramos primero el parámetro  awr_pdb_autoflush_enabled=true a nivel PDB:


Nos conectamos a la PDB:
SQL> alter session set container=PDB12CR2;

Session  altered.



Verificamos el valor del parámetro:
SQL> show parameter awr_pdb_autoflush_enabled

NAME                                  TYPE        VALUE
------------------------------------  ----------- ------------------------------
awr_pdb_autoflush_enabled             boolean     FALSE



Modificamos el valor:
SQL> alter system set  awr_pdb_autoflush_enabled=true;

System  altered.

SQL>  show parameter awr_pdb_autoflush_enabled

NAME                                  TYPE        VALUE
------------------------------------  ----------- ------------------------------
awr_pdb_autoflush_enabled             boolean     TRUE



2) Configuramos correctamente el intervalo de los snapshots de AWR (Si bien esto es algo que no está muy difundido en notas técnicas, resulta un aspecto crítico):

SQL>  select * from cdb_hist_wr_control;

  DBID        SNAP_INTERVAL     RETENTION         TOPNSQL  CON_ID
  ----------  ----------------- ----------------- -------- ------
  2086124034  +40150 00:01:00.0 +00008 00:00:00.0  DEFAULT      3

  SQL> execute dbms_workload_repository.modify_snapshot_settings(interval  => 60);
  
  PL/SQL  procedure successfully completed.
  
  SQL>  select * from cdb_hist_wr_control;

  DBID        SNAP_INTERVAL     RETENTION         TOPNSQL  CON_ID
  ----------  ----------------- ----------------- -------- ------
  2086124034  +00000 01:00:00.0 +00008 00:00:00.0  DEFAULT      3




3) Establecemos también AWR_SNAPSHOT_TIME_OFFSET en 1000000 para evitar problemas de performance cuando múltiples “Pluggable Databases” estén creando snapshots en simultáneo.
Podemos ver más información en la documentación: “Oracle Database 12c Release 2 Database Reference (1.26 AWR_SNAPSHOT_TIME_OFFSET)”
http://docs.oracle.com/database/122/REFRN/AWR_SNAPSHOT_TIME_OFFSET.htm#REFRN10325


Debemos tener en cuenta que esta modificación hay que realizarla a nivel del CDB$ROOT.
SQL> alter session set container=CDB$ROOT;

Session  altered.

SQL> alter system set  AWR_SNAPSHOT_TIME_OFFSET=1000000;

System  altered.




4) Finalmente, al ya estar configurada la ejecución automática, debemos esperar 1-2 horas para que los “snaps” sean tomados. Luego, si podemos generar un reporte.
SQL>  select SNAP_ID, DBID, STARTUP_TIME,  BEGIN_INTERVAL_TIME, END_INTERVAL_TIME, CON_ID 
      from awr_pdb_snapshot;


SNAP_ID       DBID STARTUP_TIME                   BEGIN_INTERVAL_TIME            
END_INTERVAL_TIME,      CON_ID
----------  ---------- ------------------------------ ------------------------------ 
 ------------------------------ ----------
   1 2086124034 04-JAN-18 08.53.03.000 AM      04-JAN-18 03.35.35.929 PM      
04-JAN-18 03.52.44.978 PM               3
    2 2086124034 04-JAN-18 08.53.03.000  AM      04-JAN-18 03.52.44.978 PM      
04-JAN-18 04.54.52.399 PM               3 




2-Método Manual:
1) Nos conectamos a la PDB:
SQL>  connect / as sysdba
Connected.

SQL>  alter session set container= PDB12CR2;
Session  altered.



2) Ejecutamos el procedimiento para la creación manual del snapshot:
SQL> exec  dbms_workload_repository.create_snapshot();

PL/SQL  procedure successfully completed.



En la siguiente salida podemos ver el “snap” generado:
SNAP_ID       DBID STARTUP_TIME                   BEGIN_INTERVAL_TIME            
END_INTERVAL_TIME                  CON_ID
----------  ---------- ------------------------------ ------------------------------  
------------------------------ ----------
     1 2086124034 04-JAN-18 08.53.03.000  AM      04-JAN-18 03.35.35.929 PM      
  04-JAN-18 03.52.44.978 PM               3
    2 2086124034 04-JAN-18 08.53.03.000  AM      04-JAN-18 03.52.44.978 PM      
  04-JAN-18 04.54.52.399 PM               3 
         3 2086124034 04-JAN-18 08.53.03.000  AM    04-JAN-18 04.54.52.399 PM      
  04-JAN-18 04.57.02.760 PM               3


Es importante tener en cuenta que los ID de snapshots  generados a nivel PDB, pueden llegar a diferir de los generados en el CDB cuando la captura a nivel PDB es realizada de forma manual.
Podemos ver entonces los datos de AWR a nivel CDB en las vistas AWR_ROOT_xxx  y a nivel PDB (“Pluggable Databases” abiertas en el momento de la captura del snapshot) en las vistas AWR_PDB_xxx;
Una PDB tiene la capacidad de poder transportar sus propios datos de AWR cuando se realiza una operación de “unplug/plug” desde un CDB a otro. Los “Container Databases” targets tiene la capacidad de diferenciar entre los datos antiguos de AWR (que son transportados junto con la PDB) y los nuevos datos AWR capturados después de la operación de “plug”.
Los “snaps” propios de una PDB tienen un ID único, el cual no está relacionado con los snapshots del CDB.
De esta manera las operaciones de “pluging” y “unpluging” de una PDB en un “Container Database” no afectan la información de AWR almacenada en la PDB.



Gestión de la seguridad



El administrador del CDB, si lo cree conveniente,  puede llegar a utilizar “PDB lockdown profiles” para deshabilitar la funcionalidad de AWR en una o varias PDBs puntuales.
La manera de realizar esto, es ejecutando la siguiente sentencia en la PDB :
SQL> alter  lockdown profile profile_name disable feature=('AWR_ACCESS');



Una vez deshabilitada la funcionalidad en una PDB, ya no se podrán realizar operaciones relacionadas con snapshots en ella.
Si se requiere habilitar nuevamente AWR a nivel PDB, se debe ejecutar la sentencia que mostramos a continuación:
SQL> alter  lockdown profile profile_name enable feature=('AWR_ACCESS');



Generación de reportes AWR



Existen varias maneras de obtener un reporte de AWR, tanto a nivel CDB como PDB. La dos principales son utilizando “Cloud Control” y los scripts correspondientes provistos durante la instalación del motor.

En nuestro caso veremos ejemplos de cómo utilizar los scripts desde línea de comando.
Tal como mencionamos anteriormente, podemos generar reportes tanto a nivel CDB como PDB. El informe AWR obtenido en un PDB, no difiere mucho a un reporte que haya sido generado en la CDB original. Simplemente la información que contiene está acotada a esa base de datos en particular.
Veamos primero como se genera un reporte a nivel CDB (Similar a 12cR1).
Generación del reporte en el CDB:
Nos conectamos al root del CDB y ejecutamos el script “awrrpt”.
Principalmente debemos indicar:
  • Tipo de reporte: (tenemos tres opciones):
  • 'html':            HTML format (default)
  • 'text':             Text format
  • 'active-html': Includes Performance Hub active report
  • Intervalo de “snaps” a utilizar
  • Nombre del reporte
Nota: El reporte será generado en el directorio donde nos encontremos parados.
SQL> @?/rdbms/admin/awrrpt

Specify  the Report Type
~~~~~~~~~~~~~~~~~~~~~~~
AWR  reports can be generated in the following formats.  Please enter the
name  of the format at the prompt.  Default  value is 'html'.

'html'          HTML format (default)
'text'          Text format
'active-html'   Includes Performance Hub active report

Enter  value for report_type: html
old   1: select 'Type Specified:  ',lower(nvl('&&report_type','html')) report_type from dual
new   1: select 'Type Specified:  ',lower(nvl('html','html')) report_type from dual

Type  Specified:  html

old   1: select '&&report_type'  report_type_def from dual
new   1: select 'html' report_type_def from dual


old   1: select '&&view_loc' view_loc_def  from dual
new   1: select 'AWR_PDB' view_loc_def from dual



Current  Instance
~~~~~~~~~~~~~~~~
DB  Id          DB Name        Inst Num       Instance       Container Name
--------------  -------------- -------------- -------------- --------------
2233049298      CDB12CR2                    1  cdb12cr2       CDB$ROOT


Instances  in this Workload Repository schema
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DB Id         Inst Num   DB Name      Instance     Host
------------  ---------- ---------    ----------   ------
* 2233049298     1       CDB12CR2     cdb12cr2     server01.loc

Using  2233049298 for database Id
Using          1 for instance number

Specify  the number of days of snapshots to choose from
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Entering  the number of days (n) will result in the most recent
(n)days of snapshots being listed. Pressing  without
specifying  a number lists all completed snapshots.


Enter  value for num_days:

Listing  all Completed Snapshots
Instance      DB Name      Snap Id       Snap Started    Snap Level
------------  ------------ ---------- ------------------ ----------
cdb12cr2      CDB12CR2            18  03 Jan 2018 10:13    1
        19  03 Jan 2018 11:00    1
       20  03 Jan 2018 11:54    1
       21  03 Jan 2018 13:00    1
      22  03 Jan 2018 14:00    1
      23  03 Jan 2018 15:00    1
      24  03 Jan 2018 16:00    1
      25  03 Jan 2018 17:00    1
      26  03 Jan 2018 18:00    1
      27  03 Jan 2018 19:00    1
        28  04 Jan 2018 09:04    1
      29  04 Jan 2018 10:00    1
      30  04 Jan 2018 11:00    1
      31  04 Jan 2018 12:00    1
      32  04 Jan 2018 13:00    1
      33  04 Jan 2018 14:00    1
      34  04 Jan 2018 15:00    1
      35  05 Jan 2018 05:59    1
      36  05 Jan 2018 08:11    1
      37  05 Jan 2018 09:00    1
      38  05 Jan 2018 10:00    1
      39  05 Jan 2018 11:00    1
      40  05 Jan 2018 12:00    1
      41  05 Jan 2018 13:01    1
      42  05 Jan 2018 14:00    1
      43  05 Jan 2018 15:00    1

Specify  the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter  value for begin_snap: 42
Begin  Snapshot Id specified: 42

Enter  value for end_snap: 43

Specify  the Report Name
~~~~~~~~~~~~~~~~~~~~~~~
The  default report file name is awrrpt_1_42_43.html.  To use this name,
press   to continue, otherwise enter an alternative.

Enter  value for report_name: cdb12cr2_42_43.html

#######
#######  < parte de la salida suprimida >
#######

Report  written to cdb12cr2_42_43.html
SQL>



Generación a nivel PDB:
En el reporte a nivel PDB, la cabecera del mismo identifica la PDB desde la cual se está emitiendo el reporte. Además como ocurre en los reportes tradicionales, se indica cuáles son los snapshots involucrados, los que en este caso corresponden a la “pluggable” y no al “root”.
Los snapshosts pueden ser mantenidos (creados y depurados) de la misma manera que ocurre con los snapshots del CDB.
Es importante aclarar,  que la información relacionada con los snaps de AWR para la PDB se encuentra en la vista AWR_PDB_SNAPSHOT y no en la DBA_HIST_SNAPSHOT.
Para le generación del reporte, es necesario estar explícitamente conectado a la PDB en cuestión:


Procedimiento
Nos conectamos primero a la PDB:
SQL>  alter session set container= PDB12CR2;

Session  altered.
Verificamos:
SQL>  show con_name

NAME_COL_PLUS_PDB_CONTAINER
------------------------------------------------------------------------------
PDB12CR2



Luego ejecutamos el script de generación al igual que en el caso anterior:
Nuevamente indicamos los tres datos principales que nos son solicitados:
  • Tipo de reporte:
  • 'html':             HTML format (default)
  • 'text':              Text format
  • 'active-html':  Includes Performance Hub active report
  • Intervalo de snaps
  • Nombre del reporte.
Además en este caso debemos indicar la ubicación de los datos AWR. Esta debe ser AWR_PDB.
En la Figura 1 vemos de que forma nos es requerida esa especificación:
    Specify the location of AWR Data
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    AWR_ROOT - Use AWR data from root (default)
    AWR_PDB - Use AWR data from PDB
    Enter value for awr_location: AWR_PDB


Figura 1. Indicar “location” de los datos de AWR en AWR_PDB


Ejecutamos el script awrrpt:
SQL> @?/rdbms/admin/awrrpt
Specify  the Report Type
~~~~~~~~~~~~~~~~~~~~~~~
AWR  reports can be generated in the following formats.  Please enter the
name  of the format at the prompt.  Default  value is 'html'.

'html'          HTML format (default)
'text'          Text format
'active-html'   Includes Performance Hub active report

Enter  value for report_type: html

Type  Specified:  html

Specify  the location of AWR Data
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
AWR_ROOT  - Use AWR data from root (default)
AWR_PDB  - Use AWR data from PDB
Enter  value for awr_location: AWR_PDB

Location  of AWR Data Specified: AWR_PDB



Current  Instance
~~~~~~~~~~~~~~~~
DB  Id          DB Name        Inst Num       Instance       Container Name
--------------  -------------- -------------- -------------- --------------
2086124034      CDB12CR2                    1  cdb12cr2       PDB12CR2


Root  DB Id      Container DB Id AWR DB Id
---------------  --------------- ---------------
2233049298      2086124034      2086124034


Instances  in this Workload Repository schema
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DB Id         Inst Num   DB Name      Instance     Host
------------  ---------- ---------    ----------   ------
2086124034        1      CDB12CR2     cdb12cr2     server01.loc

Using  2086124034 for database Id
Using          1 for instance number
  

Specify  the number of days of snapshots to choose from
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Entering  the number of days (n) will result in the most recent
(n)  days of snapshots being listed.  Pressing   without
specifying  a number lists all completed snapshots.


Enter  value for num_days: 1

Listing  the last day's Completed Snapshots
Instance      DB Name      Snap Id       Snap Started    Snap Level
------------  ------------ ---------- ------------------ ----------

cdb12cr2      CDB12CR2            4   04 Jan 2018 15:35    1
        5   04 Jan 2018 15:52    1
       6   04 Jan 2018 16:04    1
       7   04 Jan 2018 16:11    1

  
Specify  the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter  value for begin_snap: 6
Begin  Snapshot Id specified: 6

Enter  value for end_snap: 7
End   Snapshot Id specified: 7

Specify  the Report Name
~~~~~~~~~~~~~~~~~~~~~~~
The  default report file name is awrrpt_1_6_7.html.   To use this name,
press   to continue, otherwise enter an alternative.

Enter  value for report_name: pdb12cr2_6_7.html

####
####  < parte de la salida suprimida >
####

Report  written to pdb12cr2_6_7.html
Nota: En el caso que la PDB desde la cual queremos emitir el reporte no se encuentre abierta, recibiremos el siguiente error:
ERROR  at line 59:
ORA-06550:  line 59, column 52:
PL/SQL:  ORA-01219: database or pluggable database not open: queries allowed on
fixed  tables or views only
ORA-06550:  line 56, column 5:
PL/SQL:  SQL Statement ignored
  
SP2-0556:  Invalid file name.



Para extraer el reporte AWR debemos abrirla. Esto lo hacemos de la siguiente manera:
SQL> alter pluggable  database open;




Verificación de los reportes generados:



Una vez terminada la ejecución del script (o el método de generación que hayamos elegido) vamos a tener nuestro reporte en el formato seleccionado.
Reporte a nivel CDB:
En el caso de un reporte a nivel CDB, no vamos a encontrar modificaciones significativas con respecto a versiones anteriores.
Podemos ver que nos indica que se trata del “root container” y nos muestra el correspondiente “container DB ID”. También vemos que los snap Id corresponden a los tomados en el CDB (Figura 2). Una novedad en la salida del reporte, la encontramos en la sección “SQL Statistics” (Figura 3) donde por cada diferente lista se incluye la columna “PDB Name” indicando justamente a que PDB corresponde el SQL (Figura 4).

Figura 2. Cabecera de reporte AWR a nivel CDB.

Figura 3. Sección “SQL Statistics” en reporte AWR.

Figura 4. En cada opción de “SQL Statistics” se puede ver la nueva columna “PDB Name”.


Reporte a nivel PDB:
En el caso del reporte generado en la PDB, fundamentalmente veremos que se indica que se trata de un reporte AWR de PDB, podemos ver también en la cabecera el nombre del CDB, y la PDB (indicada como “container”) y su correspondiente “container DBID” (Figura 5).
El resto de los datos del “header” son bastante generales y no difieren mucho.
Más abajo en el reporte, podemos ver de cual servicio se trata, en este caso pdb12cr2.localdomain (Figura 6).

Figura 5. Cabecera de reporte AWR a nivel PDB.

Figura 6. Sección “Service Statistics”. Se puede ver que se trata de la PDB únicamente.



Conclusión:

AWR es una de las principales herramientas para realizar el “thoubleshooting” de performance en una base de datos Oracle. La versión 12c introdujo el concepto de “multitenant”, un cambio muy grande a nivel arquitectura. La capacidad de poder compartir la instancia por varias bases de datos y aplicaciones diferentes trae consigo innumerables beneficios, pero también cierta complejidad a la hora de analizar y determinar el origen de problemas de rendimiento. El release 2 de Oracle Database 12c mejora mucho este aspecto, incorporando entre otras cosas la posibilidad de capturar datos y generar reportes AWR a nivel “Pluggable Database”.

No hay comentarios: