Az Oracle adatbázisok teljesítményhangolása, vagy más néven tuningolása, kulcsfontosságú feladat minden adatbázis-adminisztrátor (DBA) számára. Míg az Oracle Enterprise Edition számos fejlett eszközt, mint például az Automatic Workload Repository-t (AWR) és az Active Session History-t (ASH) kínálja, addig a Standard Edition (SE) licenc sokkal korlátozottabb lehetőségeket biztosít. Ebben a bejegyzésben egy régi, de még mindig rendkívül hasznos eszközre, a Statspack-re fogunk fókuszálni, amely Oracle 19c Standard Edition alatt is hatékonyan használható a teljesítményproblémák felderítésére.
Ez a részletes, technikai útmutató végigvezet téged a Statspack telepítésén, konfigurálásán és használatán, hogy te is képes legyél a legtöbbet kihozni Oracle SE adatbázisodból. A célunk, hogy egy komplett képet adjunk arról, miként lehet ezt a klasszikus eszközt a modern Oracle 19c környezetben is hatékonyan alkalmazni, különös tekintettel azokra a buktatókra, amelyek egy régen nem frissített csomag esetében előfordulhatnak.
1. Miért a Statspack? Az Örökzöld Teljesítmény-analizátor
Az Oracle Standard Edition egyik legnagyobb kihívása a teljesítményhangoláshoz szükséges eszközök hiánya. Az Oracle szándékosan korlátozza a drágább Enterprise Edition funkcióit, így a DBA-knak kreatívnak kell lenniük. Itt jön képbe a Statspack.
A Statspack egy ingyenes, az Oracle által biztosított szkriptgyűjtemény, amely lehetővé teszi az adatbázis teljesítményadatainak időszakos rögzítését, ún. "snapshot"-ok formájában. Ezek a snapshotok az adatbázis állapotának egy-egy pillanatképét rögzítik, beleértve a rendszerstatisztikákat, várakozási eseményeket (wait events), a legtöbb erőforrást fogyasztó SQL utasításokat és még sok mást. Két snapshot között eltelt időszakról riportot készítve részletes képet kaphatunk az adatbázis terheléséről és a potenciális szűk keresztmetszetekről.
Hogyan működik?
A Statspack a PERFSTAT
séma alatt hoz létre táblákat, amelyekben eltárolja a begyűjtött teljesítményadatokat. A snapshot készítésekor a statspack.snap
procedúra lefut, amely összegyűjti az aktuális adatokat a dinamikus teljesítmény nézetekből (V$ nézetek) és beilleszti őket a PERFSTAT
tábláiba. A riportkészítés során a spreport.sql
szkript két, általad megadott snapshot adatait hasonlítja össze, és ebből generál egy elemzésre alkalmas szöveges riportot.
A Statspack nagy előnye, hogy teljesen operációs rendszer független. Legyen szó Windows-ról, Linux-ról vagy bármilyen Unix variánsról, a működése és a használata megegyezik, hiszen teljes mértékben az adatbázison belül fut. Bár az Oracle már egy jó ideje nem fejleszti aktívan, az alapvető funkcionalitása és az általa nyújtott adatok Oracle 19c alatt is rendkívül értékesek a teljesítményproblémák diagnosztizálásában.
2. A Statspack Telepítése Oracle 19c Adatbázisra
A telepítési folyamat meglehetősen egyszerű, de néhány lépésre érdemes odafigyelned a zökkenőmentes működés érdekében.
Előkészületek:
Táblatér Létrehozása: Mielőtt telepítenéd, hozz létre egy dedikált táblateret a
PERFSTAT
felhasználó számára. Ez a bevált gyakorlat, mivel így a Statspack által gyűjtött adatok nem terhelik aSYSTEM
vagy más, alkalmazások által használt táblateret.SQL> CREATE TABLESPACE PERFSTAT_DATA DATAFILE '/u01/oradata/ORCL/perfstat_data01.dbf' SIZE 500M AUTOEXTEND ON NEXT 100M MAXSIZE 4G;
Telepítés lépésről lépésre:
Csatlakozás
SYSDBA
-ként: Nyiss egy terminált vagy parancssort, és csatlakozz az adatbázishozSYS
felhasználókéntSYSDBA
jogosultsággal.A Telepítő Szkript Futtatása: A telepítő szkript az
$ORACLE_HOME/rdbms/admin
könyvtárban található. Indítsd el aspcreate.sql
szkriptet:sqlplus / as sysdba SQL> @?/rdbms/admin/spcreate.sql
Paraméterek Megadása: A szkript futás közben több kérdést is feltesz:
PERFSTAT user password: Adj meg egy biztonságos jelszót a
PERFSTAT
felhasználónak. Jegyezd fel, mert a riportok készítéséhez erre a felhasználóra lesz szükséged.Default tablespace for PERFSTAT user: Itt add meg az előzőleg létrehozott
PERFSTAT_DATA
táblatér nevét.Temporary tablespace for PERFSTAT user: Add meg az adatbázis alapértelmezett ideiglenes táblaterét (általában
TEMP
).
A szkript lefutása után a PERFSTAT
felhasználó és az összes szükséges tábla, nézet és csomag létrejön. A telepítés után a PERFSTAT
felhasználói fiókot akár zárolhatod is (ALTER USER PERFSTAT ACCOUNT LOCK;
), mivel a snapshotok készítését és a riportolást ütemezett feladatokon keresztül, vagy SYSDBA
-ként is elvégezheted.
3. Snapshot Készítése: Manuálisan és Ütemezve
A snapshotok rögzítik az adatbázis teljesítményadatait egy adott időpillanatban. Készíthetsz belőlük manuálisan, vagy beállíthatsz automatikus, ütemezett adatgyűjtést.
Manuális Snapshot Készítése:
Csatlakozz a PERFSTAT
felhasználóval, és futtasd a statspack.snap
eljárást:
sqlplus perfstat/jelszo
SQL> EXEC statspack.snap;
Snapshot Szintek:
A statspack.snap
eljárásnak megadhatsz egy i_snap_level
paramétert, amellyel a gyűjtött adatok részletességét szabályozhatod. A leggyakoribb szintek:
Level 0: Alapvető teljesítmény-statisztikák (wait eventek, rendszerstatisztikák, stb.).
Level 5 (alapértelmezett): Mindent tartalmaz, amit a 0-s szint, kiegészítve a leginkább erőforrás-igényes SQL utasítások adataival. A legtöbb esetben ez a szint az ajánlott.
Level 10: Minden, ami az 5-ös szinten van, plusz részletes "child latch" információk. Ez a szint már jelentős többletterhelést okozhat, csak indokolt esetben használd.
Példa snapshot készítésére 5-ös szinten: EXEC statspack.snap(i_snap_level => 5);
Automatikus Snapshot Készítés dbms_scheduler
-rel:
A rendszeres adatgyűjtéshez érdemes automatizálni a snapshotok készítését. Erre a dbms_scheduler
a modern és javasolt megoldás. Az alábbi példa egy olyan jobot hoz létre, amely minden órában lefut.
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'STATSPACK_SNAPSHOT_JOB',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN statspack.snap; END;',
start_date => SYSTIMESTAMP,
repeat_interval => 'FREQ=HOURLY; BYMINUTE=0',
enabled => TRUE,
comments => 'Hourly Statspack snapshot collection.');
END;
/
Általánosságban csúcsidőben érdemes sűrűbben, például 15-30 percenként, míg normál terhelés mellett óránként snapshotot készíteni.
4. A Régi Snapshotok Törlése és Automatizálása
A folyamatosan gyűjtött adatok idővel jelentős helyet foglalhatnak el a PERFSTAT_DATA
táblatérben. A karbantartás elengedhetetlen része a régi, már nem releváns snapshotok rendszeres törlése.
Miért szükséges a törlés?
Tárhely-gazdálkodás: Megakadályozza a Statspack táblatér felesleges növekedését.
Teljesítmény: A riportok generálása gyorsabb lehet, ha a rendszernek nem kell hatalmas mennyiségű régi adaton végigmennie.
A sppurge.sql
szkript segítségével manuálisan törölhetsz snapshotokat egy adott tartományban. Azonban sokkal hatékonyabb ezt is automatizálni. Az alábbi dbms_scheduler
job minden nap lefut, és törli a 14 napnál régebbi snapshotokat:
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'STATSPACK_PURGE_JOB',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN statspack.purge(i_num_days => 14); END;',
start_date => TRUNC(SYSTIMESTAMP) + INTERVAL '1' DAY, -- Holnap éjjel indul
repeat_interval => 'FREQ=DAILY; BYHOUR=1', -- Minden nap hajnali 1-kor
enabled => TRUE,
comments => 'Daily purge of Statspack snapshots older than 14 days.');
END;
/
5. A 19c "Idle Event" Probléma és Javítása
Mivel a Statspack fejlesztése már régen leállt, nem minden esetben van felkészítve a legújabb Oracle verziók specifikumaira. Oracle 19c esetében tapasztalható, hogy a riportokban több, valójában tétlen (Idle
) várakozási esemény is aktív várakozásként jelenik meg. Ez torzíthatja az elemzést, mivel a "Top Timed Events" szekcióban olyan események is előkelő helyre kerülhetnek, amelyekkel valójában nem kell foglalkoznod.
Szerencsére ezt a problémát egy egyszerű SQL utasítással orvosolhatod. Csatlakozz a PERFSTAT
felhasználóval, és futtasd az alábbi INSERT
parancsot. Ez az utasítás összegyűjti az adatbázis által ismert összes Idle
eseményt a v$event_name
nézetből, és hozzáadja őket a Statspack stats$idle_event
táblájához, ha még nincsenek benne.
sqlplus perfstat/jelszo
SQL> insert into stats$idle_event
select name from v$event_name where wait_class='Idle'
minus
select event from stats$idle_event;
commit;
Ezt a javítást elegendő egyszer, a Statspack telepítése után lefuttatnod, és a jövőbeni riportok már a helyes adatokat fogják mutatni.
6. Riportok Készítése
Miután összegyűjtöttél elegendő snapshotot egy vizsgálni kívánt időszakról, elkészítheted a teljesítményriportot.
Csatlakozás
PERFSTAT
felhasználóval:sqlplus perfstat/jelszo
A Riport Szkript Futtatása: Indítsd el a
spreport.sql
szkriptet az ORACLE_HOME/rdbms/admin könyvtárból:SQL> @?/rdbms/admin/spreport.sql
Paraméterek Megadása: A szkript interaktívan bekéri a riport elkészítéséhez szükséges információkat:
List of Available Snapshots: Megjelenik egy lista az elérhető snapshotokról, azok ID-jával és időbélyegével.
Enter begin snap id: Add meg a kezdő snapshot azonosítóját.
Enter end snap id: Add meg a befejező snapshot azonosítóját.
Enter report name: Adj meg egy nevet a riport fájlnak, vagy hagyd az alapértelmezettet.
A szkript lefutása után az aktuális könyvtárban létrejön a megadott nevű .lst
kiterjesztésű szöveges fájl. Ez a fájl tartalmazza a részletes teljesítményanalízist a két snapshot közötti időszakról.
A riport elemzése komoly szakértelmet igényel, és messze túlmutat ennek a bejegyzésnek a keretein. A riport felépítésének és a legfontosabb szekciók (Load Profile, Instance Efficiency, Top 5 Timed Events, SQL Statistics) értelmezésének egy jövőbeli bejegyzésben fogunk részletesen foglalkozni.
Remélem, ez a bejegyzés hasznos volt a számodra az Oracle Statspack csomaggal kapcsolatos információk megismerésében. Amennyiben további kérdésed lenne, ne habozz hozzám fordulni!
Szabadúszó vizsgázott Oracle szakértőként szívesen segítek akár az Oracle Statspack telepítésével kapcsolatban.
Oracle DBA Szolgáltatásaim a következőket tartalmazzák:
Telepítés és konfigurálás
Adatbázis migrálás
Hibaelhárítás és optimalizálás
Tanácsadás és oktatás
Vedd fel velem a kapcsolatot e-mailben a palffy.peter@oracle-szakerto.hu címen, ha bármilyen kérdésed van, vagy árajánlatot szeretnél kérni.
Segítek elérni az Oracle adatbázisokkal kapcsolatos céljaid!