Monitoraggio dell’utilizzo temporaneo di Oracle
Sembra che il tablespace temporaneo di Oracle sia ancora un mistero per alcuni, probabilmente perché non è gestito allo stesso modo di un tablespace convenzionale. Le estensioni vengono allocate e riutilizzate in modo che la gestione dello spazio non assomigli a quella di un tablespace tradizionale. A causa di ciò gli errori di spazio sono gestiti in modo diverso. Diamo un’occhiata a come gestire un tablespace temporaneo e quali strumenti sono a disposizione del DBA.
A partire dalla versione 8.1.5 Oracle ha fornito un tablespace temporaneo “vero” in cui le estensioni sono allocate e assegnate alle sessioni quando sono necessarie. Le estensioni non vengono mai rilasciate mentre il database è in esecuzione, quindi un tablespace temporaneo correttamente utilizzato avrà sempre 0 spazio “libero”. In questo senso ‘libero’ significa non allocato, e tutto nel tablespace temporaneo verrà allocato ma ciò non significa che venga utilizzato. Questo è il motivo per cui la gestione dello spazio convenzionale non ha posto nel tablespace temporaneo.
Quindi, come viene gestito il tablespace temporaneo? È fatto attraverso diverse V views viste:
V$TEMPFILE V$TEMPSTAT V$TEMP_EXTENT_MAP V$TEMP_EXTENT_POOL V$TEMP_SPACE_HEADER V$TEMPSEG_USAGE (Oracle 9i e versioni successive) V$SORT_USAGE (Oracle 8.1.7, e 8.1.5 8.1.6)
V$TEMP_EXTENT_MAP rapporti di tutti i extent allocati in temporanea 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
Il più utile viste per la gestione temporanea spazi sono V$TEMP_EXTENT_POOL e V$TEMPSEG_USAGE/V$SORT_USAGE. V TEMP TEMP_EXTENT_POOL elenca non solo le estensioni allocate, ma riporta anche tutte le estensioni utilizzate in uno spazio tabella temporaneo da 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 (o, se si preferisce, V$SORT_USAGE) mostra temporanea segmento di utilizzo, da parte dell’utente, per tutte le tabelle:
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
Temporaneo tablespace il monitoraggio di utilizzo è un compito semplice di eseguire la query$V TEMPSEG_USAGE (V$SORT_USAGE, se preferite) nel corso del tempo:
select segtype, extents, blocksfrom v$tempseg_usagewhere tablespace = 'TEMP';
Ricordo che tale controllo non produce dati utilizzabili; a meno che il database è la segnalazione di errori di allocazione temp spazio DBA davvero non ha nulla a che fare.
Se si desidera sapere quante estensioni sono allocate e effettivamente utilizzate per file di dati, la seguente query produrrà un rapporto abbastanza utile:
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/
Ancora una volta, nessuna azione deve essere presa sulla base di tale rapporto; è solo a scopo informativo.
Chi sta usando il tuo spazio temporaneo, quali query stanno eseguendo e quanto di quello spazio sta consumando? Questo è anche un compito abbastanza facile da completare:
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;
La vista V TEMP TEMP_SPACE_HEADER fornisce una vista meno granulare dello spazio consumato e disponibile; elenca lo spazio allocato e non allocato nei file temporanei, per file. Tieni presente che allocato non significa usato; probabilmente ci saranno grandi differenze tra ciò che V TEMP TEMP_SPACE_HEADER riporta e ciò che V TEMP TEMPSEG_USAGE fornisce.
Citerò me stesso (da qualche altra parte sul web) per quanto riguarda il corretto dimensionamento dei tablespace temporanei: “Quindi quanto spazio hai bisogno nel tuo tablespace temporaneo? Ciò dipenderà da quanto è attivo il tuo sistema, da quante sessioni attive simultanee ci sono, dalla dimensione delle transazioni e dalla quantità di spazio su disco che hai. Non è una vergogna aumentare le dimensioni del tablespace TEMPORANEO nel tempo man mano che cambiano i modelli di utilizzo, il numero di utenti e i volumi di dati. Oracle ti informerà inoltre che il tablespace temporaneo deve essere aumentato emettendo errori ORA-01652 (impossibile estendere il segmento temp di 128 in tablespace TEMP, ad esempio). Il numero riportato in un errore ORA-01652 è in blocchi, non in byte, quindi dovrai convertirlo usando il valore db_block_size per sapere quanti byte il tablespace temporaneo necessario per completare la transazione generando l’errore. Non esiste una “regola empirica” per dimensionare un tablespace temporaneo perché tali regole di solito creano situazioni in cui l’unico strumento diventa un martello e ogni attività finisce come un chiodo, e il più delle volte, colpisci quel pollice con l’unico “strumento” che ti è stato dato.”
DBA_TEMP_FILES ti dirà quanto è grande il tablespace temporaneo:
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>
Può anche segnalare quali file sono associati al tuo tablespace temporaneo:
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>
Se si desidera, o è necessario, ridurre le dimensioni del tablespace TEMPORANEO, è necessario chiudere il database, aprirlo in modalità limitata, ridimensionare il file temp (o file temp) più piccolo quindi spegnere e avviare il database. L’aggiunta di spazio non è altrettanto coinvolta, poiché un semplice ‘alter database tempfile resize ;’ aumenta lo spazio.
Cosa succede se il tablespace temporaneo non esiste o non è disponibile? Oracle visualizzerà questo:
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>
Se vedi questo messaggio di errore controlla se il tablespace temporaneo esiste ed è online. Correggi tutti i problemi che trovi (crea il tablespace mancante o rimetti online i file temporanei).
Se il tablespace esiste ma non gli vengono assegnati file temporanei (che possono verificarsi dopo il ripristino/ripristino di un database da un backup), Oracle riporta:
SQL> select * from mybigtable order by mycoolkey;select * from mybigtable order by mycoolkey*ERROR at line 1:ORA-25153: Temporary Tablespace is Empty SQL>
Quindi, il compito è semplicemente quello di emettere ‘alter temporary tablespace … aggiungi file temporaneo …’comandi per rendere il tablespace non più vuoto.
La gestione del tablespace temporaneo non è scienza missilistica, ma differisce (a volte considerevolmente) dalle normali procedure di gestione del tablespace utilizzate per i normali file di dati. Sapere che un tablespace temporaneo “completo” non è un problema (ricorda che i segmenti vengono allocati e quindi riutilizzati) può rendere l’attività un po ‘più semplice come Oracle ti dirà (con errori ORA-01652) se hai esaurito lo spazio. Il che significa che il DBA può dedicare tempo a compiti utili, come il ripristino della password.
Vedi tutti gli articoli di David Fitzjarrell