Comment utiliser les méthodes des moindres carrés pour évaluer les ressources et surveiller les bases de données Oracle

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 jours
Le 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 jours
Le 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.

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


All Articles