Dans les opérations quotidiennes, les administrateurs de base de données Oracle doivent suivre un nombre important de mesures en termes de débit, de charge, de croissance du SGBD, des hôtes SGBD, des sous-systèmes de disques, etc. Toutes ces données sont soigneusement collectées et stockées par des systèmes de surveillance. Pour que l'information ne repose pas sur un poids mort, elle peut être utilisée pour la prévision en termes de problèmes de dimensionnement et même de suivi proactif. Dans cet article, nous vous montrerons comment procéder.

Prenez Oracle Cloud Control. Dans le schéma SYSMAN, dans la
MGMT_METRICS_1DAY
, nous stockons la valeur de la métrique «Espace de système de fichiers disponible (Mo)» pour un hôte avec
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;
Le graphique ci-dessous montre que pendant trois mois, du 14 août 2018 au 15 novembre 2018, l'espace libre dans le système de fichiers / u01 a diminué de 1,5 To - de 4,1 To à 2,6 To

Pour déterminer le temps pendant lequel les 2,6 To restants nous suffisent, nous nous tournons vers les fonctions de régression linéaire.
Oracle utilise la fonction
REGR_SLOPE(x,y)
pour calculer la pente de la droite de régression. La fonction de pente de la droite de régression REGR_SLOPE est déterminée par le rapport de la covariance des ensembles x et y à la variance de l'ensemble y:
REGR_SLOPE(x,y) = COVAR_POP(x,y) / VAR_POP(y)
Pour calculer la capture de l'axe Y, utilisez la fonction
REGR_INTERCEPT(x,y)
. La fonction d'interception d'axe Y
REGR_INTERCEPT
est déterminée par la différence entre la valeur moyenne de l'ensemble x et le produit de la pente de la droite de régression et la valeur moyenne de l'ensemble y:
REGR_INTERCEPT(x,y) = AVG(x) – REGR_SLOPE(x, y) * AVG(y)
Pour calculer le carré R ou le coefficient de détermination, la fonction REGR_R2 (x, y) est utilisée, qui n'est pas définie à une variance nulle y, est égale à l'unité à une dispersion nulle x et à une variance non nulle y. Et dans le cas d'une variance positive de x et d'une variance non nulle de y est égal au carré de la corrélation de x et 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
Nous décririons le coefficient de détermination comme une quantité caractérisant le pourcentage des variations décrites par le modèle. Si le coefficient de détermination est 1, alors notre modèle décrit 100% des variations et notre prévision sera aussi précise que possible.
Nous proposons de prendre comme x la différence de temps dans laquelle la métrique est reçue et l'heure actuelle - ROLLUP_TIMESTAMP-SYSDATE. Comme nous prenons la valeur moyenne de l'espace disque restant libre / u01 en Mo - «Espace du système de fichiers disponible (Mo)». Dans ce cas, en utilisant la fonction REGR_INTERCEPT (ROLLUP_TIMESTAMP-SYSDATE, VALUE_AVERAGE) comme fonction de groupe, nous pouvons estimer combien de jours l'espace disque / u01 va s'épuiser.
Sous forme développée, la valeur de la fonction de la pente de la droite de régression, l'interception de l'axe et le coefficient de détermination sont obtenus par la requête:
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 déjà en utilisant les fonctions
REGR_SLOPE
,
REGR_INTERCEPT
et
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
Dans notre cas, le coefficient de détermination est proche de 1, et nous voyons qu'après environ 149 jours, la place sur le système de fichiers / u10 prendra fin.
Nous pouvons utiliser cette méthode pour estimer le temps pendant lequel nous avons suffisamment d'espace disque disponible pour les hôtes des bases de données productives. Dans notre cas, les hôtes des bases de données productives sont inclus dans le groupe avec
METRIC_GUID='E8838C71E687BF0A9E02FFACC0C9AC80'
.
Nous créons un
User Definded Type T_TYPE
par l'
User Definded Type T_TYPE
avec les champs dont nous avons besoin pour la sortie: nom d'hôte, nom du système de fichiers, pente de la ligne de régression, nombre de jours après lesquels l'espace sur le système de fichiers se termine et le coefficient de détermination.
CREATE OR REPLACE TYPE T_TYPE AS OBJECT(TARGET_NAME VARCHAR2(256), KEY_VALUE VARCHAR2(256), RSLP NUMBER,RINSP NUMBER,RSQR NUMBER);
Créez un type de table imbriquée R_TYPE basé sur T_TYPE:
CREATE OR REPLACE TYPE R_TYPE AS TABLE OF T_TYPE;
Nous créons un package qui inclut la fonction
GET_VALUES
pour extraire les données de
MGMT_METRICS_1DAY
et la procédure d'envoi des données reçues par mail
SEND_VALUES
.
CREATE OR REPLACE PACKAGE EST_FS_EXHAUST IS
Pour la fonction
GET_VALUES
paramètres d'entrée seront la variable
V_GN
avec le nom du groupe d'hôtes et la valeur du coefficient de détermination
V_RSQ
.
FUNCTION GET_VALUES(V_GN VARCHAR2, V_RSQ NUMBER) RETURN R_TYPE;
Pour la procédure
SEND_VALUES
paramètres d'entrée seront les variables
V_GN
et
V_RSQ
, similaires aux variables de la fonction
GET_VALUES
, plus l'e-mail auquel nous prévoyons d'envoyer notre mini-rapport.
PROCEDURE SEND_VALUES(V_GN VARCHAR2, V_RSQ NUMBER, V_MAIL VARCHAR2); END EST_FS_EXHAUST;
Dans le corps du package, nous définissons la fonction
GET_VALUES
et la procédure
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; /
Supposons que nous voulons obtenir le temps après lequel la place dans les systèmes de fichiers du groupe d'hôtes productif «prod_hosts» expire avec un coefficient de détermination supérieur à 0,5:
begin EST_FS_EXHAUST.SEND_VALUES('prod_hosts',0.5,'operator@yourdomain.com'); end; / PL/SQL procedure successfully completed.
En conséquence, un message arrive par la poste:
Le système de fichiers hôte host1 / u51 sera épuisé dans 342 jours
Le système de fichiers hôte host2 / u40 sera épuisé dans 236 jours
Le système de fichiers hôte host3 / u20 / redo01 sera épuisé dans 1100310 joursLe système de fichiers hôte host4 / u10 sera épuisé dans 150 jours
Le système de fichiers host4 host / u01 / intégration sera épuisé dans 75080 jours
L'hôte host4 filesystem / u01 / app sera épuisé dans 135 jours
Le système de fichiers hôte host5 / u30 / redo01 sera épuisé dans 62252596 joursLe système de fichiers hôte host6 / u01 sera épuisé dans 260 jours
Le système de fichiers hôte host7 / u99 sera épuisé dans 1038 jours
Faites attention aux systèmes de fichiers / u20 / redo01 et / u30 / redo01 - voici les JOURNAUX REDO et l'endroit n'est pas perdu. Notre modèle a prédit que la place dans / u20 / redo01 sur l'hôte3 se terminerait dans 2990 ans et dans / u30 / redo01 sur l'hôte5 dans 169164 ans. Dans les deux cas, la pente de la droite de régression est inférieure à –1.
L'utilisation de cette méthode peut être étendue - par exemple, pour estimer le temps avant de manquer d'espace dans FAST RECOVERY AREA, dans les espaces table de la base de données et d'autres zones.