En las operaciones cotidianas, los administradores de bases de datos Oracle deben realizar un seguimiento de un número significativo de métricas en términos de rendimiento, carga, crecimiento de DBMS, hosts DBMS, subsistemas de disco, etc. Todos estos datos son cuidadosamente recopilados y almacenados por los sistemas de monitoreo. Para que la información no tenga peso muerto, se puede usar para pronosticar en términos de problemas de tamaño e incluso monitoreo proactivo. En esta publicación demostraremos cómo hacerlo.

Tome Oracle Cloud Control. En el esquema SYSMAN en la
MGMT_METRICS_1DAY
, almacenamos el valor de la métrica "Espacio de sistema de archivos disponible (MB)" para un host con
TARGET_GUID = '6B1E3AFA92B3EA29AD73BB87432C084C'
.
SELECT TO_CHAR (CAST (ROLLUP_TIMESTAMP AS DATE), 'YYYY-MM-DD"T"HH24:MI:SS'), ROUND (VALUE_AVERAGE, 2) AVG_FREE_SPACE_INM FROM SYSMAN.MGMT_METRICS_1DAY WHERE TARGET_GUID = '6B1E3AFA92B3EA29AD73BB87432C084C' AND METRIC_GUID = HEXTORAW ('E8838C71E687BF0A9E02FFACC0C9AC80') AND KEY_VALUE = '/u10' ORDER BY ROLLUP_TIMESTAMP;
El siguiente gráfico muestra que durante tres meses, del 14 de agosto de 2018 al 15 de noviembre de 2018, el espacio libre en el sistema de archivos / u01 disminuyó en 1.5TB, de 4.1 TB a 2.6 TB

Para determinar el tiempo durante el cual los 2.6 TB restantes son suficientes para nosotros, pasamos a las funciones de regresión lineal.
Oracle usa la función
REGR_SLOPE(x,y)
para calcular la pendiente de la línea de regresión. La función de pendiente de la línea de regresión REGR_SLOPE está determinada por la razón de la covarianza de los conjuntos x e y a la varianza del conjunto y:
REGR_SLOPE(x,y) = COVAR_POP(x,y) / VAR_POP(y)
Para calcular la captura del eje Y, use la
REGR_INTERCEPT(x,y)
. La función de intercepción del eje Y
REGR_INTERCEPT
está determinada por la diferencia entre el valor promedio del conjunto x y el producto de la pendiente de la línea de regresión y el valor promedio del conjunto y:
REGR_INTERCEPT(x,y) = AVG(x) – REGR_SLOPE(x, y) * AVG(y)
Para calcular el cuadrado R o el coeficiente de determinación, se utiliza la función REGR_R2 (x, y), que no está definida para la varianza cero y y es igual a la unidad para la dispersión cero x y la varianza no nula y. Y en el caso de una varianza positiva de x y una varianza distinta de cero de y es igual al cuadrado de la correlación de x e y:
NULL if VAR_POP(y) = 0 1 if VAR_POP(x) = 0 and VAR_POP(y) != 0 POWER(CORR(expr1,expr),2) if VAR_POP(x) > 0 and VAR_POP(y) != 0
Describiríamos el coeficiente de determinación como una cantidad que caracteriza el porcentaje de las variaciones descritas por el modelo. Si el coeficiente de determinación es 1, nuestro modelo describe el 100% de las variaciones y nuestro pronóstico será lo más preciso posible.
Proponemos tomar como x la diferencia horaria en la que se recibe la métrica y la hora actual: ROLLUP_TIMESTAMP-SYSDATE. A medida que tomamos el valor promedio del espacio libre restante en disco / u01 en MB - "Espacio de sistema de archivos disponible (MB)". En este caso, utilizando la función REGR_INTERCEPT (ROLLUP_TIMESTAMP-SYSDATE, VALUE_AVERAGE) como una función de grupo, podemos estimar cuántos días se agotará el espacio en disco / u01.
En forma expandida, la consulta obtiene el valor de la función de la pendiente de la línea de regresión, la intercepción del eje y el coeficiente de determinación:
SELECT COVAR_POP (ROLLUP_TIMESTAMP - SYSDATE, NULLIF (ROUND (VALUE_AVERAGE, 2), 0)) / VAR_POP (NULLIF (ROUND (VALUE_AVERAGE, 2), 0)) REGR_SLOPE, AVG (ROLLUP_TIMESTAMP)- (COVAR_POP (SYSDATE - ROLLUP_TIMESTAMP, NULLIF (ROUND (VALUE_AVERAGE, 2), 0))/VAR_POP(NULLIF(ROUND(VALUE_AVERAGE, 2), 0)))*AVG (NULLIF (ROUND(VALUE_AVERAGE, 2), 0)) REGR_INTERCEPT, AVG (SYSDATE - ROLLUP_TIMESTAMP)-(COVAR_POP(SYSDATE - ROLLUP_TIMESTAMP,NULLIF(ROUND(VALUE_AVERAGE,2),0))/VAR_POP(NULLIF(ROUND(VALUE_AVERAGE,2),0)))*AVG(NULLIF(ROUND(VALUE_AVERAGE,2),0))) REGR_INTERCEPT_ABS, CASE WHEN VAR_POP (NULLIF (ROUND (VALUE_AVERAGE, 2), 0)) = 0 THEN NULL WHEN VAR_POP (SYSDATE - ROLLUP_TIMESTAMP) = 0 AND VAR_POP (NULLIF (ROUND (VALUE_AVERAGE, 2), 0)) != 0 THEN 1 WHEN VAR_POP (SYSDATE - ROLLUP_TIMESTAMP) > 0 AND VAR_POP (NULLIF (ROUND (VALUE_AVERAGE, 2), 0)) != 0 THEN POWER (CORR (SYSDATE - ROLLUP_TIMESTAMP, NULLIF (ROUND (VALUE_AVERAGE, 2), 0)),2) END REGR_R2 FROM MGMT_METRICS_1DAY WHERE TARGET_GUID = '6B1E3AFA92B3EA29AD73BB87432C084C' AND METRIC_GUID = HEXTORAW ('E8838C71E687BF0A9E02FFACC0C9AC80') AND KEY_VALUE = '/u10' ORDER BY ROLLUP_TIMESTAMP;
O ya usando las funciones
REGR_SLOPE
,
REGR_INTERCEPT
y
REGR_R2
:
SELECT REGR_SLOPE(SYSDATE-ROLLUP_TIMESTAMP, NULLIF(ROUND(VALUE_AVERAGE,2),0)) RSLP, REGR_INTERCEPT(SYSDATE-ROLLUP_TIMESTAMP, NULLIF(ROUND(VALUE_AVERAGE,2),0)) RINSP, REGR_R2(SYSDATE-ROLLUP_TIMESTAMP, NULLIF(ROUND(VALUE_AVERAGE,2),0)) RSQR FROM MGMT_METRICS_1DAY WHERE TARGET_GUID='6B1E3AFA92B3EA29AD73BB87432C084C' AND METRIC_GUID=HEXTORAW('E8838C71E687BF0A9E02FFACC0C9AC80') AND KEY_VALUE='/u10' ORDER BY ROLLUP_TIMESTAMP;
REGR_SLOPE = -0.00005 REGR_INTERCEPT = 149.46 REGR_R2 = 0.97
En nuestro caso, el coeficiente de determinación es cercano a 1, y vemos que después de aproximadamente 149 días el lugar en el sistema de archivos / u10 terminará.
Podemos usar este método para estimar el tiempo durante el cual tenemos suficiente espacio disponible en disco para los hosts de bases de datos productivas. En nuestro caso, los hosts de bases de datos productivas se incluyen en el grupo con
METRIC_GUID='E8838C71E687BF0A9E02FFACC0C9AC80'
.
Creamos un
User Definded Type T_TYPE
por el
User Definded Type T_TYPE
con los campos que necesitamos para la salida: nombre de host, nombre del sistema de archivos, pendiente de la línea de regresión, el número de días después de los cuales finaliza el espacio en el sistema de archivos y el coeficiente de determinación.
CREATE OR REPLACE TYPE T_TYPE AS OBJECT(TARGET_NAME VARCHAR2(256), KEY_VALUE VARCHAR2(256), RSLP NUMBER,RINSP NUMBER,RSQR NUMBER);
Cree un tipo de tabla anidada R_TYPE basado en T_TYPE:
CREATE OR REPLACE TYPE R_TYPE AS TABLE OF T_TYPE;
Creamos un paquete que incluye la función
GET_VALUES
para extraer datos de
MGMT_METRICS_1DAY
y el procedimiento para enviar los datos recibidos por correo
SEND_VALUES
.
CREATE OR REPLACE PACKAGE EST_FS_EXHAUST IS
Para la función
GET_VALUES
parámetros de entrada serán la variable
V_GN
con el nombre del grupo host y el valor del coeficiente de determinación
V_RSQ
.
FUNCTION GET_VALUES(V_GN VARCHAR2, V_RSQ NUMBER) RETURN R_TYPE;
Para el procedimiento
SEND_VALUES
parámetros de entrada serán las variables
V_GN
y
V_RSQ
, similares a las variables de la función
GET_VALUES
, más el correo electrónico al que planeamos enviar nuestro mini informe.
PROCEDURE SEND_VALUES(V_GN VARCHAR2, V_RSQ NUMBER, V_MAIL VARCHAR2); END EST_FS_EXHAUST;
En el cuerpo del paquete, definimos la función
GET_VALUES
y el procedimiento
SEND_VALUES
CREATE OR REPLACE PACKAGE BODY EST_FS_EXHAUST IS FUNCTION GET_VALUES(V_GN VARCHAR2, V_RSQ NUMBER) RETURN R_TYPE AS V_REC R_TYPE; BEGIN SELECT T_TYPE( M.TARGET_NAME, D.KEY_VALUE, ROUND(REGR_SLOPE(D.ROLLUP_TIMESTAMP-SYSDATE, NULLIF(ROUND(D.VALUE_AVERAGE,2),0)),0), ROUND((ABS(REGR_INTERCEPT(D.ROLLUP_TIMESTAMP-SYSDATE, NULLIF(ROUND(D.VALUE_AVERAGE,2),0)))),0), ROUND(REGR_R2(D.ROLLUP_TIMESTAMP-SYSDATE, NULLIF(ROUND(D.VALUE_AVERAGE,2),0)),0)) BULK COLLECT INTO V_REC FROM MGMT_METRICS_1DAY D, MGMT_TARGETS M, MGMT_TARGET_MEMBERSHIPS G WHERE M.TARGET_GUID=G.MEMBER_TARGET_GUID AND M.TARGET_GUID=D.TARGET_GUID AND G.COMPOSITE_TARGET_NAME=V_GN AND METRIC_GUID=HEXTORAW('E8838C71E687BF0A9E02FFACC0C9AC80') GROUP BY M.TARGET_NAME, D.KEY_VALUE HAVING REGR_R2(D.ROLLUP_TIMESTAMP-SYSDATE, NULLIF(ROUND(D.VALUE_AVERAGE,2),0)) > V_RSQ ; RETURN V_REC; END GET_VALUES; PROCEDURE SEND_VALUES(V_GN VARCHAR2, V_RSQ NUMBER, V_MAIL VARCHAR2) IS V_REC R_TYPE; MSG VARCHAR2(2048):=''; BEGIN V_REC:= GET_VALUES(V_GN,V_RSQ); FOR I IN V_REC.FIRST..V_REC.LAST LOOP MSG:=CHR(10)||MSG||' Host '||V_REC(I).TARGET_NAME||' filesystem '||V_REC(I).KEY_VALUE||' will be exhausted in '||V_REC(I).RINSP||' days'|| CHR(9)||CHR(10); END LOOP; EXECUTE IMMEDIATE 'ALTER SESSION SET smtp_out_server = ''mail_server'''; UTL_MAIL.SEND(SENDER => 'monitoring@yourmail.com', RECIPIENTS => V_MAIL, SUBJECT => 'Test Mail', MESSAGE => MSG, MIME_TYPE => 'text; charset=us-ascii'); END; END EST_FS_EXHAUST; /
Supongamos que queremos obtener el tiempo después del cual el lugar en los sistemas de archivos del grupo de servidores productivo 'prod_hosts' expira con un coeficiente de determinación mayor que 0.5:
begin EST_FS_EXHAUST.SEND_VALUES('prod_hosts',0.5,'operator@yourdomain.com'); end; / PL/SQL procedure successfully completed.
Como resultado, llega un mensaje por correo:
El sistema de archivos host host1 / u51 se agotará en 342 días
El sistema de archivos host host2 / u40 se agotará en 236 días
El sistema de archivos host host3 / u20 / redo01 se agotará en 1100310 díasEl sistema de archivos host host4 / u10 se agotará en 150 días
El sistema de archivos host host4 / u01 / integración se agotará en 75080 días
El host host4 filesystem / u01 / app se agotará en 135 días
El sistema de archivos host host5 / u30 / redo01 se agotará en 62252596 díasEl sistema de archivos host host6 / u01 se agotará en 260 días
El sistema de archivos host host7 / u99 se agotará en 1038 días
Preste atención a los sistemas de archivos / u20 / redo01 y / u30 / redo01: aquí están los REGISTROS REDO y el lugar no se desperdicia. Nuestro modelo predijo que el lugar en / u20 / redo01 en host3 terminaría en 2990 años, y en / u30 / redo01 en host5 en 169164 años. En ambos casos, la pendiente de la línea de regresión es menor que -1.
El uso de este método se puede ampliar, por ejemplo, para estimar el tiempo antes de quedarse sin espacio en el ÁREA DE RECUPERACIÓN RÁPIDA, en los espacios de tablas de la base de datos y otras áreas.