az Oracle Temp használatának figyelése

úgy tűnik, hogy az Oracle ideiglenes táblaterülete még mindig rejtély egyesek számára, valószínűleg azért, mert nem ugyanúgy kezelik, mint a hagyományos táblaterületeket. A Kiterjesztések kiosztásra és újrafelhasználásra kerülnek, így a helykezelés nem úgy néz ki, mint egy hagyományos táblaterület esetében. Emiatt a tér hibák kezelése másképp történik. Nézzük meg, hogyan kell kezelni egy ideiglenes táblaterületet, és milyen eszközök állnak a DBA rendelkezésére.

a 8.1-es verziótól kezdve.5 Az Oracle egy’ true ‘ ideiglenes táblaterületet biztosított, ahol a kiterjesztéseket szükség szerint osztják ki és rendelik hozzá a munkamenetekhez. A Kiterjesztések soha nem csökken, míg az adatbázis fut, így egy megfelelően használt ideiglenes táblaterület mindig 0 ‘szabad’ helyet. Ebben az értelemben a ‘szabad’ azt jelenti, hogy nincs kiosztva, és az ideiglenes tablespace-ben minden kiosztásra kerül, de ez nem jelenti azt, hogy használják is. Ez az oka annak, hogy a hagyományos helykezelésnek nincs helye az ideiglenes tablespace-ben.

tehát hogyan kezelik az ideiglenes táblaterületet? Több V$ nézeten keresztül történik:

V$TEMPFILE V$TEMPSTAT V$TEMP_EXTENT_MAP V$TEMP_EXTENT_POOL V$TEMP_SPACE_HEADER V$TEMPSEG_USAGE (Oracle 9i és újabb kiadások) V$SORT_USAGE (Oracle 8.1.7, 8.1.6 és 8.1.5)

v$TEMP_EXTENT_MAP az ideiglenes táblaterület összes lefoglalt kiterjedését jelenti:

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

az ideiglenes táblaterületek kezelésének leghasznosabb nézetei a V$TEMP_EXTENT_POOL és a V$TEMPSEG_USAGE/V$SORT_USAGE. V $ TEMP_EXTENT_POOL nem csak a kiosztott kiterjedéseket sorolja fel, hanem a tempfile által egy ideiglenes táblaterületen használt összes kiterjesztésről is jelentést készít:

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 (vagy ha úgy tetszik, V$SORT_USAGE) az összes táblaterület ideiglenes szegmenshasználatát mutatja felhasználó szerint:

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 

ideiglenes tablespace használat monitoring egy egyszerű feladat lekérdezése V$TEMPSEG_USAGE (V$SORT_USAGE, ha ez előnyös) idővel:

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

ne feledje, hogy az ilyen megfigyelés nem hoz létre támadható adatokat; hacsak az adatbázis nem jelent hibákat a temp hely kiosztásában, a DBA-nak valójában semmi köze.

ha szeretné tudni, hogy hány kiterjesztést osztanak ki és használnak ténylegesen adatfájlonként, a következő lekérdezés meglehetősen hasznos jelentést készít:

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/

ismét nem kell lépéseket tenni egy ilyen jelentés alapján; ez csupán tájékoztató jellegű.

ki használja a temp helyet, milyen lekérdezéseket hajt végre,és mennyi helyet fogyaszt mindegyik? Ez is meglehetősen könnyű feladat:

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;

A V $ TEMP_SPACE_HEADER nézet kevésbé részletes képet nyújt a felhasznált és rendelkezésre álló területről; ez felsorolja a lefoglalt és nem lefoglalt helyet a tempfiles, fájlonként. Ne feledje, hogy az allokált nem azt jelenti, hogy használt; valószínűleg nagy különbségek lesznek a V$TEMP_SPACE_HEADER jelentések és a V$TEMPSEG_USAGE által nyújtott jelentések között.

idézem magam (valahonnan máshonnan az interneten) az ideiglenes táblaterületek megfelelő méretezésével kapcsolatban: “tehát mennyi helyre van szüksége az ideiglenes táblaterületén? Ez attól függ, hogy mennyire aktív a rendszer, hány egyidejű aktív munkamenet van, a tranzakciók mérete és mennyi lemezterület van. Nem szégyen a TEMP táblaterület méretének növelése az idő múlásával, mivel a használati minták, a felhasználók száma és az adatmennyiségek változnak. Az Oracle azt is tájékoztatja, hogy az ideiglenes táblaterületet növelni kell az ORA-01652 hibák kiadásával (például a tablespace TEMP-ben nem lehet meghosszabbítani a temp szegmenst 128-mal). Az ORA-01652 hibában jelentett szám blokkokban van, nem bájtokban, ezért ezt a db_block_size értékkel kell konvertálnia, hogy megtudja, hány bájtra van szükség az ideiglenes táblaterülethez a hibát generáló tranzakció befejezéséhez. Nincs’ hüvelykujjszabály ‘az ideiglenes táblaterület méretezésére, mert az ilyen szabályok általában olyan helyzeteket hoznak létre, amikor az egyetlen eszköz kalapács lesz, és minden feladat szögként végződik, és gyakrabban, mint nem, az egyetlen szerszámmal üti meg a hüvelykujját.”

a DBA_TEMP_FILES megmondja, hogy mekkora az ideiglenes táblaterület:

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>

azt is jelentheti, hogy mely fájlok vannak társítva az ideiglenes táblaterülethez:

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>

ha csökkenteni szeretné a TEMP táblaterület méretét, akkor le kell állítania az adatbázist, korlátozott módban kell megnyitnia, átméreteznie kell a tempfile (vagy tempfiles) kisebb méretét, majd le kell állítania és el kell indítania az adatbázist. A tér hozzáadása közel sem annyira érintett, mint egy egyszerű ‘alter database tempfile resize ;’ növeli a helyet.

mi történik, ha az ideiglenes táblaterület nem létezik vagy nem érhető el? Az Oracle ezt fogja megjeleníteni:

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>

ha ezt a hibaüzenetet látja, ellenőrizze, hogy az ideiglenes táblaterület létezik-e, és online-e. Javítsa ki a talált problémákat (hozza létre a hiányzó táblaterületet, vagy tegye vissza a tempfiles-t online).

ha a tablespace létezik, de nincs hozzá rendelve tempfiles (ami előfordulhat adatbázis-visszaállítás/biztonsági mentésből történő helyreállítás után), akkor az Oracle jelentések:

SQL> select * from mybigtable order by mycoolkey;select * from mybigtable order by mycoolkey*ERROR at line 1:ORA-25153: Temporary Tablespace is Empty SQL>

tehát a feladat egyszerűen a ‘alter temporary tablespace kiadása … add tempfile …’parancsokat, hogy a tablespace már nem üres.

Az ideiglenes táblaterület kezelése nem rakétatudomány, de (néha jelentősen) különbözik a szokásos adatfájloknál alkalmazott ‘normál’ táblaterület-kezelési eljárásoktól. Annak ismerete, hogy a’ teljes ‘ ideiglenes táblaterület nem jelent problémát (ne feledje, hogy a szegmenseket kiosztják, majd újra felhasználják), kissé megkönnyítheti a feladatot, mivel az Oracle megmondja (ORA-01652 hibákkal), ha elfogy a hely. Ami azt jelenti, hogy a DBA hasznos feladatokra fordíthat időt, például a jelszó visszaállítására.

David Fitzjarrell összes cikkének megtekintése

Leave a Reply

Az e-mail-címet nem tesszük közzé.