Cómo utilizar métodos de mínimos cuadrados para evaluar recursos y monitorear bases de datos Oracle

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ías
El 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ías
El 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.

Source: https://habr.com/ru/post/es431112/


All Articles