在日常操作中,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_SLOPE
,
REGR_INTERCEPT
和
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
在我们的例子中,确定系数接近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_GN
和
V_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。
可以扩展此方法的使用-例如,估计数据库和其他区域的表空间中快速恢复区域中的空间用尽之前的时间。