Mi minden van egy (Oracle) adatbázisban? ======================================== Adatbázisok szintjei 1. Fizikai szint (fájlok) Adatfájlok (ebben vannak tárolva ténylegesen az adatok -> *.dbf) Naplófájlok (ebbe íródnak a módosításokról készült naplóbejegyzések -> *.log) Vezérlőállományok (mindenféle információk az adatbázisról -> *.ctl) Paraméterállomány (init.ora), jelszóállomány... stb. 2. Logikai szint Az adatbázis objektumai (tábla, nézet, index ... stb.) Séma: egy adott felhasználó tulajdonában lévő összes objektum (de vannak olyan objektumok is, amelyek egyik sémába se tartoznak bele) => Séma objektumok és Sémán kívüli objektumok ('közösek', amikre mindenkinek szüksége van) A táblák mindig valamilyen sémában vannak! (azért van kivétel) Például: egy adatbázis kapcsolat (database link) az séma objektum, de lehet public database link-et is létrehozni, ami már sémán kívüli objektum. Hasonló a helyzet a szinonimával. Van két speciális séma: SYS és SYSTEM (kötelezően létrejönnek, ebben vannak a rendszerkatalógus táblák) Egy objektumra történő teljes hivatkozás: schema.objektum@database_link (-> elosztott adatbázis) Táblák tulajdonságainak vizsgálata ================================== describe T1; -- egy tábla oszlopainak és azok típusának kiíratása Érdekesség: az adatbázis-kezelő nem ismer describe-ot, már a kliens 'lefordítja' egy SQL utasításra (valamilyen select-re) De akkor honnan veszi a rendszer a tábla oszlopaira vonatkozó infokat? -> Rendszerkatalógus Rendszerkatalógus: táblákból (nézetekből) áll, melyek az adatbázis telepítésekor létrejönnek és különböző adminisztrációs infókat tárolnak. Nevezik adatszótárnak, rendszer-katalógusnak vagy meta-adatbázisnak is. Valójában nem is igazi táblák, hanem nézetek. Általában beszédes nevük van: prefix_nev Példák prefixre: USER (az adott user tulajdonában lévő objektumok) pl. USER_TABLES ALL (amihez joga van az adott usernek) pl. ALL_TABLES DBA (az adatbázis összes objektuma) pl. DBA_TABLES Például az egyes táblák oszlopairól a DBA_TAB_COLUMNS táblából lehet infóhoz jutni. Azért egy igazi rendszerben egy 'mezei' felhasználónak nincs joga mindenhol nézelődni. Nektek most van. Az összes katalógus tábla neve és oszlopai -> Oracle doksi: Reference itt: Part II Static Data Dictionary Views A legfontosabb adatszótár, ahonnan érdemes kiindulni a kereséskor: DBA_OBJECTS (ALL_OBJECTS) Táblák létrehozása Fizikai tárolás =============== Azt szeretnénk megvizsgálni, hogy ha van mondjuk egy T1 táblánk, az hol és melyik fájlban van, valamint az abban található adatok ténylegesen hogyan vannak tárolva. Adatblokk: a legkisebb tárolási egység (2K, 4K, 8K, ...) (Minden fájlt az adatbázis-kezelő feloszt blokkokra.) A jelenlegi adatbázisunkban 8k a blokkméret. Extens (extent, kiterjesztés): adatblokkokból álló összefüggő terület. Például ha egy fájl méretét növelni kell, akkor valahány extens-sel növeli a rendszer Adatfájl: extensekből áll Szegmens (segment): mindig több extensből áll, és egy szegmens pontosan egy objektumhoz (pl. tábla, index, klaszter) tartozik. Átnyúlhat több adatfájlra is, de persze egy fájlban lehet több szegmens is. Egy szegmens ~ Egy objektum Táblatér (tablespace): Táblatér - adatfájl kapcsolat 1-N Táblatér - szegmens kapcsolat 1-N Vannak kötelező táblaterek is: SYSTEM, SYSAUX stb. A tárolással kapcsolatos fogalmak és azok egymással való kapcsolata +-----------+ | ADATBÁZIS | +-----------+ | /|\ +----------+ +--------| TÁBLATÉR |--------+ | +----------+ | /|\ /|\ +----------+ +----------+ | ADATFÁJL | | SZEGMENS | +----------+ +----------+ | | /|\ | +--------+ | | EXTENS |+----------------------+ +--------+ | /|\ +-------+ | BLOKK | +-------+ Kapcsolódó katalógusok ====================== DBA_DATA_FILES: a rendszer által használt adatfájlok információi DBA_TEMP_FILES: a temporális táblaterek adatfájljainak információi DBA_TABLESPACES: táblaterek információi Szegmensekről bővebben ====================== DBA_SEGMENTS, DBA_EXTENTS Adatbázis objektumok: - fizikai tárolással rendelkező objektumok pl. tábla, index, cluster - fiz. tárolással nem rendelkező objektumok pl. procedura, nézet, szekvencia (csak a definíció van tárolva) Szegmens sok mindenhez tarozhat, a DBA_SEGMENTS.SEGMENT_TYPE mutatja, hogy egy adott szegmens mihez tartozik SELECT * FROM dba_segments WHERE owner='NIKOVITS' AND segment_name='DOLGOZO' AND SEGMENT_TYPE='TABLE' Régebben 1 tábla 1 szegmens volt, azonban mióta nagyon nagy táblákat is képes kezelni a rendszer, már nem célszerű 1 szegmensbe tenni egy nagy táblát. Partícionálás: ============== egy táblát több szegmensre osztunk fel. Meg lehet adni, hogy milyen szempontok alapján darabolja fel a táblát. Például intervallumokat adhatunk meg -> Range partícionálás. Vagy van még Lista és Hash partícionálás, sőt lehet olyat is, hogy csinálok egy particionálást és az egyes partíciókat tovább lehet particionálni. Csak két szint mélységig lehet. Később még lesz róla szó. Érdekesség, hogy ilyenkor egy tábla már túlnyúlhat egy táblatéren. Csak azt lehet garantálni, hogy minden szegmense (partíciója) pontosan egy táblatéren van. Érdekesség az érdekességben: nem csak azért állhat egy tábla több szegmensből, mert nagyon sok adat van benne, hanem az is lehetséges, hogy valamilyen LOB típusú adat van benne. Ilyenkor érdemes lehet a LOB típusú adatokat kirakni külön szegmensre.