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