Monitoring van Oracle’ s Temp Usage
het lijkt erop dat Oracle ‘ s tijdelijke tablespace nog steeds een mysterie is voor sommigen, mogelijk omdat het niet op dezelfde manier wordt beheerd als een conventionele tablespace. Extents worden toegewezen en hergebruikt, zodat ruimtebeheer er niet zo uitziet voor een traditionele tafelruimte. Daardoor worden ruimtefouten anders behandeld. Laten we eens kijken hoe je een tijdelijke tablespace kunt beheren en welke tools beschikbaar zijn voor de DBA.
beginnend met versie 8.1.5 Oracle heeft een ‘echte’ tijdelijke tablespace voorzien waar extents worden toegewezen en toegewezen aan sessies als ze nodig zijn. De extents worden nooit gedropt terwijl de database draait, zodat een goed gebruikte tijdelijke tablespace altijd 0 ‘vrije’ ruimte heeft. In deze zin betekent ‘vrij’ niet toegewezen, en alles in de tijdelijke tablespace zal worden toegewezen, maar dat betekent niet dat het wordt gebruikt. Daarom heeft conventioneel ruimtebeheer geen plaats in de tijdelijke ruimteruimte.
dus hoe wordt de tijdelijke tablespace beheerd? Het is gedaan door middel van verschillende v $ views:
V$TEMPFILE V$TEMPSTAT V$TEMP_EXTENT_MAP V$TEMP_EXTENT_POOL V$TEMP_SPACE_HEADER V$TEMPSEG_USAGE (Oracle 9i en latere versies) V$SORT_USAGE (Oracle 8.1.7, 8.1.5 8.1.6 en)
V$TEMP_EXTENT_MAP rapporten van de toegewezen gebieden in de temporary 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
De meest nuttige uitzicht te beheren tijdelijke tablespaces, V$TEMP_EXTENT_POOL en V$TEMPSEG_USAGE/V$SORT_USAGE. V$TEMP_EXTENT_POOL geeft niet alleen de toegewezen extents weer, het rapporteert ook alle gebruikte extents in een tijdelijke tablespace door 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 (of, indien gewenst, V$SORT_USAGE) toont het tijdelijke segmentgebruik, per gebruiker, voor alle tablespaces:
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
tijdelijke tablespace gebruik monitoring is een eenvoudige taak van het opvragen V$TEMPSEG_USAGE (V$SORT_USAGE, als dat de voorkeur heeft) in de tijd:
select segtype, extents, blocksfrom v$tempseg_usagewhere tablespace = 'TEMP';
onthoud dat een dergelijke monitoring geen bruikbare gegevens zal produceren; tenzij de database fouten rapporteert die tijdelijke ruimte toewijzen, heeft de DBA echt niets te maken.
als u wilt weten hoeveel extents per databestand worden toegewezen en daadwerkelijk worden gebruikt, zal de volgende query een vrij nuttig rapport opleveren:
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/
nogmaals, er hoeft geen actie te worden ondernomen op basis van een dergelijk rapport; het is alleen voor informatieve doeleinden.
Wie gebruikt uw temp-spatie, welke queries worden uitgevoerd en hoeveel van die spatie verbruikt elke spatie? Dat is ook een vrij eenvoudige taak om te voltooien:
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;
de V$TEMP_SPACE_HEADER weergave geeft een minder gedetailleerd beeld van de verbruikte en beschikbare ruimte; het toont de toegewezen en niet-toegewezen ruimte in de tempfiles, per bestand. Onthoud dat toegewezen niet gebruikt betekent; er zullen waarschijnlijk grote verschillen zijn tussen wat V $ TEMP_SPACE_HEADER rapporteert en wat V$TEMPSEG_USAGE biedt.
Ik zal mezelf citeren (van ergens anders op het web) met betrekking tot de juiste grootte van tijdelijke tablespaces: “dus hoeveel ruimte heb je nodig in je tijdelijke tablespace? Dat zou afhangen van hoe actief uw systeem is, hoeveel gelijktijdige actieve sessies er zijn, de grootte van de transacties en hoeveel schijfruimte je hebt. Het is geen schande om uw TEMP tablespace grootte na verloop van tijd te verhogen als gebruikspatronen, aantal gebruikers en gegevensvolumes veranderen. Oracle zal u ook informeren dat de tijdelijke tablespace moet worden verhoogd door het uitgeven van Ora-01652 fouten (niet in staat om temp segment uit te breiden met 128 in tablespace TEMP, bijvoorbeeld). Het getal dat wordt gerapporteerd in een ORA-01652 fout is in blokken, geen bytes, dus je moet dat converteren met behulp van de db_block_size waarde om te weten hoeveel bytes de tijdelijke tablespace nodig heeft om de transactie te voltooien die de fout genereert. Er is geen ‘vuistregel’ om een tijdelijke tafelruimte op maat te maken, omdat dergelijke regels meestal situaties creëren waarin het enige gereedschap een hamer wordt en elke taak eindigt als een spijker, en vaker wel dan niet, sla je die duim met het enige ‘gereedschap’ dat je hebt gekregen.”
DBA_TEMP_FILES zal u vertellen hoe groot de tijdelijke tablespace is:
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>
het kan ook rapporteren welke bestanden worden geassocieerd met uw tijdelijke tablespace:
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>
Als u de grootte van uw TEMP-tablespace wilt of wilt verkleinen, moet u de database afsluiten, openen in beperkte modus, de grootte van het tempfile (of tempfiles) kleiner maken dan afsluiten en de database opstarten. Het toevoegen van ruimte is lang niet zo betrokken, als een eenvoudige ‘ALTER database tempfile resize;’ verhoogt de ruimte.
Wat gebeurt er als de tijdelijke tablespace niet bestaat of niet beschikbaar is? Oracle zal dit tonen:
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>
als u deze foutmelding ziet, controleer dan of de tijdelijke tablespace bestaat en online is. Corrigeer eventuele problemen die u vindt (maak de ontbrekende tablespace of zet de tempfiles weer online).
als de tablespace bestaat, maar er geen tempfiles aan zijn toegewezen (wat kan optreden na het herstellen van een database / herstellen van een back-up), dan rapporteert 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>
dus, de taak is gewoon uit te geven ‘ alter tijdelijke tablespace … voeg tempfile toe …’commando’ s om de tablespace niet meer leeg te maken.
het beheren van de tijdelijke tablespace is geen rocket science, maar het verschilt (soms aanzienlijk) van de ‘normale’ tablespace management procedures die worden gebruikt voor reguliere databestanden. Weten dat een’ volledige ‘ tijdelijke tablespace is geen probleem (vergeet niet dat segmenten worden toegewezen dan hergebruikt) kan de taak een beetje makkelijker als Oracle zal u vertellen (met ORA-01652 fouten) als je geen ruimte hebt. Wat betekent dat de DBA tijd kan besteden aan nuttige taken, zoals het opnieuw instellen van wachtwoorden.
Zie alle artikelen van David Fitzjarrell