Como usar métodos de mínimos quadrados para avaliar recursos e monitorar bancos de dados Oracle

Nas operações diárias, os administradores de banco de dados Oracle precisam rastrear um número significativo de métricas em termos de taxa de transferência, carga, crescimento do DBMS, hosts do DBMS, subsistemas de disco etc. Todos esses dados são cuidadosamente coletados e armazenados pelos sistemas de monitoramento. Para que as informações não atinjam o peso morto, elas podem ser usadas para previsão em termos de problemas de dimensionamento e até mesmo monitoramento proativo. Neste post, demonstraremos como fazê-lo.



Tome o Oracle Cloud Control. No esquema SYSMAN na MGMT_METRICS_1DAY , armazenamos o valor da métrica "Espaço disponível no sistema de arquivos (MB)" para um host com 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; 

O gráfico abaixo mostra que, durante três meses, de 14 de agosto de 2018 a 15 de novembro de 2018, o espaço livre no sistema de arquivos / u01 diminuiu 1,5 TB - de 4,1 TB para 2,6 TB



Para determinar o tempo pelo qual os 2,6 TB restantes são suficientes para nós, passamos às funções de regressão linear.

O Oracle usa a função REGR_SLOPE(x,y) para calcular a inclinação da linha de regressão. A função de inclinação da linha de regressão REGR_SLOPE é determinada pela razão de covariância dos conjuntos xey para a variação do conjunto y:

 REGR_SLOPE(x,y) = COVAR_POP(x,y) / VAR_POP(y) 

Para calcular a captura do eixo Y, use a função REGR_INTERCEPT(x,y) . A função de interceptação do eixo Y REGR_INTERCEPT é determinada pela diferença entre o valor médio do conjunto x e o produto da inclinação da linha de regressão e o valor médio do conjunto y:

 REGR_INTERCEPT(x,y) = AVG(x) – REGR_SLOPE(x, y) * AVG(y) 

Para calcular o quadrado R ou o coeficiente de determinação, é usada a função REGR_R2 (x, y), que não é definida para a variância zero y e é igual à unidade para a dispersão zero x e a variação diferente de zero y. E no caso de uma variação positiva de x e uma variação diferente de zero de y é igual ao quadrado da correlação de xey:

 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 

Nós descreveríamos o coeficiente de determinação como uma quantidade que caracteriza a porcentagem das variações descritas pelo modelo. Se o coeficiente de determinação for 1, nosso modelo descreverá 100% das variações e nossa previsão será a mais precisa possível.

Propomos considerar como x a diferença horária na qual a métrica é recebida e a hora atual - ROLLUP_TIMESTAMP-SYSDATE. Como y, assumimos o valor médio do espaço livre em disco restante / u01 em MB - “Espaço disponível no sistema de arquivos (MB)”. Nesse caso, usando a função REGR_INTERCEPT (ROLLUP_TIMESTAMP-SYSDATE, VALUE_AVERAGE) como uma função de grupo, podemos estimar quantos dias o espaço em disco / u01 acabará.

De forma expandida, o valor da função da inclinação da linha de regressão, a interceptação do eixo e o coeficiente de determinação são obtidos pela consulta:

 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; 

Ou já usando as funções REGR_SLOPE , REGR_INTERCEPT e 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 

No nosso caso, o coeficiente de determinação é próximo de 1 e vemos que, após cerca de 149 dias, o local no sistema de arquivos / u10 será encerrado.

Podemos usar esse método para estimar o tempo pelo qual temos espaço em disco disponível suficiente para os hosts de bancos de dados produtivos. No nosso caso, os hosts de bancos de dados produtivos estão incluídos no grupo com METRIC_GUID='E8838C71E687BF0A9E02FFACC0C9AC80' .

Criamos um User Definded Type T_TYPE pelo User Definded Type T_TYPE com os campos necessários para a saída: nome do host, nome do sistema de arquivos, inclinação da linha de regressão, o número de dias após o qual o espaço no sistema de arquivos termina e o coeficiente de determinação.

 CREATE OR REPLACE TYPE T_TYPE AS OBJECT(TARGET_NAME VARCHAR2(256), KEY_VALUE VARCHAR2(256), RSLP NUMBER,RINSP NUMBER,RSQR NUMBER); 

Crie um tipo de tabela aninhada R_TYPE com base em T_TYPE:

 CREATE OR REPLACE TYPE R_TYPE AS TABLE OF T_TYPE; 

Criamos um pacote que inclui a função GET_VALUES para extrair dados de MGMT_METRICS_1DAY e o procedimento para enviar os dados recebidos por correio SEND_VALUES .

 CREATE OR REPLACE PACKAGE EST_FS_EXHAUST IS 

Para a função GET_VALUES parâmetros de entrada serão a variável V_GN com o nome do grupo de hosts e o valor do coeficiente de determinação V_RSQ .

 FUNCTION GET_VALUES(V_GN VARCHAR2, V_RSQ NUMBER) RETURN R_TYPE; 

Para o procedimento SEND_VALUES parâmetros de entrada serão as variáveis V_GN e V_RSQ , semelhantes às variáveis ​​da função GET_VALUES , além do email para o qual planejamos enviar nosso mini-relatório.

 PROCEDURE SEND_VALUES(V_GN VARCHAR2, V_RSQ NUMBER, V_MAIL VARCHAR2); END EST_FS_EXHAUST; 

No corpo do pacote, definimos a função GET_VALUES e o procedimento 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; / 

Suponha que desejemos obter o tempo após o qual o local nos sistemas de arquivos do grupo de hosts produtivo 'prod_hosts' expira com um coeficiente de determinação maior que 0,5:

 begin EST_FS_EXHAUST.SEND_VALUES('prod_hosts',0.5,'operator@yourdomain.com'); end; / PL/SQL procedure successfully completed. 

Como resultado, uma mensagem chega pelo correio:

O sistema de arquivos host1 host / u51 será esgotado em 342 dias
O host host2 filesystem / u40 estará esgotado em 236 dias
O sistema de arquivos host3 do host / u20 / redo01 será esgotado em 1100310 dias
O sistema de arquivos host4 host / u10 será esgotado em 150 dias
O sistema de arquivos host4 host / u01 / integração será esgotado em 75080 dias
O sistema de arquivos host4 host / u01 / app será esgotado em 135 dias
O sistema de arquivos host5 do host / u30 / redo01 será esgotado em 62252596 dias
O sistema de arquivos host6 host / u01 será esgotado em 260 dias
O sistema de arquivos host7 do host / u99 será esgotado em 1038 dias

Preste atenção aos sistemas de arquivos / u20 / redo01 e / u30 / redo01 - aqui estão os REDO LOGS e o local não é desperdiçado. Nosso modelo previu que o local em / u20 / redo01 no host3 terminaria em 2990 anos e em / u30 / redo01 no host5 em 169164 anos. Nos dois casos, a inclinação da linha de regressão é menor que –1.

O uso desse método pode ser expandido - por exemplo, para estimar o tempo antes de ficar sem espaço na FAST RECOVERY AREA, nos espaços de tabela do banco de dados e em outras áreas.

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


All Articles