Du meine Güte! Sehen Sie sich die Größe meines temporären Tabellenbereichs an! Oder ... wie man temporäre Tabellenbereiche in Oracle verkleinert.
Ja, ich habe eine Abfrage ausgeführt, um zu sehen, wie groß mein temporärer Tablespace ist:
SQL> SELECT tablespace_name, file_name, bytes
2 FROM dba_temp_files WHERE tablespace_name like 'TEMP%';
TABLESPACE_NAME FILE_NAME BYTES
----------------- -------------------------------- --------------
TEMP /the/full/path/to/temp01.dbf 13,917,200,000
Die erste Frage, die Sie sich stellen müssen, ist, warum der temporäre Tablespace so groß ist. Vielleicht kennen Sie die Antwort auf Anhieb. Es kann an einer großen Abfrage liegen, die Sie gerade mit einer fehlerhaften Sortierung ausgeführt haben (ich habe das mehr als einmal gemacht). Es kann an anderen außergewöhnlichen Umständen liegen. Wenn dies der Fall ist, müssen Sie zum Aufräumen nur den temporären Tabellenbereich verkleinern und im Leben weitermachen.
Aber was ist, wenn Sie es nicht wissen? Bevor Sie sich für eine Verkleinerung entscheiden, müssen Sie möglicherweise die Ursachen für den großen Tablespace untersuchen. Wenn dies regelmäßig vorkommt, ist es möglich, dass Ihre Datenbank nur so viel Speicherplatz benötigt.
Die dynamische Leistungsansicht
V$TEMPSEG_USAGE
kann bei der Ursachenfindung sehr hilfreich sein.
Vielleicht interessiert Sie die Ursache einfach nicht und Sie müssen sie nur verkleinern. Dies ist Ihr dritter Tag im Job. Die Daten in der Datenbank sind nur 200 MiBif Daten und der temporäre Tablespace ist 13 GiB - Verkleinern Sie ihn einfach und fahren Sie fort. Wenn er wieder wächst, werden wir der Ursache nachgehen. In der Zwischenzeit habe ich keinen Platz mehr auf diesem Datenträger und ich brauche den Platz einfach zurück.
Werfen wir einen Blick auf das Schrumpfen. Es hängt ein wenig davon ab, welche Version von Oracle Sie verwenden und wie der temporäre Tablespace eingerichtet wurde.
Oracle wird sein Bestes tun, um Sie vor schrecklichen Fehlern zu bewahren, also werden wir die Befehle einfach ausprobieren und wenn nicht Arbeit werden wir auf eine neue Art und Weise schrumpfen.
Lassen Sie uns zuerst versuchen, die Datendatei zu verkleinern. Wenn uns das gelingt, bekommen wir den Platz zurück und können uns morgen Gedanken darüber machen, warum er gewachsen ist.
SQL>
SQL> alter database tempfile '/the/full/path/to/temp01.dbf' resize 256M;
alter database tempfile '/the/full/path/to/temp01.dbf' resize 256M
*
ERROR at line 1:
ORA-03297: file contains used data beyond requested RESIZE value
Je nach Fehlermeldung können Sie dies mit anderen Größen versuchen, die kleiner sind als die aktuelle Seite der Datei. Ich hatte damit begrenzten Erfolg. Oracle verkleinert die Datei nur, wenn sich der temporäre Tablespace am Anfang der Datei befindet und kleiner als die von Ihnen angegebene Größe ist. Einige alte Oracle-Dokumentationen (sie haben dies korrigiert) besagten, dass Sie den Befehl ausgeben könnten und die Fehlermeldung Ihnen mitteilen würde, auf welche Größe Sie verkleinern könnten. Als ich anfing, als DBA zu arbeiten, stimmte das nicht. Sie mussten nur raten und den Befehl einige Male erneut ausführen, um zu sehen, ob er funktionierte.
In Ordnung. Das hat nicht funktioniert. Wie wäre es damit.
SQL> alter tablespace YOUR_TEMP_TABLESPACE_NAME shrink space keep 256M;
Wenn Sie in 11 g sind (vielleicht auch in 10 g), dann ist es das! Wenn es funktioniert, können Sie zum vorherigen Befehl zurückkehren und es noch einmal versuchen.
Aber was ist, wenn das fehlschlägt. Wenn der temporäre Tablespace der standardmäßige temporäre Tablespace ist, der bei der Installation der Datenbank eingerichtet wurde, müssen Sie möglicherweise viel mehr Arbeit leisten. An diesem Punkt überprüfe ich normalerweise neu, ob ich diesen Raum wirklich zurück brauche. Schließlich kostet Speicherplatz nur X,XX $ pro GiB. Normalerweise möchte ich solche Änderungen nicht während der Produktionszeiten vornehmen. Das heißt arbeiten bei 2AMAGAIN! (Nicht, dass ich wirklich etwas dagegen hätte, um 2 Uhr morgens zu arbeiten – es ist nur so, dass … Nun, ich schlafe auch gerne. Und meine Frau hat mich gerne um 2 Uhr morgens zu Hause … nicht um 4 Uhr morgens durch die Straßen der Innenstadt zu streifen und sich zu erinnern, wo ich meinen geparkt habe Auto 3 Stunden früher. Ich habe von dieser "Telearbeit"-Sache gehört. Ich mache mir nur Sorgen, dass ich die Hälfte des Weges schaffe und dann meine Internetverbindung ausfällt - dann muss ich in die Innenstadt eilen, um alles zu reparieren, bevor die Leute am Morgen auftauchen, um es zu benutzen der Datenbank.)
Ok ... Zurück zum Ernst ... Wenn der temporäre Tablespace, den Sie verkleinern möchten, Ihr temporärer Standard-Tablespace ist, müssen Sie zuerst einen neuen temporären Tablespace erstellen, ihn als temporären Standard-Tablespace festlegen, dann Ihren alten temporären Standard-Tablespace löschen und neu erstellen es. Löschen Sie anschließend die zweite erstellte temporäre Tabelle.
SQL> CREATE TEMPORARY TABLESPACE temp2
2 TEMPFILE '/the/full/path/to/temp2_01.dbf' SIZE 5M REUSE
3 AUTOEXTEND ON NEXT 1M MAXSIZE unlimited
4 EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;
Tablespace created.
SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp2;
Database altered.
SQL> DROP TABLESPACE temp INCLUDING CONTENTS AND DATAFILES;
Tablespace dropped.
SQL> CREATE TEMPORARY TABLESPACE temp
2 TEMPFILE '/the/full/path/to/temp01.dbf' SIZE 256M REUSE
3 AUTOEXTEND ON NEXT 128M MAXSIZE unlimited
4 EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;
Tablespace created.
SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp;
Database altered.
SQL> DROP TABLESPACE temp2 INCLUDING CONTENTS AND DATAFILES;
Tablespace dropped.
Hoffentlich hilft eines dieser Dinge!