[ 2018-07-24 ]

Privilegios necesarios para generar reportes AWR

Resulta bastante común que bajo ciertas situaciones especiales, o en determinados proyectos, haya usuarios no administradores requieran la posibilidad de ejecutar reportes AWR de una base de datos para analizar distintas cuestiones.
Para permitir esto, aplicando el principio de “mínimos privilegios”, podemos construir un role de base de datos con los "grants" necesarios para poder generar los reportes, y asignarlo luego a los usuarios que lo necesiten.

Los privilegios necesarios para generar un reporte son los siguientes:

grant select on sys.v_$database to rol_exec_awr;
grant select on sys.v_$instance to rol_exec_awr;
grant execute on sys.dbms_workload_repository to rol_exec_awr;
grant select on sys.dba_hist_database_instance to rol_exec_awr;
grant select on sys.dba_hist_snapshot to rol_exec_awr;

Veamos un ejemplo de como hacerlo:

Vamos a crear primero un usuario (awrusr) con privilegios de connect y resource para simular el usuario que necesita correr los reportes AWR. 

[oracle@server01 ~]$ sqlplus / as sysdba

SQL> create user awrusr identified by oracle
     default tablespace users
     temporary tablespace temp;

User created.
SQL> grant connect, resource to awrusr;

Grant succeeded.

Una vez creado (y sólo a modo de demostración) vamos a intentar ejecutar un reporte.

Nos conectamos con el usuario e intentamos primero ver el historial de snaps:

[oracle@server01 ~]$ sqlplus awrusr

SQL> select snap_id, dbid, instance_number, end_interval_time
     from  dba_hist_snapshot
     where end_interval_time > trunc(sysdate-1)
     order by  snap_id;

 from  dba_hist_snapshot
      *
ERROR at line 2:
ORA-00942: table or view does not exist
Enseguida vemos que el usuario no tiene acceso a la vista

SQL> select * from
table(sys.dbms_workload_repository.awr_report_html(1778878021,1,6108,6109));  2
table(sys.dbms_workload_repository.awr_report_html(1778878021,1,6108,6109))
          *
ERROR at line 2:
ORA-00904: : invalid identifier

De igual menera, tampoco puede ejecutar el package dbms_workload_repository.

Si nos conectamos utlizando otra herramientas (por ejemplo SQL Developer), e intentamos hacer lo mismo obeenemos el mismo resultado.


Vamos entonces a crear el rol y dárselo al usuario:
Nos conectamos como SYSDBA y creamos el rol (awr_role) con los privilegios necesarios:

[oracle@server01 ~]$ sqlplus / as sysdba

SQL> create role awr_role;

Role created.

SQL>grant select on sys.v_$database to awr_role;
Grant succeeded.

SQL>grant select on sys.v_$instance to awr_role;
Grant succeeded.

SQL>grant execute on sys.dbms_workload_repository to awr_role;
Grant succeeded.

SQL> grant select on sys.dba_hist_database_instance to awr_role;
Grant succeeded.

SQL> grant select on sys.dba_hist_snapshot to awr_role;
Grant succeeded.

Finalmente “granteamos” el role creado al usuario:

SQL> grant awr_role to awrusr;

Grant succeeded.

Nos conectamos nuevamente con el usuario “awrusr” y repetimos la prueba de tratar de ver los snaps disponibles:

[oracle@server01 ~]$ sqlplus awrusr/oracle

SQL> set linesize 250
SQL> select   snap_id, dbid, instance_number, end_interval_time
     from  dba_hist_snapshot
     where end_interval_time > trunc(sysdate-1)
     order by  snap_id; 

   SNAP_ID       DBID INSTANCE_NUMBER END_INTERVAL_TIME
---------- ---------- --------------- ---------------------------------------------------------------------------
      6081 1778878021               1 23-JUL-18 12.00.38.477 AM
      6082 1778878021               1 23-JUL-18 01.00.40.738 AM
      6083 1778878021               1 23-JUL-18 02.00.43.049 AM
      6084 1778878021               1 23-JUL-18 03.00.45.423 AM
      6085 1778878021               1 23-JUL-18 04.00.50.769 AM
      6086 1778878021               1 23-JUL-18 05.00.53.136 AM
      6087 1778878021               1 23-JUL-18 06.00.55.540 AM
      6088 1778878021               1 23-JUL-18 07.00.57.889 AM
      6089 1778878021               1 23-JUL-18 08.01.00.169 AM
      6090 1778878021               1 23-JUL-18 09.00.02.468 AM
      6091 1778878021               1 23-JUL-18 10.00.04.751 AM
      6092 1778878021               1 23-JUL-18 11.00.07.096 AM
      6093 1778878021               1 23-JUL-18 12.00.09.300 PM
      6094 1778878021               1 23-JUL-18 01.00.11.558 PM
      6095 1778878021               1 23-JUL-18 02.00.13.840 PM
      6096 1778878021               1 23-JUL-18 03.00.16.262 PM
      6097 1778878021               1 23-JUL-18 04.00.18.509 PM
      6098 1778878021               1 23-JUL-18 05.00.20.795 PM
      6099 1778878021               1 23-JUL-18 06.00.22.999 PM
      6100 1778878021               1 23-JUL-18 07.00.28.443 PM
      6101 1778878021               1 23-JUL-18 08.00.36.869 PM
      6102 1778878021               1 23-JUL-18 09.00.39.319 PM
      6103 1778878021               1 23-JUL-18 10.00.41.713 PM
      6104 1778878021               1 23-JUL-18 11.00.44.178 PM
      6105 1778878021               1 24-JUL-18 12.00.46.392 AM
      6106 1778878021               1 24-JUL-18 01.00.48.696 AM
      6107 1778878021               1 24-JUL-18 02.00.54.062 AM
      6108 1778878021               1 24-JUL-18 03.00.59.502 AM
      6109 1778878021               1 24-JUL-18 04.00.01.760 AM
      6110 1778878021               1 24-JUL-18 05.00.04.196 AM
      6111 1778878021               1 24-JUL-18 06.00.06.470 AM
      6112 1778878021               1 24-JUL-18 07.00.08.921 AM
      6113 1778878021               1 24-JUL-18 08.00.14.298 AM
      6114 1778878021               1 24-JUL-18 09.00.16.708 AM
      6115 1778878021               1 24-JUL-18 10.00.19.089 AM
      6116 1778878021               1 24-JUL-18 11.00.21.477 AM
      6117 1778878021               1 24-JUL-18 12.00.23.824 PM
      6118 1778878021               1 24-JUL-18 01.00.26.195 PM
      6119 1778878021               1 24-JUL-18 02.00.28.623 PM
      6120 1778878021               1 24-JUL-18 03.00.30.956 PM
      6121 1778878021               1 24-JUL-18 04.00.33.312 PM
      6122 1778878021               1 24-JUL-18 05.00.35.682 PM

42 rows selected

Ahora si podemos hacerlo.

Por último, vamos a generar un reporte. Utilizaremos la siguiente sintaxis:

select *
 from table(sys.dbms_workload_repository.awr_report_text(<dbid>,<instance_number>,<snapshot_id begin>,<snapshot_id eind>));

Al hacerlo desde SQL*Plus, debemos tener la precaución de direccionar la salida a un archivo con “spool”. Podemos seleccionar la salida en modo texto (awr_report_text) o HTML (awr_report_text) de acuerdo a nuestra preferencias.
En nuestro caso, prefiero modo texto ya que vamos a visualizarlo desde la linea de comando de un sistema operativo Unix.

El output en SQL*Plus de nuestro ejemplo está truncado para facilitar la visualización,  pero en el directorio donde estamos posicionados encontraremos el file awr.out (nombre que pusimos en el spool) con el reporte completo.

SQL> spoo awr.out
SQL> select * from table(sys.dbms_workload_repository.awr_report_text(1778878021,1,6108,6109));

OUTPUT
--------------------------------------------------------------------------------
WORKLOAD REPOSITORY report for

DB Name         DB Id    Instance     Inst Num Startup Time    Release     RAC
------------ ----------- ------------ -------- --------------- ----------- ---
ORCL          1778878021 ORCL1               1 11-Jul-18 14:24 11.2.0.4.0  YES

Host Name        Platform                         CPUs Cores Sockets Memory(GB)
---------------- -------------------------------- ---- ----- ------- ----------
server01         Linux x86 64-bit                   16     8       2      62.90

              Snap Id      Snap Time      Sessions Curs/Sess Instances
            --------- ------------------- -------- --------- ---------
Begin Snap:      6108 24-Jul-18 03:00:59        55       1.6         1
  End Snap:      6109 24-Jul-18 04:00:01        57       1.6         1
   Elapsed:               59.04 (mins)
   DB Time:                0.20 (mins)

Load Profile                    Per Second   Per Transaction  Per Exec  Per Call
~~~~~~~~~~~~~~~            ---------------   --------------- --------- ---------
             DB Time(s):               0.0               0.3      0.00      0.00
              DB CPU(s):               0.0               0.3      0.00      0.00
      Redo size (bytes):             640.8          52,787.0
  Logical read (blocks):              14.0           1,151.3
          Block changes:               1.3             106.5
 Physical read (blocks):               0.0               1.8
Physical write (blocks):               0.2              19.8
       Read IO requests:               0.0               1.8
      Write IO requests:               0.2              14.5
           Read IO (MB):               0.0               0.0
          Write IO (MB):               0.0               0.2
 RAC GC blocks received:               0.0               0.1
   RAC GC blocks served:               0.0               0.1
             User calls:               1.3             102.8
           Parses (SQL):               1.1              90.0
      Hard parses (SQL):               0.0               2.4
     SQL Work Area (MB):               0.1               6.5
                 Logons:               0.1               4.4


>>>>>>>>>>>>>>>>> continúa >>>>>>>>>>>>>>>>>

Espero les resulte de utilidad.

No hay comentarios:

Publicar un comentario