Oracle
 sql >> Database >  >> RDS >> Oracle

Come ridurre il tablespace temporaneo in Oracle?

Oh mio Dio! Guarda le dimensioni del mio tablespace temporaneo! Oppure... come ridurre i tablespace temporanei in Oracle.

Sì, ho eseguito una query per vedere quanto è grande il mio tablespace temporaneo:

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

La prima domanda che devi porre è perché lo spazio del tavolo temporaneo è così grande. Potresti conoscere la risposta a questo punto in cima alla tua testa. Potrebbe essere dovuto a una query di grandi dimensioni che hai appena eseguito con un ordinamento che è stato un errore (l'ho fatto più di una volta). Potrebbe essere dovuto a qualche altra circostanza eccezionale. In tal caso, tutto ciò che devi fare per ripulire è ridurre lo spazio temporaneo e andare avanti nella vita.

Ma cosa succede se non lo sai? Prima di decidere di ridurre potrebbe essere necessario indagare sulle cause dell'ampio tablespace. Se ciò accade regolarmente, è possibile che il tuo database abbia solo bisogno di tanto spazio.

La visualizzazione dinamica delle prestazioni

V$TEMPSEG_USAGE

può essere molto utile per determinare la causa.

Forse non ti interessa la causa e devi solo ridurla. Questo è il tuo terzo giorno di lavoro. I dati nel database sono solo 200 MiBif e lo spazio tabellare temporaneo è 13 GiB - Riducilo e vai avanti. Se cresce di nuovo, esamineremo la causa. Nel frattempo ho esaurito lo spazio su quel volume del disco e ho solo bisogno dello spazio indietro.

Diamo un'occhiata a ridurlo. Dipenderà un po' dalla versione di Oracle in esecuzione e da come è stato impostato il tablespace temporaneo.
Oracle farà del suo meglio per impedirti di commettere errori orrendi, quindi proveremo semplicemente i comandi e se non lo fanno lavoro ci rimpiccioliremo in un modo nuovo.

Per prima cosa proviamo a ridurre il file di dati. Se riusciamo a farlo, riavremo lo spazio e possiamo preoccuparci del motivo per cui è cresciuto domani.

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

A seconda del messaggio di errore, potresti provare con dimensioni diverse che sono più piccole del sito corrente del file. Ho avuto un successo limitato con questo. Oracle ridurrà il file solo se lo spazio tabella temporaneo è all'inizio del file e se è inferiore alla dimensione specificata. Una vecchia documentazione di Oracle (lo hanno corretto) diceva che potevi emettere il comando e il messaggio di errore ti direbbe a quale dimensione potresti ridurre. Quando ho iniziato a lavorare come DBA, questo non era vero. Dovevi solo indovinare ed eseguire nuovamente il comando un sacco di volte e vedere se funzionava.

Bene. Non ha funzionato. Che ne dici di questo.

SQL> alter tablespace YOUR_TEMP_TABLESPACE_NAME shrink space keep 256M;

Se sei in 11 g (anche forse in 10 g) questo è tutto! Se funziona, potresti voler tornare al comando precedente e provarlo ancora.

Ma cosa succede se ciò fallisce. Se lo spazio tabella temporaneo è quello temporaneo predefinito che è stato impostato al momento dell'installazione del database, potrebbe essere necessario eseguire molto più lavoro. A questo punto di solito rivalutare se ho davvero bisogno di quello spazio indietro. Dopo tutto lo spazio su disco costa solo $ X.XX a GiB. Di solito non voglio apportare modifiche del genere durante le ore di produzione. Ciò significa lavorare in 2AMAGAIN! (Non che mi opponga davvero a lavorare alle 2 del mattino - è solo che... beh, anche a me piace dormire. E a mia moglie piace avermi a casa alle 2 del mattino... non gironzolare per le strade del centro alle 4 del mattino cercando di ricordare dove ho parcheggiato il mio macchina 3 ore prima. Ho sentito parlare di quella cosa del "telelavoro". Mi preoccupo solo di arrivare a metà e poi la mia connettività Internet si interromperà, quindi devo correre in centro per sistemare tutto prima che la gente si presenti al mattino per usarlo il database.)

Ok... Torniamo alle cose serie... Se lo spazio tabella temporaneo che vuoi ridurre è il tuo spazio tabella temporaneo predefinito, dovrai prima creare un nuovo spazio tabella temporaneo, impostarlo come spazio tabella temporaneo predefinito, quindi eliminare il tuo vecchio spazio tabella temporaneo predefinito e ricreare esso. Dopodiché, elimina la seconda tabella temporanea creata.

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.

Speriamo che una di queste cose possa essere d'aiuto!