overvågning af Oracle’ s Temp-brug

det ser ud til, at Oracle ‘ s midlertidige tablespace stadig er et mysterium for nogle, muligvis fordi det ikke styres på samme måde som en konventionel tablespace. Udstrækninger tildeles og genbruges, så rumstyring ser ikke sådan ud for en traditionel spisesked. På grund af dette styres pladsfejl forskelligt. Lad os se på, hvordan man styrer en midlertidig tablespace og hvilke værktøjer der står til DBA ‘ s rådighed.

begyndende med version 8.1.5 Oracle har leveret en’ ægte ‘ midlertidig tablespace, hvor omfang tildeles og tildeles sessioner, som de er nødvendige. Udvidelserne bliver aldrig droppet, mens databasen kører, så en korrekt udnyttet midlertidig tablespace vil altid have 0 ‘ledig’ plads. I denne forstand betyder ‘gratis’ ikke-allokeret, og alt i den midlertidige tablespace vil blive tildelt, men det betyder ikke, at det bliver brugt. Dette er grunden til, at konventionel rumstyring ikke har nogen plads i den midlertidige tablespace.

så hvordan styres den midlertidige tablespace? Det gøres gennem flere V$ visninger:

V $ TEMPFILE V$TEMPSTAT V$TEMP_EKSTENT_MAP V$TEMP_EKSTENT_POOL V $ TEMP_SPACE_HEADER V $ TEMPSEG_USAGE (Oracle 9i og senere udgivelser) V$SORT_USAGE (Oracle 8.1.7, 8.1.6 og 8.1.5)

v$TEMP_EKSTENT_MAP rapporterer alle de tildelte udvidelser i den midlertidige 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 mest nyttige visninger til at administrere midlertidige tablespaces er V$TEMP_EKSTENT_POOL og V$TEMPSEG_USAGE/V$SORT_USAGE. V$TEMP_EKSTENT_POOL viser ikke kun de tildelte udvidelser, det rapporterer også om alle brugte udvidelser i en midlertidig tablespace af 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 foretrækker det, v$SORT_USAGE) viser den midlertidige segmentbrug efter bruger for 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 

midlertidig tablespace brug overvågning er en simpel opgave at forespørge V$TEMPSEG_USAGE (V$SORT_USAGE, hvis det foretrækkes) over tid:

select segtype, extents, blocksfrom v$tempseg_usagewhere tablespace = 'TEMP';

Husk, at en sådan overvågning ikke vil producere handlingsdata; medmindre databasen rapporterer fejl, der tildeler temp-plads, har DBA virkelig intet at gøre.

hvis du gerne vil vide, hvor mange udvidelser der er tildelt og faktisk brugt pr. datafil, vil følgende forespørgsel producere en ret 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/

igen skal der ikke træffes nogen handling baseret på en sådan rapport; det er kun til informationsformål.

Hvem bruger dit temp-rum, hvilke forespørgsler udfører de, og hvor meget af det rum bruger hver enkelt? Det er også en forholdsvis let opgave at fuldfø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 giver en mindre detaljeret visning af den forbrugte og tilgængelige plads; den viser den tildelte og ikke-tildelte plads i tempfilerne, efter fil. Husk, at allokeret ikke betyder brugt; der vil sandsynligvis være store forskelle mellem, hvad V$TEMP_SPACE_HEADER rapporterer, og hvad V$TEMPSEG_USAGE giver.

jeg vil citere mig selv (fra et andet sted på nettet) med hensyn til korrekt dimensionering af midlertidige tablespaces: “så hvor meget plads har du brug for i din midlertidige tablespace? Det afhænger af, hvor aktivt dit system er, hvor mange samtidige aktive sessioner der er, størrelsen på transaktionerne og hvor meget diskplads du har. Det er ikke en skændsel at øge din temp tablespace størrelse over tid, da brugsmønstre, antal brugere og datamængder ændres. Oracle vil også informere dig om, at den midlertidige tablespace skal øges ved at udstede ora-01652-fejl (f.eks. Nummeret rapporteret i en ora-01652-fejl er i blokke, ikke bytes, så du skal konvertere det ved hjælp af værdien db_block_størrelse for at vide, hvor mange bytes den midlertidige tablespace er nødvendig for at fuldføre transaktionen, der genererer fejlen. Der er ingen ‘tommelfingerregel’ for at dimensionere en midlertidig spisesked, fordi sådanne regler normalt skaber situationer, hvor det eneste værktøj bliver en hammer, og hver opgave ender som et søm, og oftere end ikke rammer du tommelfingeren med det eneste ‘værktøj’, du har fået.”

DBA_TEMP_FILES vil fortælle dig, hvor stor den midlertidige tablespace 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 der er knyttet til din midlertidige 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>

hvis du vil eller har brug for at reducere størrelsen på din TEMP tablespace, skal du lukke databasen ned, åbne den i begrænset tilstand, ændre størrelsen på tempfilen (eller tempfiles) mindre derefter nedlukning og opstart af databasen. Tilføjelse af plads er ikke nær så involveret, som en simpel ‘alter database tempfile ændre størrelse ;’ øger pladsen.

Hvad sker der, hvis den midlertidige tablespace ikke findes eller ikke er tilgængelig? 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 fejlmeddelelse, skal du kontrollere, om den midlertidige tablespace findes og er online. Ret eventuelle problemer ,du finder (oprette den manglende tablespace eller sætte tempfiles tilbage online).

hvis tablespace eksisterer, men ingen tempfiler er tildelt det (som kan forekomme efter en database gendannelse / gendannelse fra en sikkerhedskopi), 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å opgaven er simpelthen at udstede ‘ ændre midlertidig tablespace … Tilføj tempfile …’kommandoer til at gøre tablespace ikke længere tom.

håndtering af den midlertidige tablespace er ikke raketvidenskab, men det adskiller sig (undertiden betydeligt) fra de ‘normale’ tablespace-styringsprocedurer, der anvendes til almindelige datafiler. At vide, at en’ fuld ‘ midlertidig tablespace ikke er et problem (husk at segmenter tildeles og genbruges) kan gøre opgaven lidt lettere, da Oracle vil fortælle dig (med Ora-01652-fejl), hvis du er løbet tør for plads. Hvilket betyder, at DBA kan bruge tid på nyttige opgaver, som nulstilling af adgangskode.

se alle artikler af David Fitsjarrell

Leave a Reply

Din e-mailadresse vil ikke blive publiceret.