Oracle Statspack

Eine sehr gute Zusammenfassung zum Statspack hab ich gefunden am 30.01.2007 bei MuniqSoft unter http://www.muniqsoft.de/tipps/dba/dba_allgemein.htm

(mit eigenen Ergänzungen/Anpassungen)

STATSPACK

Um die Effizienz bzw. Verfügbarkeit einer Datenbank zu überwachen, oder um bereits vorhandene Ressourcenengpässe zu lokalisieren, stellt Oracle ab dem Release 8.1.6 ein sehr zuverlässiges Tool zur Statistiksammlung zur Verfügung. Mit STATSPACK können Statistiken über sämtliche Bereiche der Datenbank erstellt werden.

Installieren von STATSPACK

Nachdem das Skript "spcreate.sql" (vor Release 8.1.7 => "statscre.sql"), nach dem Prinzip von UTLB/ESTAT, Tabellen zum Speichern von den Snapshotwerten anlegt, sollte vor der Installation ein separater Tablespace angelegt werden der min. 180 MB groß ist (wegen Fragmentierung nicht System Tablespace verwenden).
Skript in SQL*PLUS (nicht im Server Manager oder SQL*Worksheet) als SYS oder INTERNAL aufrufen.

SQL>@?\rdmbs\admin\spcreate.sql


Während der Abarbeitung wird der User PERFSTAT (Passwort PERFSTAT) angelegt und es wird ihm der default Tablespace, sowie der temporary Tablespace zugewiesen, die explizit abgefragt werden.
Über die Prozedur "statspack.snap" können nun die aktuellen Performance Werte aus den v$Views gespeichert werden.

SQL>EXEC statspack.snap


Um eine kontinuierliche Sammlung zu automatisieren, kann über das Skript "spauto.sql" ein JOB eingerichtet werden, der zu jeder vollen Stunde einen Snapshot speichert. Dynamischer Initora Parameter "JOB_QUEUE_PROCESSES" muß >0 sein.

SQL>@?\rdbms\admin\spauto.sql


Um den Job zu modifizieren (z.B. Intervall ändern) wird die, in der Tabelle "dba_jobs", gespeicherte Job- ID benötigt.

Job- Id auslesen:

SQL> SELECT job, interval, instance FROM dba_jobs
WHERE what LIKE '%statspack%';


Intervall auf z.B. 2 Std. ändern: Syntax: dbms_job.interval(, '');

SQL>EXEC dbms_job.interval(1, 'sysdate+1/12');


Divisor wird errechnet durch:

1440 min pro Tag 1440
----------------- ----- = 12
Intervall in min. 120

Job unterbrechen: SQL>EXEC dbms_job.broken(1,true);
Job wieder starten: SQL>EXEC dbms_job.run(1);
Job löschen: SQL>EXEC dbms_job.remove(1);


Die einzelnen Snapshots werden in der Tabelle "stats$snapshot" gespeichert.

SQL> SELECT snap_id, to_char(snap_time,'dd.mm.yyyy hh:mi')
FROM stats$snapshot;


Über das Skript "spreport.sql" einen Report erzeugen:

SQL>@?\rdbms\admin\spreport.sql


Nach Aufruf werden alle verfügbaren Snapshots aufgelistet und es wird zur Eingabe der Snap- Id`s aufgefordert, über die ein Report erzeugt werden soll, sowie der Name der Reportdatei. Wird kein Name vergeben, benennt Oracle die Datei selbst und orientiert sich bei der Namensvergabe an der Anfangs- und End Snap- Id (z.B. sp_11_21.LST).

Nicht mehr benötigte Snapshots können über das Skript "sppurge.sql" automatisch gelöscht werden. Während Ablauf des Skriptes fordert Oracle zur Eingabe der Anfangs- und End Snap-Id auf und löscht alle in diesem Bereich liegenden Snapshots.
Nachdem alle von STATSPACK angelegten Tabellen über Constraints miteinander verbunden sind, besteht auch die Möglichkeit Snapshots nach anderen Kriterien aus der Tabelle "stats$snapshot" zu löschen. Alle referenzierten Datensätze in anderen Tabellen werden durch die automatisch angehängte Option "on cascade delete" mit gelöscht.

SQL>DELETE FROM stats$snapshot WHERE snap_time <>Es ist zu beachten, daß der Löschvorgang ein großes Rollbacksegment benötigt. Dieses evtl. zuvor explizit zuweisen.

SQL> SET TRANSACTION USE ROLLBACK SEGMENT xxl_rbs;

Kommentare

Beliebte Posts aus diesem Blog

PGA unter Oracle 11g

trunc(sysdate) - nette Spiele mit dem Datum

Datapump - Verzeichnis erstellen