Estimación de Storage para un Oracle Database 12c utilizando Oracle R

Por Francisco Riccio Oracle ACE
Publicado en Julio 2017


Introducción

Muchas organizaciones están alineadas a las mejores prácticas para la administración de servicios de TI utilizando el marco de referencia ITIL v3. En el ciclo de vida de ITIL v3, la fase de Diseño incluye el proceso de Management Capacity, el cual nos indica que debemos tomar en cuenta todos los recursos necesarios para llevar a cabo los servicios de TI y proveer las necesidades de la empresa a corto, medio y largo plazo.

Por este motivo, se hace muy importante poder estimar las capacidades de hardware (CPU, Memoria y Storage) que requiere nuestro servidor de base de datos en los próximos n meses.

Este artículo está enfocado a poder ayudar a calcular el espacio que se requerirá en un tiempo determinado en el futuro para una base de datos Oracle específica.

Cabe mencionar que pueden haber diversas soluciones para este requerimiento, incluyendo soluciones cognitivas que permitan ayudarnos en el cálculo. El método que presentaré no es complicado implementarlo y está basado en regresiones, teniendo un fundamento estadístico y de gran valor para la empresa.

Para cumplir dicho fin, nos apoyaremos de: PL/SQL, Oracle R Distribution y nuestros conceptos de Estadística Básica. Oracle R Distribution es una redistribución del Open Source R y puede ser descargado de manera gratuita.

Más información del producto lo encontramos en el siguiente url:

http://www.oracle.com/technetwork/topics/bigdata/r-offerings-1566363.html

R es un es un entorno y lenguaje de programación gratuito con un enfoque en el análisis estadístico.

Más información del proyecto R lo podemos encontrar en el siguiente url: https://www.r-project.org/

Este artículo no será útil para aquella persona que esté buscando un mecanismo de estimar el tamaño de una base de datos nueva, debido a que la estimación de storage lo realizaremos utilizando el espacio histórico de la base de datos para proyectar.

Implementación

I. Setup

A continuación se definirá la implementación para cumplir el objetivo.

1. Creamos un usuario en la base de datos.

01

2. Creamos una tabla que almacenará la siguiente información:

02

Los campos son:

  • NOMBRE = Nombre del tablespace.
  • TAMANO_FREE_GB = Tamaño libre del tablespace.
  • TAMANO_OCUPA_GB = Tamaño de los datos almacenados en el tablespace.
  • TAMANO_RESERVADO_GB = Espacio que ocupa el tablespace en el Sistema Operativo.
  • FECHA = Fecha de la captura del dato en formato YYYYMMDD

A pesar que todos los campos no serán requeridos para el cálculo final como por ejemplo: Tamaño Libre o el Espacio Reservado, es recomendable almacenarlos para un futuro análisis como también es importante llevar este control a nivel de tablespace porque nos permite realizar proyecciones únicamente a un tablespace específico.

La tabla HISTORIAL_TBS debe ser creado con el usuario previamente creado.

3. Creamos un Stored Procedure que se encargará de poblar la información en la tabla previamente creada.

03

create or replace procedure spu_historial_tbs
--Programado por Francisco Riccio.
is
 cursor v_tbs is
 select nombre, round(tamano_free_gb,2) as tamano_free_gb, 
 round(tamano_reservado_gb-tamano_free_gb,2) as tamano_ocupado_gb, 
 round(tamano_reservado_gb,2) as tamano_reservado_gb
 from
 (
  select nombre, tamano_free_gb, 
  ( 
   select tamano_reservado_gb
   from
   (
    (select tablespace_name, sum(bytes)/1024/1024/1024 as tamano_reservado_gb
    from dba_data_files
    group by tablespace_name)
   )
   where tablespace_name=nombre 
  ) as tamano_reservado_gb
  from (
   select tablespace_name nombre, sum(bytes)/1024/1024/1024 as tamano_free_gb
   from dba_free_space
   group by tablespace_name    
  )
 );
begin
 for c in v_tbs loop
  insert into HISTORIAL_TBS (nombre,tamano_free_gb,tamano_ocupado_gb,tamano_reservado_gb,fecha) 
  values (c.nombre, c.tamano_free_gb, c.tamano_ocupado_gb, 
      c.tamano_reservado_gb,to_char(sysdate,'YYYYMMDD'));
 end loop;
 commit;
end;
/

4. Creamos un JOB que ejecutará el Stored Procedure de manera diaria.

a) Creamos un SCHEDULE.

execute dbms_scheduler.create_schedule(schedule_name=>'sched_01_hor',
start_date=>trunc(SYSTIMESTAMP,'day'),repeat_interval=>'freq=hourly;
bysecond=00;interval=1',end_date=>null,comments=>'Frequencia de 1 hora');
/

b) Creamos un PROGRAM

execute dbms_scheduler.create_program(program_name=>'prog_historial_tbs',
program_type=>'stored_procedure',program_action=>'spu_historial_tbs',
enabled=>true,comments=>'Registro del tamano de los tablespaces');
/

c) Creamos el JOB

execute dbms_scheduler.create_job(job_name=>'job_historial_tbs',program_name=>
'prog_historial_tbs',schedule_name=>'sched_01_hor',enabled=>true,auto_drop=>
false,comments=>'Registro del tamano de los tablespaces cada dia');  
/

5. Procedemos a Instalar Oracle R en nuestra computadora personal.

Oracle R lo podemos descargar del siguiente url:

http://www.oracle.com/technetwork/database/database-technologies/r/r-distribution/downloads/index.html

Descomprimimos el archivo descargado:

04

Ejecutamos el instalador:

05

A continuación se adjuntan las pantallas de la instalación:

06

07

08

09

10

11

12

13

14

15

6. Descargamos el paquete RORacle

Este paquete nos permitirá conectarnos a la base de datos y extraer los datos que requerimos para el análisis.

El paquete lo descargamos del siguiente url:

http://www.oracle.com/technetwork/database/database-technologies/r/roracle/downloads/index.html

Antes de proceder a instalar los paquetes es importante asegurarnos que tenemos instalado Oracle Instant Client o un Oracle Database Client en nuestra computadora personal.

Asegurándonos que tenemos instalado, procedemos a instalar primero el paquetes DBI, el cual define las interfaces hacia las bases de datos.

La instalación lo realizamos a través de la instrucción install.packages como a continuación se presenta:

16

Terminado la instalación prodemos a instalar el paquete ROracle.

17

Con estos 2 pasos estamos listos para realizar una prueba de conexión hacia la base de datos Oracle 12c.

18

Asimismo veremos en la base de datos una conexión realizada:

19

Para conocer todas las funciones disponibles del paquete podemos descargar su documentación en el siguiente url: https://cran.r-project.org/web/packages/ROracle/ROracle.pdf

7. Construcción del Reporte de Espacio

Con la siguiente sentencia SQL podemos determinar el máximo tamaño que ha tenido la base de datos en cada mes desde que comenzó a ejecutarse el JOB.

Dicha sentencia SQL lo encapsularemos en una vista llamada VREPORTE_ESPACIO.

20

21

II. Análisis de los Datos

Llegado a este punto, tenemos todo listo para analizar los datos.

Nota: Para un mejor análisis, utilizaré los datos de un servidor de base de datos Productivo cuya información ha venido registrándose desde el 13 de Febrero del 2012.

a) Obtendremos los datos de la vista VREPORTE

Ejecutamos el siguiente código en Oracle R Distribution.

22

23

library('ROracle')
drv <- dbDriver("Oracle")
con <- dbConnect(drv,"friccio","oracle",dbname='132.68.1.30:1521/PRD')
sql <- "select * from VREPORTE_ESPACIO"
rows <- dbGetQuery(con,sql)
print(rows)
dbDisconnect(con)

Toda la información de las filas extraídas ha sido almacenada en una variable llamada rows, que ha sido definida en el código.

Podemos obtener un resumen de la información extraída con la instrucción summary.

24

Aquí podemos ver que el tamaño de la base de datos inició en 187.8 GB y a la fecha ha llegado a un valor de 733.9 GB en 63 meses.

Oracle R Distribution nos permite realizar diferentes gráficos con la finalidad de visualizar los datos extraídos. En este caso realizaré un gráfico de líneas.

El código es el siguiente:

25

Nota: Hemos creado una variable Tamano_GB que copiará los datos de la columna Total de la variable Rows.

La salida del reporte es la siguiente:

26

b) Regresión Lineal

El análisis de regresión es un proceso estadístico para estimar las relaciones entre variables, en nuestro caso son el tiempo y el espacio ocupado.

Existen diversos tipos de Regresiones como: Lineal, Lineal Múltiple, Exponencial, Logarítmica, Polinomial y otros.

Por experiencia el tamaño de las bases de datos suelen crecer bajo un modelo de regresión lineal, salvo en casos donde se estén ejecutando pruebas de esfuerzo u operaciones de carga masiva diarias por un período constante, logrando distorsionar los datos.

Como nuestra única variable que tenemos registrada es el tiempo, tendremos que modelar la regresión lineal simple. Si identificamos otras variables que puedan explicar el crecimiento del espacio y las registramos, deberíamos utilizar un modelo de regresión lineal múltiple.

A pesar de ello, igual validaremos el modelo de regresión una vez calculado en Oracle R.

Recordemos que el Modelo Lineal tiene la siguiente ecuación:

Y (Espacio GB) = Bo + B1 * X (# Mes)

Además debe cumplir con los siguientes criterios:

  • Validación #1

    Prueba de Hipótesis: Ho: B1 = 0 H1: B1 ≠ 0 (RHo) Debemos asegurarnos que B1 no tendrá el valor de 0, sino sería una línea constante el modelo.
  • Validación #2

    Validamos que la variable # de Mes tenga una significancia en el modelo.
  • Validación #3

    Calculamos el coeficiente de determinación R2, el cual expresa el porcentaje de la variabilidad total que es explicada por el modelo.
  • Validación #4

    Validar que los errores aleatorios e1, en, etc; asociados a cualquier par de valores asociados a la variable dependiente Y, son siempre independientes. Esta prueba lo validamos a través de la prueba de Durbin-Watson.
  • Validación #5

    Los residuos (los errores de los puntos con respecto al modelo) deben seguir una distribución Normal. Esto lo validamos mediante la prueba de Kolmogorov-Smirnov.

Creamos una variable RegLineal que almacenará el resultado de la Regresión Lineal y posterior realizaremos las pruebas de validación.

Para calcular la regresión lineal utilizamos la instrucción lm.

27

En la instrucción indicamos que la variable Espacio (Y) es dependiente de la varible # de Mes (X).

Procederemos luego a validar el modelo.

c) Validación #1 - Modelo de Regresión Lineal

Instrucción: summary

28

El valor (F-statistics “p-value”) es la probabilidad que el coeficiente B1 sea igual a 0. Si la probabilidad es menor a 5% (convención) entonces rechazamos Ho (Acorde a la prueba de Hipótesis).

El resultado dio: 2.2e-16 por lo tanto es menor a 5%, entonces rechazamos Ho. Por lo tanto, es aceptada esta validación.

d) Validación #2 – Modelo de Regresión Lineal

El valor Pr(>|t|) para la variable X debe ser menor a 5%. En este caso, se acepta la validación.

e) Validación #3 – Modelo de Regresión Lineal

El R2 dio 0.8877. Este valor indica que el 88.77% de la dispersión del espacio utilizado por la base de datos es explicado por el modelo. Un valor más cercano al 100% es un mejor modelo.

Si deseamos graficar la regresión lineal ejecutamos la siguiente instrucción:

29

Obtendremos el siguiente gráfico (Presionar ENTER por cada gráfico):

30

f) Validación #4 - Modelo de Regresión Lienal

Para realizar la prueba de Durbin y Watson primero debemos instalar el paquete lmtest.

31

Luego realizamos el análisis con las siguientes instrucciones:

  • Library(lmtest)
  • dwtest(variable)

32

Al ser el p-value menor a 5%, entonces no podemos afirmar que no existe correlación entre los residuos.

Al fallar esta validación, debemos ser cuidadosos en el resultado que se obtenga del modelo de regresión lineal, debido a que una de sus pruebas ha fallado.

g) Validación #5 - Modelo de Regresión Lineal

Validamos que los residuos deben seguir una distribución Normal.

Para ello debemos validar la siguiente Prueba de Hipótesis:

Ho: Los errores o residuos siguen una distribución normal

H1: Los errores o residuos NO siguen una distribución normal

Al ejecutar la prueba con el instrucción: shapiro.test, obtenemos:

33

Al ser el p-value menor a 5% se acepta Ho, por lo tanto damos como aceptada que los residuos siguen una distribución normal.

Hasta este punto, 4 de 5 validaciones fueron exitosas y por ende se continuará con el análisis.

h) Obtener la fórmula del Modelo

34

Por lo tanto sería: Y (Espacio GB) = 161.686 + 7.036 * X (# de Mes).

La fórmula es basada en una muestra, pero necesitamos calcular un Intervalo de Confianza para estimar la Población que será el valor que necesitamos para estimar el espacio requerido a un tiempo futuro.

Esto lo realizamos con la instrucción predict.

Por ejemplo: Si queremos estimar el tamaño de la base de datos dentro de 1 año con un nivel de confianza del 99% sería:

El último mes registrado fue el 63, como deseamos a 1 año, entonces sería: 63 + 12 = 75

Por lo tanto:

35

Con un 99% de nivel de confianza tenemos evidencia que la base de datos ocupará 817.498 GB en los próximos 12 meses si es que no viene a futuro nuevos proyectos que cambien el comportamiento.

Asimismo recomiendo tener presente 2 puntos:

  • Siempre considerar el valor del límite superior del intervalo de confianza para estar en el peor escenario.
  • Al valor obtenido debemos aumentarle entre 10% a 15%. La razón de este incremento es porque siempre hemos tomado

capacidad de utilización y siempre deberíamos mantener la base de datos con un margen libre para que nuestros monitoreos no estén alertados.

Lo interesante de Oracle R Distribution es que podemos almacenar nuestro script y ejecutarlo cuando deseemos sin tener que estar cambiando alguna configuración.

A continuación copio todas las instrucciones de Oracle R que ha sido utilizado durante esta implementación:

36

#Conexión con la Base de Datos.
library('ROracle')
drv <- dbDriver("Oracle")
con <- dbConnect(drv,"friccio","oracle",dbname='132.68.1.30:1521/PRD')
#Obtención de los datos.
sql <- "select * from VREPORTE_ESPACIO"
rows <- dbGetQuery(con,sql)
print(rows)
dbDisconnect(con)

#Gráfico Lineal de los datos obtenidos.
Tamano_GB <- rows[,2]
plot(Tamano_GB, type="o", col="blue")
title(main="Tamaño de la Base de Datos", col.main="red", font.main=4)

#Calculo del Modelo de Regresión Lineal
x <- rows[,1]
y <- rows[,2]
RegLineal <- lm(formula=y~x)
summary(RegLineal)
#Revisar (pvalue de la variable y de la estadística F, ambos deben estar < 5%)
#      (R cuadrado ajustado)

#Prueba de Durbin-Watson, el pvalue debe > 5%
library(lmtest)
dwtest(RegLineal, alternative="two.sided")

#Prueba de Kolmogorov-Smirnov, el pvalue debe < 5%
residuos <- residuals(RegLineal)
shapiro.test(residuos)

#Proyectando el mes #75 con un intervalo de confianza del 99%
resultado <- predict(RegLineal, data.frame(x=75), interval="prediction", level=0.99)
tail(resultado)

Conclusión

Hemos podido comprobar que la estimación de Storage que requiere nuestra base de datos a un tiempo futuro lo podemos calcular con herramientas estadísticas como Oracle R Distribution, teniendo un fundamento más sólido en el análisis, ya que en muchas oportunidades realizamos nuestro cálculo vía una regla de tres o simplemente mencionamos un número sin mayor fundamento.

Oracle R provee todas las librerías estadísticas requeridas para cumplir con nuestro objetivo y gracias al paquete ROracle podemos extraer los datos de una base de datos Oracle de manera más simple y confiable. Oracle R también provee un paquete específico para trabajar con MySQL.


Francisco Riccio. Es un Cloud Architect en IBM Perú e instructor de cursos oficiales de certificación Oracle. Está reconocido por Oracle como un Oracle ACE y certificado en productos de Oracle Application & Base de Datos.

Este artículo ha sido revisado por el equipo de productos Oracle y se encuentra en cumplimiento de las normas y prácticas para el uso de los productos Oracle.