Overvåking Av Oracles Temp-Bruk
Det ser ut Til At Oracles midlertidige tabellplass fortsatt er et mysterium for noen, muligens fordi Det ikke styres på samme måte som en vanlig tabellplass. Extents er allokert og gjenbrukt så plass ledelse ser ingenting sånn for en tradisjonell tabellplass. På grunn av at plass feil styres annerledes. La oss se på hvordan du håndterer et midlertidig bordplass og hvilke verktøy som STÅR TIL RÅDIGHET FOR DBA.
starter med versjon 8.1.5 Oracle har gitt en ‘sann’ midlertidig tabellplass hvor extents er tildelt og tildelt økter etter behov. Omfanget er aldri droppet mens databasen kjører så en riktig utnyttet midlertidig tabellplass vil alltid ha 0 ‘ledig’ plass. I denne forstand betyr ‘gratis’ ufordelt, og alt i den midlertidige tabellplassen vil bli tildelt, men det betyr ikke at det blir brukt. Dette er grunnen til at konvensjonell romforvaltning ikke har plass i den midlertidige tabellplassen.
så hvordan forvaltes det midlertidige tabellområdet? Det er gjort gjennom Flere v$ visninger:
V $ TEMPFILE V $ TEMPSTAT V $ TEMP_EXTENT_MAP V$TEMP_EXTENT_POOL V$TEMP_SPACE_HEADER V$TEMPSEG_USAGE (Oracle 9i og senere utgivelser) v$SORT_USAGE (Oracle 8.1.7, 8.1.6 og 8.1.5)
v$TEMP_EXTENT_MAP rapporterer alle tildelte utvidelser i det midlertidige tabellområdet:
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 mest nyttige visningene for å administrere midlertidige tabellområder er V$TEMP_EXTENT_POOL og V$TEMPSEG_USAGE / V$SORT_USAGE. V$TEMP_EXTENT_POOL viser ikke bare de tildelte extents, det rapporterer også om alle brukte extents i en midlertidig tabellplass av 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 (ELLER, HVIS du foretrekker, v$SORT_USAGE) viser den midlertidige segmentbruken, etter bruker, for alle tabellområder:
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
Midlertidig tablespace bruk overvåking ER en enkel oppgave å spørre V$TEMPSEG_USAGE (V$SORT_USAGE, hvis det er foretrukket) over tid:
select segtype, extents, blocksfrom v$tempseg_usagewhere tablespace = 'TEMP';
Husk at slik overvåking ikke vil gi noen handlingsdata; MED mindre databasen rapporterer feil som tildeler temp-plass, HAR DBA egentlig ingenting å gjøre.
hvis du vil vite hvor mange omfang som er tildelt og faktisk brukt per datafil, vil følgende spørring gi en ganske nyttig rapport:
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/
Igjen, ingen tiltak må tas basert på en slik rapport; det er bare for informasjonsformål.
Hvem bruker temp-plassen din, hvilke spørringer utfører de og hvor mye av den plassen er hver enkelt forbruker? Det er også en ganske enkel oppgave å fullføre:
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;
v$TEMP_SPACE_HEADER-visningen gir en mindre granulær visning av forbruket og tilgjengelig plass; den viser tildelt og ikke-tildelt plass i tempfiles, etter fil. Husk at allokert betyr ikke brukt; det vil trolig v re store forskjeller mellom HVA V$TEMP_SPACE_HEADER rapporterer og hva V$TEMPSEG_USAGE gir.
jeg vil sitere meg selv (fra et annet sted på nettet) med hensyn til riktig dimensjonering av midlertidige tabellområder: «Så hvor mye plass trenger du i din midlertidige tabellplass? Det vil avhenge av hvor aktivt systemet ditt er, hvor mange samtidige aktive økter det er, størrelsen på transaksjonene og hvor mye diskplass du har. Det er ikke en skam å øke TEMP tabellplass størrelse over tid som bruksmønstre, antall brukere og datamengder endring. Oracle vil også informere deg om at midlertidig tabellplass må økes ved å utstede ORA-01652-feil (kan ikke utvide temp-segmentet med 128 i tabellplass TEMP, for eksempel). Tallet som rapporteres I EN ORA – 01652-feil er i blokker, ikke byte, så du må konvertere det ved hjelp av db_block_size-verdien for å vite hvor mange byte den midlertidige tabellplassen som trengs for å fullføre transaksjonen som genererer feilen. Det er ingen tommelfingerregel for å størrelse en midlertidig bordplass fordi slike regler vanligvis skaper situasjoner der det eneste verktøyet blir en hammer og hver oppgave ender opp som en spiker, og oftere enn ikke, treffer du tommelen med det eneste verktøyet du har fått.»
DBA_TEMP_FILES vil fortelle deg hvor stor den midlertidige tabellplassen er:
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>
Det kan også rapportere hvilke filer som er knyttet til midlertidig tabellplass:
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>
hvis du vil, eller trenger, å redusere størrelsen PÅ TEMP tabellplass du må stenge databasen ned, åpne den i begrenset innhold-modus, endre størrelse på tempfile (eller tempfiles) mindre deretter shutdown og oppstart av databasen. Legge plass er ikke på langt nær så involvert, som en enkel ‘alter database tempfile resize;’ øker plassen.
hva skjer hvis det midlertidige tabellområdet ikke finnes eller ikke er tilgjengelig? Oracle vil vise dette:
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>
hvis du ser denne feilmeldingen, må du kontrollere om det midlertidige tabellområdet finnes og er tilkoblet. Korrigere eventuelle problemer du finner(lag den manglende tabellplassen eller sett tempfiles tilbake på nettet).
Hvis tabellplassen eksisterer, men ingen tempfiler er tildelt den (som kan oppstå etter en database gjenoppretting/gjenoppretting fra en sikkerhetskopi), rapporterer 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>
så, oppgaven er bare å utstede ‘ endre midlertidig tabellplass … legg tempfile …’kommandoer for å gjøre tabellplassen ikke lenger tom.
Å Administrere det midlertidige tabellområdet er ikke rakettvitenskap, men det er forskjellig (noen ganger betydelig) fra de ‘normale’ tabellhåndteringsprosedyrene som brukes for vanlige datafiler. Å vite at en’ full ‘ midlertidig tabellplass ikke er et problem (husk at segmenter tildeles og gjenbrukes) kan gjøre oppgaven litt enklere som Oracle vil fortelle deg (MED ORA-01652-feil) hvis du har gått tom for plass. DET betyr AT DBA kan bruke tid på nyttige oppgaver, som tilbakestilling av passord.
Se alle artikler av David Fitzjarrell