övervakning av Oracles Temp-användning

det verkar som om Oracles tillfälliga tabellutrymme fortfarande är ett mysterium för vissa, möjligen för att det inte hanteras på samma sätt som ett konventionellt tabellutrymme. Extents allokeras och återanvänds så rymdhantering ser inget ut så för ett traditionellt bordrum. På grund av att utrymme fel hanteras på olika sätt. Låt oss titta på hur man hanterar ett tillfälligt bordrum och vilka verktyg som står till DBA: s förfogande.

börjar med version 8.1.5 Oracle har tillhandahållit ett ’sant’ tillfälligt tabellutrymme där omfattning tilldelas och tilldelas sessioner när de behövs. Omfattningen aldrig tappas medan databasen körs så en korrekt utnyttjad tillfällig tabellutrymme kommer alltid att ha 0 ’fri’ utrymme. I den meningen betyder ’fri’ odelad, och allt i det tillfälliga tabellutrymmet kommer att tilldelas men det betyder inte att det används. Det är därför konventionell rymdhantering inte har någon plats i det tillfälliga tabellutrymmet.

så hur hanteras det tillfälliga tabellutrymmet? Det görs genom flera v$ visningar:

V $ TEMPFILE V $ TEMPSTAT V $ TEMP_EXTENT_MAP V $ TEMP_EXTENT_POOL V$TEMP_SPACE_HEADER V $ TEMPSEG_USAGE (Oracle 9i och senare utgåvor) V $ SORT_USAGE (Oracle 8.1.7, 8.1.6 och 8.1.5)

V$TEMP_EXTENT_MAP rapporterar alla tilldelade utsträckning i det tillfälliga tabellutrymmet:

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 användbara vyerna för att hantera tillfälliga tabeller är V $ TEMP_EXTENT_POOL och V$TEMPSEG_USAGE/V$SORT_USAGE. V $ TEMP_EXTENT_POOL listar inte bara de tilldelade extents, det rapporterar också om alla använda extents i en tillfällig tablespace 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, om du föredrar, v$SORT_USAGE) visar den tillfälliga segmentanvändningen, av användaren, för alla tabeller:

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 

tillfällig övervakning av tabellutrymme är en enkel uppgift att fråga V$TEMPSEG_USAGE (V$SORT_USAGE, om det är föredraget) över tiden:

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

kom ihåg att en sådan övervakning kommer att producera några angripbara data; om databasen rapporterar fel allokera temp utrymme DBA verkligen har ingenting att göra.

om du vill veta hur många extents som tilldelas och faktiskt används per datafil kommer följande fråga att ge en ganska användbar 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/

återigen behöver inga åtgärder vidtas baserat på en sådan rapport; Det är bara för informationsändamål.

Vem använder ditt temputrymme, vilka frågor utför de och hur mycket av det utrymmet konsumerar var och en? Det är också en ganska lätt uppgift att slutföra:

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-vyn ger en mindre granulär bild av det förbrukade och tillgängliga utrymmet; den listar det tilldelade och icke-tilldelade utrymmet i tempfilerna, efter fil. Tänk på att allokerad betyder inte används; det kommer sannolikt att finnas stora skillnader mellan vad V$TEMP_SPACE_HEADER rapporter och vad V$TEMPSEG_USAGE ger.

jag kommer att citera mig själv (från någon annanstans på webben) när det gäller korrekt dimensionering av tillfälliga tabeller: ”så hur mycket utrymme behöver du i ditt tillfälliga bordrum? Det beror på hur aktivt ditt system är, hur många samtidiga aktiva sessioner det finns, storleken på transaktionerna och hur mycket diskutrymme du har. Det är inte en skam att öka din TEMPBORDSTORLEK över tiden, eftersom användningsmönster, antal användare och datavolymer förändras. Oracle kommer också att informera dig om att det tillfälliga tabellutrymmet måste ökas genom att utfärda ora-01652-fel (Det går inte att förlänga temp-segmentet med 128 i tablespace TEMP, till exempel). Numret som rapporteras i ett ora-01652-fel är i block, inte byte, så du måste konvertera det med db_block_size-värdet för att veta hur många byte det tillfälliga tabellutrymmet som behövs för att slutföra transaktionen som genererar felet. Det finns ingen tumregel för att dimensionera ett tillfälligt bordrum eftersom sådana regler vanligtvis skapar situationer där det enda verktyget blir en hammare och varje uppgift hamnar som en spik, och oftare slår du tummen med det enda verktyget du har fått.”

DBA_TEMP_FILES kommer att berätta hur stort det tillfälliga tabellutrymmet är:

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 också rapportera vilka filer som är associerade med din tillfälliga tabellutrymme:

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>

om du vill, eller behöver, för att minska storleken på din TEMP tabellutrymme måste du stänga av databasen, öppna den i begränsat läge, Ändra storlek på tempfilen (eller tempfiles) mindre sedan avstängning och starta databasen. Att lägga till utrymme är inte alls lika involverat, eftersom en enkel ’alter database tempfile resize;’ ökar utrymmet.

vad händer om det tillfälliga tabellutrymmet inte finns eller inte är tillgängligt? Oracle kommer att visa detta:

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>

om du ser det här felmeddelandet kontrollera om det tillfälliga tabellutrymmet finns och är online. Korrigera eventuella problem du hittar (skapa det saknade tabellutrymmet eller sätt tempfilerna tillbaka online).

om tabellutrymmet finns men inga tempfiler tilldelas det (vilket kan inträffa efter en databasåterställning / återställning från en säkerhetskopia) rapporterar 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å, uppgiften är helt enkelt att utfärda ’alter temporary tablespace … Lägg till tempfile …’kommandon för att göra tabellutrymmet inte längre tomt.

att hantera det tillfälliga tabellutrymmet är inte raketvetenskap, men det skiljer sig (ibland avsevärt) från de ’normala’ tabellhanteringsförfarandena som används för vanliga datafiler. Att veta att ett’ fullt ’ tillfälligt tabellutrymme inte är ett problem (kom ihåg att segment tilldelas och återanvänds) kan göra uppgiften lite enklare eftersom Oracle kommer att berätta för dig (med ora-01652-fel) om du har slut på utrymme. Vilket innebär att DBA kan spendera tid på användbara uppgifter, som återställning av lösenord.

se alla artiklar av David Fitzjarrell

Leave a Reply

Din e-postadress kommer inte publiceras.