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 diasO 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 diasO 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.