如何使用最小二乘法来评估资源和监视Oracle数据库

在日常操作中,Oracle数据库管理员需要在吞吐量,负载,DBMS,DBMS主机,磁盘子系统等的吞吐量,负载,增长方面跟踪大量指标。 所有这些数据均由监视系统仔细收集和存储。 为了使信息不会沉重,可以将其用于规模问题甚至是主动监视方面的预测。 在这篇文章中,我们将演示如何做到这一点。



以Oracle Cloud Control为例。 在MGMT_METRICS_1DAY的SYSMAN方案中,我们为TARGET_GUID = '6B1E3AFA92B3EA29AD73BB87432C084C'的主机存储“文件系统可用空间(MB)”度量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; 

下图显示从2018年8月14日到2018年11月15日的三个月中,/ u01文件系统中的可用空间减少了1.5TB-从4.1 TB减少到2.6 TB



为了确定剩余的2.6 TB对我们来说足够的时间,我们转向线性回归函数。

Oracle使用REGR_SLOPE(x,y)函数来计算回归线的斜率。 回归线REGR_SLOPE的斜率函数由集合x和y的协方差与集合y的方差之比确定:

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

要计算Y轴的捕获量,请使用REGR_INTERCEPT(x,y)函数。 Y轴截距函数REGR_INTERCEPT由集合x的平均值与回归线的斜率与集合y的平均值的乘积之差确定:

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

为了计算R平方或确定系数,使用函数REGR_R2(x,y),该函数未针对零方差y定义,对于零色散x和非零方差y等于1。 并且在x的正方差和y的非零方差的情况下等于x和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 

我们将确定系数描述为表征模型描述的变化百分比的数量。 如果确定系数为1,则我们的模型将描述100%的变化,并且我们的预测将尽可能准确。

我们建议将x用作接收度量标准的时间差和当前时间-ROLLUP_TIMESTAMP-SYSDATE。 与y相同,我们以MB的剩余可用磁盘空间/ u01的平均值-“文件系统可用空间(MB)”为单位。 在这种情况下,使用REGR_INTERCEPT函数(ROLLUP_TIMESTAMP-SYSDATE,VALUE_AVERAGE)作为组函数,我们可以估计磁盘空间/ u01将用完多少天。

通过展开形式,可通过查询获得回归线的斜率,轴的截距和确定系数的函数值:

 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; 

或已经使用了函数REGR_SLOPEREGR_INTERCEPTREGR_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 

在我们的例子中,确定系数接近1,我们看到大约149天后/ u10文件系统上的位置将结束。

我们可以使用这种方法来估计我们有足够的磁盘空间用于生产数据库主机的时间。 在我们的情况下,生产数据库的主机包含在METRIC_GUID='E8838C71E687BF0A9E02FFACC0C9AC80'

我们User Definded Type T_TYPE的字段创建User Definded Type T_TYPE :主机名,文件系统名称,回归线的斜率,文件系统上的空间结束的天数以及确定系数。

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

基于T_TYPE创建嵌套表类型R_TYPE:

 CREATE OR REPLACE TYPE R_TYPE AS TABLE OF T_TYPE; 

我们创建一个包含MGMT_METRICS_1DAY函数的GET_VALUES包,该函数用于从MGMT_METRICS_1DAY提取数据,以及通过邮件SEND_VALUES发送接收的数据的SEND_VALUES

 CREATE OR REPLACE PACKAGE EST_FS_EXHAUST IS 

对于GET_VALUES函数GET_VALUES输入参数将是V_GN变量,具有主机组的名称和确定系数V_RSQ的值。

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

对于过程SEND_VALUES输入参数将是变量V_GNV_RSQ ,类似于V_RSQ函数的变量,以及我们计划向其发送小型报告的电子邮件。

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

在包主体中,我们定义SEND_VALUES函数和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; / 

假设我们要获得一个时间,在该时间之后生产性主机组“ prod_hosts”在文件系统中的位置将以大于0.5的确定系数到期:

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

结果,邮件中出现一条消息:

主机host1文件系统/ u51将在342天内耗尽
主机host2文件系统/ u40将在236天内用尽
主机host3文件系统/ u20 / redo01将在1100310天之内用完
主机host4文件系统/ u10将在150天内耗尽
主机host4文件系统/ u01 /集成将在75080天内用尽
主机host4文件系统/ u01 /应用将在135天内耗尽
主机host5文件系统/ u30 / redo01将在62252596天内耗尽
主机host6文件系统/ u01将在260天内耗尽
主机host7文件系统/ u99将在1038天内耗尽

注意文件系统/ u20 / redo01和/ u30 / redo01-这是REDO LOGS,并且不会浪费该位置。 我们的模型预测,host3上的/ u20 / redo01中的位置将在2990年后结束,host5上的/ u30 / redo01中的位置将在169164年后结束。 在这两种情况下,回归线的斜率均小于–1。

可以扩展此方法的使用-例如,估计数据库和其他区域的表空间中快速恢复区域中的空间用尽之前的时间。

Source: https://habr.com/ru/post/zh-CN431112/


All Articles