Überwachung der temporären Nutzung von Oracle

Es scheint, dass der temporäre Tablespace von Oracle für einige immer noch ein Rätsel ist, möglicherweise weil er nicht auf die gleiche Weise wie ein herkömmlicher Tablespace verwaltet wird. Extents werden zugewiesen und wiederverwendet, sodass die Speicherplatzverwaltung für einen herkömmlichen Tablespace nicht so aussieht. Aus diesem Grund werden Speicherfehler unterschiedlich verwaltet. Schauen wir uns an, wie ein temporärer Tablespace verwaltet wird und welche Tools dem DBA zur Verfügung stehen.

Ab Version 8.1.5 Oracle hat einen ‚echten‘ temporären Tablespace bereitgestellt, in dem Extents zugewiesen und Sitzungen zugewiesen werden, wenn sie benötigt werden. Die Extents werden niemals gelöscht, während die Datenbank ausgeführt wird, sodass ein ordnungsgemäß verwendeter temporärer Tablespace immer 0 ‚freien‘ Speicherplatz hat. In diesem Sinne bedeutet ‚frei‘ nicht zugewiesen, und alles im temporären Tablespace wird zugewiesen, aber das bedeutet nicht, dass es verwendet wird. Aus diesem Grund hat herkömmliches Platzmanagement im temporären Tablespace keinen Platz.

Wie WIRD der temporäre Tablespace verwaltet? Dies geschieht über mehrere V $ -Ansichten:

V$TEMPFILE V$TEMPSTAT V$TEMP_EXTENT_MAP V$TEMP_EXTENT_POOL V$TEMP_SPACE_HEADER V$TEMPSEG_USAGE (Oracle 9i und spätere Versionen) V$SORT_USAGE (Oracle 8.1.7, 8.1.6 und 8.1.5)

V$TEMP_EXTENT_MAP meldet alle zugewiesenen Extents im temporären Tablespace:

SQL> desc v$temp_extent_map Name Null? Type ----------------------------------------- -------- ---------------------------- TABLESPACE_NAME NOT NULL VARCHAR2(30) FILE_ID NUMBER BLOCK_ID NUMBER BYTES NUMBER BLOCKS NUMBER OWNER NUMBER RELATIVE_FNO NUMBER

Die hilfreichsten Ansichten zum Verwalten temporärer Tablespaces sind V$TEMP_EXTENT_POOL und V$TEMPSEG_USAGE/V$SORT_USAGE . V$TEMP_EXTENT_POOL listet nicht nur die zugewiesenen Extents auf, sondern meldet auch alle verwendeten Extents in einem temporären Tablespace per Tempfile:

SQL> desc v$temp_extent_pool Name Null? Type ----------------------------------------- -------- ---------------------------- TABLESPACE_NAME NOT NULL VARCHAR2(30) FILE_ID NUMBER EXTENTS_CACHED NUMBER EXTENTS_USED NUMBER BLOCKS_CACHED NUMBER BLOCKS_USED NUMBER BYTES_CACHED NUMBER BYTES_USED NUMBER RELATIVE_FNO NUMBER

V$TEMPSEG_USAGE (oder, wenn Sie es vorziehen, V$SORT_USAGE) zeigt die temporäre Segmentnutzung nach Benutzer für alle Tablespaces an:

SQL> desc v$tempseg_usage Name Null? Type ----------------------------------------- -------- ---------------------------- USERNAME VARCHAR2(30) USER VARCHAR2(30) SESSION_ADDR RAW(8) SESSION_NUM NUMBER SQLADDR RAW(8) SQLHASH NUMBER SQL_ID VARCHAR2(13) TABLESPACE VARCHAR2(31) CONTENTS VARCHAR2(9) SEGTYPE VARCHAR2(9) SEGFILE# NUMBER SEGBLK# NUMBER EXTENTS NUMBER BLOCKS NUMBER SEGRFNO# NUMBER 

Die Überwachung der temporären Tablespace-Nutzung ist eine einfache Aufgabe zum Abfragen von V $ TEMPSEG_USAGE (V $ SORT_USAGE, falls dies bevorzugt wird) im Laufe der Zeit:

select segtype, extents, blocksfrom v$tempseg_usagewhere tablespace = 'TEMP';

Denken Sie daran, dass eine solche Überwachung keine verwertbaren Daten liefert; Es sei denn, die Datenbank meldet Fehler beim Zuweisen von temporärem Speicherplatz, der DBA hat wirklich nichts zu tun.

Wenn Sie wissen möchten, wie viele Extents pro Datendatei zugewiesen und tatsächlich verwendet werden, erzeugt die folgende Abfrage einen ziemlich nützlichen Bericht:

select tablespace_name, file_id, extents_cached extents_allocated, extents_used, bytes_cached/1024/1024 mb_allocated, bytes_used/1024/1024 mb_usedfrom v$temp_extent_pool/

Auch hier müssen keine Maßnahmen auf der Grundlage eines solchen Berichts ergriffen werden; Es dient lediglich zu Informationszwecken.

Wer verwendet Ihren temporären Bereich, welche Abfragen werden ausgeführt und wie viel von diesem Speicherplatz wird jeweils verbraucht? Das ist auch eine ziemlich einfache Aufgabe:

select u.username, s.sql_fulltext, u.segtype, u.extents, u.blocksfrom v$tempseg_usage u, v$sql swhere s.sql_id = u.sql_id;

Die Ansicht V$TEMP_SPACE_HEADER bietet eine weniger detaillierte Ansicht des verbrauchten und verfügbaren Speicherplatzes; es listet den zugewiesenen und nicht zugewiesenen Speicherplatz in den Tempfiles nach Datei auf. Es wird wahrscheinlich große Unterschiede zwischen dem geben, was V$TEMP_SPACE_HEADER meldet, und dem, was V$TEMPSEG_USAGE bereitstellt.

Ich werde mich (von irgendwo anders im Web) in Bezug auf die richtige Größe temporärer Tablespaces zitieren: „Wie viel Platz benötigen Sie in Ihrem temporären Tablespace? Dies hängt davon ab, wie aktiv Ihr System ist, wie viele gleichzeitig aktive Sitzungen es gibt, wie groß die Transaktionen sind und wie viel Speicherplatz Sie haben. Es ist keine Schande, die Größe Ihres TEMPORÄREN Tablespaces im Laufe der Zeit zu erhöhen, wenn sich Nutzungsmuster, Anzahl der Benutzer und Datenvolumen ändern. Oracle informiert Sie auch darüber, dass der temporäre Tablespace erhöht werden muss, indem ORA-01652-Fehler ausgegeben werden (das temporäre Segment kann beispielsweise im Tablespace TEMP nicht um 128 erweitert werden). Die Zahl, die in einem ORA-01652-Fehler gemeldet wird, ist in Blöcken und nicht in Bytes, daher müssen Sie diese mit dem Wert db_block_size konvertieren, um zu wissen, wie viele Bytes der temporäre Tablespace benötigt, um die Transaktion abzuschließen, die den Fehler generiert. Es gibt keine Faustregel für die Größe eines temporären Tablespace, da solche Regeln normalerweise Situationen schaffen, in denen das einzige Werkzeug zu einem Hammer wird und jede Aufgabe als Nagel endet, und meistens schlagen Sie diesen Daumen mit dem einzigen ‚Werkzeug‘, das Ihnen gegeben wurde.“

DBA_TEMP_FILES gibt an, wie groß der temporäre Tablespace ist:

SQL> select tablespace_name, sum(bytes)/1024/1024 MB 2 from dba_temp_files 3 group by tablespace_name 4 /TABLESPACE_NAME MB------------------------------ ----------TEMP 1024SQL>

Es kann auch berichten, welche Dateien mit Ihrem temporären Tablespace verknüpft sind:

SQL> select tablespace_name, file_name, bytes 2 from dba_temp_files 3 order by tablespace_name, file_name 4 /TABLESPACE_NAME FILE_NAME BYTES--------------- ------------------------------------------------------- ----------TEMP /u2/orawiz/parlopnett/temp01.dbf 1073741824SQL>

Wenn Sie die Größe Ihres TEMPORÄREN Tablespaces verringern möchten oder müssen, müssen Sie die Datenbank herunterfahren, im eingeschränkten Modus öffnen, die Größe der Tempfile (oder Tempfiles) ändern und dann die Datenbank herunterfahren und starten. Das Hinzufügen von Speicherplatz ist bei weitem nicht so aufwendig, da eine einfache ‚alter database tempfile resize ;‘ erhöht den Speicherplatz.

Was passiert, wenn der temporäre Tablespace nicht existiert oder nicht verfügbar ist? Oracle wird dies anzeigen:

SQL> select * from mybigtable order by mycoolkey;select * from mybigtable order by mycoolkey*ERROR at line 1:ORA-01129: user's default or temporary tablespace does not exist SQL>

Wenn diese Fehlermeldung angezeigt wird, überprüfen Sie, ob der temporäre Tablespace vorhanden und online ist. Korrigieren Sie alle gefundenen Probleme (erstellen Sie den fehlenden Tablespace oder stellen Sie die Tempfiles wieder online).

Wenn der Tablespace vorhanden ist, ihm jedoch keine Tempfiles zugewiesen sind (was nach einer Datenbankwiederherstellung / Wiederherstellung aus einer Sicherung auftreten kann), meldet Oracle:

SQL> select * from mybigtable order by mycoolkey;select * from mybigtable order by mycoolkey*ERROR at line 1:ORA-25153: Temporary Tablespace is Empty SQL>

Die Aufgabe besteht also einfach darin, ‚alter temporary tablespace‘ auszugeben… tempfile hinzufügen …‘ Befehle, um den Tablespace nicht mehr leer zu machen.

Das Verwalten des temporären Tablespace ist kein Hexenwerk, aber es unterscheidet sich (manchmal erheblich) von den ’normalen‘ Tablespace-Verwaltungsverfahren, die für reguläre Datendateien verwendet werden. Zu wissen, dass ein ‚vollständiger‘ temporärer Tablespace kein Problem darstellt (denken Sie daran, dass Segmente zugewiesen und dann wiederverwendet werden), kann die Aufgabe etwas vereinfachen, da Oracle Ihnen (mit ORA-01652-Fehlern) mitteilt, wenn Ihnen der Speicherplatz ausgeht. Dies bedeutet, dass der DBA Zeit für nützliche Aufgaben wie das Zurücksetzen von Kennwörtern aufwenden kann.

Alle Artikel von David Fitzjarrell

Leave a Reply

Deine E-Mail-Adresse wird nicht veröffentlicht.