Espero sea uno de los muchos artículos que quiero publicar al respecto.
Llevo tiempo dándole vueltas a la creación de cuadros de mando específicos para dar una visión rápida de tendencias en BBDD (CPU, DBTIME, AAS) que sean de valor para entender el comportamiento de la base de datos y desvíos en este, así como un seguimiento del capacity planning en el tiempo.
Para ello parto de varias premisas:
Datos históricos. En mi caso quiero 5 años.
Minado sin generar carga en producción
Consolidación de las métricas de rendimiendo de las bases de datos de la compañía en un único repositorio
Que sea fácilmente entendible y ya puestos, bonito.
Código abierto.
Para ello, disponiendo de licencia enterprise (se puede extrapolar a statspack!) y despliegue de OEM (Oracle Enterprise Manager) me he decantado por:
AWR Warehouse
Metabase para explotar los datos
¿Que es metabase?
Metabase es una potente herramienta de Business Intelligence (BI) de código abierto que facilita la adquisición y presentación de datos desde diversas fuentes. No solo ofrece una interfaz amigable y accesible, sino también una amplia gama de herramientas que permite llevar a cabo una variedad de análisis detallados y obtener insights valiosos
Código abierto, perfecto. Podemos almacenar consultas de Oracle y mostrarlas con diversos gráficos que se adaptan a los escenarios que planteo.
Como primer contacto con la herramienta definiendo una gráfica con el DB Time de base de datos en el rango especificado. Todo en cuestión de minutos.
Cual es la idea? Tener tanto una visión del comportamiento de la base de datos, en este caso un RAC de 2 nodos, como poder comparar en el tiempo rangos concretos y poder tener una visión real de desvíos en éste.
Pongo un ejemplo comparando DB Time en dos periodos:
Se pueden ir unificando en un mismo cuadro de mando todas las métricas que nos interesen para tener una visión comparativas de éstas:
Las consultas utilizadas contra la base de datos de AWR Warehouse en este caso serían las siguientes:
-- Db Time
SELECT *
FROM
(
SELECT
D.INSTANCE_NAME,
TO_CHAR(B.BEGIN_INTERVAL_TIME, 'DD-MON-YY HH24:MI') SNAP_BEGIN_TIME,
ROUND((A.VALUE - LAG(A.VALUE) OVER (ORDER BY A.DBID, A.INSTANCE_NUMBER, A.SNAP_ID)) / 1000000 / 60, 2) DB_TIME_MIN
FROM
DBA_HIST_SYS_TIME_MODEL A
JOIN DBA_HIST_SNAPSHOT B ON A.DBID = B.DBID AND A.SNAP_ID = B.SNAP_ID AND A.INSTANCE_NUMBER = B.INSTANCE_NUMBER
JOIN DBA_HIST_DATABASE_INSTANCE D ON A.DBID = D.DBID AND A.INSTANCE_NUMBER = D.INSTANCE_NUMBER
JOIN dbsnmp.caw_dbid_mapping M ON D.DBID = M.new_dbid AND m.target_name = {{target_name}}
WHERE
A.STAT_NAME = 'DB time'
and b.begin_interval_time between {{fecha_inicial}} and ({{fecha_final}} + 1)
)
WHERE
DB_TIME_MIN IS NOT NULL
AND DB_TIME_MIN > 0
ORDER BY
SNAP_BEGIN_TIME
-- CPU Time
SELECT *
FROM
(
SELECT
D.INSTANCE_NAME,
TO_CHAR(B.BEGIN_INTERVAL_TIME, 'DD-MON-YY HH24:MI') SNAP_BEGIN_TIME,
ROUND((A.VALUE - LAG(A.VALUE) OVER (ORDER BY A.DBID, A.INSTANCE_NUMBER, A.SNAP_ID)) / 1000000 / 60, 2) DB_CPU_MIN
FROM
DBA_HIST_SYS_TIME_MODEL A
JOIN DBA_HIST_SNAPSHOT B ON A.DBID = B.DBID AND A.SNAP_ID = B.SNAP_ID AND A.INSTANCE_NUMBER = B.INSTANCE_NUMBER
JOIN DBA_HIST_DATABASE_INSTANCE D ON A.DBID = D.DBID AND A.INSTANCE_NUMBER = D.INSTANCE_NUMBER
JOIN dbsnmp.caw_dbid_mapping M ON D.DBID = M.new_dbid AND m.target_name = {{target_name}}
WHERE
A.STAT_NAME = 'DB CPU'
and b.begin_interval_time between {{fecha_inicial}} and ({{fecha_final}} + 1)
)
WHERE
DB_CPU_MIN IS NOT NULL
AND DB_CPU_MIN > 0
ORDER BY
SNAP_BEGIN_TIME
Entrando en juego AWR Warehouse deberemos tener siempre en cuenta el cruce con:
dbsnmp.caw_dbid_mapping
Abre un amplio abanico de posibilidades, dándome ya una visión de periodo a revisar.
Espero que pueda aportar ideas de valor y abrimos el melón de extrapolar analítica a AWR?
Sigo jugando con la herramienta...