Im täglichen Betrieb müssen Oracle-Datenbankadministratoren eine erhebliche Anzahl von Metriken in Bezug auf Durchsatz, Auslastung, Wachstum des DBMS, DBMS-Hosts, Festplattensubsysteme usw. verfolgen. Alle diese Daten werden sorgfältig von Überwachungssystemen gesammelt und gespeichert. Damit die Informationen kein Eigengewicht haben, können sie für Prognosen in Bezug auf Größenprobleme und sogar für eine proaktive Überwachung verwendet werden. In diesem Beitrag werden wir zeigen, wie es geht.

Nehmen Sie Oracle Cloud Control. Im SYSMAN-Schema in der
MGMT_METRICS_1DAY
speichern wir den Wert der Metrik "Dateisystemspeicher verfügbar (MB)" für einen Host mit
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;
Die folgende Grafik zeigt, dass der freie Speicherplatz im Dateisystem / u01 für drei Monate vom 14. August 2018 bis zum 15. November 2018 um 1,5 TB von 4,1 TB auf 2,6 TB abnahm

Um die Zeit zu bestimmen, für die die verbleibenden 2,6 TB für uns ausreichen, wenden wir uns den linearen Regressionsfunktionen zu.
Oracle verwendet die Funktion
REGR_SLOPE(x,y)
, um die Steigung der Regressionslinie zu berechnen. Die Steigungsfunktion der Regressionsgeraden REGR_SLOPE wird durch das Verhältnis der Kovarianz der Mengen x und y zur Varianz der Menge y bestimmt:
REGR_SLOPE(x,y) = COVAR_POP(x,y) / VAR_POP(y)
Verwenden Sie die Funktion
REGR_INTERCEPT(x,y)
um die Erfassung der Y-Achse zu berechnen. Die Y-Achsen-
REGR_INTERCEPT
wird durch die Differenz zwischen dem Durchschnittswert der Menge x und dem Produkt der Steigung der Regressionslinie und dem Durchschnittswert der Menge y bestimmt:
REGR_INTERCEPT(x,y) = AVG(x) – REGR_SLOPE(x, y) * AVG(y)
Zur Berechnung des R-Quadrats oder des Bestimmungskoeffizienten wird die Funktion REGR_R2 (x, y) verwendet, die bei Nullvarianz y nicht definiert ist, bei Nulldispersion x gleich Eins und bei Nullvarianz y gleich Eins ist. Und im Fall einer positiven Varianz von x und einer Varianz ungleich Null von y ist gleich dem Quadrat der Korrelation von x und 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
Wir würden den Bestimmungskoeffizienten als eine Größe beschreiben, die den Prozentsatz der beschriebenen Variationen durch das Modell charakterisiert. Wenn der Bestimmungskoeffizient 1 ist, beschreibt unser Modell 100% der Variationen und unsere Prognose ist so genau wie möglich.
Wir schlagen vor, die Zeitdifferenz, in der die Metrik empfangen wird, und die aktuelle Zeit als x zu nehmen - ROLLUP_TIMESTAMP-SYSDATE. Als y nehmen wir den Durchschnittswert des freien verbleibenden Speicherplatzes / u01 in MB - "Dateisystemspeicher verfügbar (MB)". In diesem Fall können wir mithilfe der Funktion REGR_INTERCEPT (ROLLUP_TIMESTAMP-SYSDATE, VALUE_AVERAGE) als Gruppenfunktion schätzen, wie viele Tage der Speicherplatz / u01 ausgehen wird.
In erweiterter Form werden der Wert der Funktion der Steigung der Regressionslinie, das Abfangen der Achse und der Bestimmungskoeffizient durch die Abfrage erhalten:
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;
Oder verwenden Sie bereits die Funktionen
REGR_SLOPE
,
REGR_INTERCEPT
und
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
In unserem Fall liegt der Bestimmungskoeffizient nahe bei 1, und wir sehen, dass nach ungefähr 149 Tagen der Platz im / u10-Dateisystem endet.
Mit dieser Methode können wir die Zeit abschätzen, für die genügend Speicherplatz für die Hosts produktiver Datenbanken verfügbar ist. In unserem Fall sind die Hosts produktiver Datenbanken mit
METRIC_GUID='E8838C71E687BF0A9E02FFACC0C9AC80'
in der Gruppe
METRIC_GUID='E8838C71E687BF0A9E02FFACC0C9AC80'
.
Wir erstellen einen
User Definded Type T_TYPE
mit den Feldern, die wir für die Ausgabe benötigen: Hostname, Dateisystemname, Steigung der Regressionslinie, Anzahl der Tage, nach denen der Speicherplatz im Dateisystem endet, und Bestimmungskoeffizient.
CREATE OR REPLACE TYPE T_TYPE AS OBJECT(TARGET_NAME VARCHAR2(256), KEY_VALUE VARCHAR2(256), RSLP NUMBER,RINSP NUMBER,RSQR NUMBER);
Erstellen Sie einen verschachtelten Tabellentyp R_TYPE basierend auf T_TYPE:
CREATE OR REPLACE TYPE R_TYPE AS TABLE OF T_TYPE;
Wir erstellen ein Paket, das die Funktion
GET_VALUES
zum Extrahieren von Daten aus
MGMT_METRICS_1DAY
und die Prozedur zum Senden der empfangenen Daten per E-Mail
SEND_VALUES
.
CREATE OR REPLACE PACKAGE EST_FS_EXHAUST IS
Für die Funktion
GET_VALUES
Eingabeparameter die Variable
V_GN
mit dem Namen der
V_GN
und dem Wert des Bestimmungskoeffizienten
V_RSQ
.
FUNCTION GET_VALUES(V_GN VARCHAR2, V_RSQ NUMBER) RETURN R_TYPE;
Für die Prozedur
SEND_VALUES
Eingabeparameter die Variablen
V_GN
und
V_RSQ
, ähnlich den Variablen der Funktion
GET_VALUES
, sowie die E-Mail, an die wir unseren Mini-Bericht senden
GET_VALUES
.
PROCEDURE SEND_VALUES(V_GN VARCHAR2, V_RSQ NUMBER, V_MAIL VARCHAR2); END EST_FS_EXHAUST;
Im
GET_VALUES
definieren wir die Funktion
GET_VALUES
und die Prozedur
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; /
Angenommen, wir möchten die Zeit ermitteln, nach der der Platz in den Dateisystemen der produktiven Hostgruppe 'prod_hosts' mit einem Bestimmungskoeffizienten von mehr als 0,5 abläuft:
begin EST_FS_EXHAUST.SEND_VALUES('prod_hosts',0.5,'operator@yourdomain.com'); end; / PL/SQL procedure successfully completed.
Als Ergebnis kommt eine Nachricht in der Mail an:
Das Host-Host1-Dateisystem / u51 ist in 342 Tagen erschöpft
Host host2 filesystem / u40 wird in 236 Tagen erschöpft sein
Das Host-Host3-Dateisystem / u20 / redo01 ist in 1100310 Tagen erschöpftDas Host-Host4-Dateisystem / u10 ist in 150 Tagen erschöpft
Host Host4-Dateisystem / u01 / Integration wird in 75080 Tagen erschöpft sein
Das Host-Host4-Dateisystem / u01 / app ist in 135 Tagen erschöpft
Das Host-Host5-Dateisystem / u30 / redo01 ist in 62252596 Tagen erschöpftDas Host-Host6-Dateisystem / u01 ist in 260 Tagen erschöpft
Host host7 Dateisystem / u99 wird in 1038 Tagen erschöpft sein
Achten Sie auf die Dateisysteme / u20 / redo01 und / u30 / redo01 - hier sind die REDO-LOGS und der Platz wird nicht verschwendet. Unser Modell sagte voraus, dass der Platz in / u20 / redo01 auf Host3 in 2990 Jahren und in / u30 / redo01 auf Host5 in 169164 Jahren enden würde. In beiden Fällen beträgt die Steigung der Regressionslinie weniger als –1.
Die Verwendung dieser Methode kann erweitert werden, um beispielsweise die Zeit zu schätzen, bevor der Speicherplatz in FAST RECOVERY AREA, in Tabellenbereichen der Datenbank und in anderen Bereichen knapp wird.