A lemezen található fájlok meghatározása a postgresql táblákhoz

Néha meg kell határoznod, hogy melyik fájl felel meg a táblázatban. Önnek számjegyekkel teli elérési útja van, például a base / 16499/19401, és meg szeretné érteni. Megtekintheti azt a hibaüzenetet, amely megemlíti a fájl nevét, például:

Keresési módban

Az asztal elérési útját a következőképpen lehet megtekinteni:

de mi a helyzet a fordított folyamattal, és megkapja az objektum nevét az ösvénytől? Van egy pg_filenode_reláció függvény. ami megfelelőnek tűnik ehhez ... de annak használatához hozzá kell kapcsolódnia ahhoz a konkrét adatbázishoz, amelyhez ez a fájl tartozik, ami azt jelenti, hogy ismerjük ezt a kapcsolatot.

A fájl struktúrája

Itt találja meg a PostgreSQL modern verzióiban található táblák és adatbázisok elérési útját. (Az idősebb verziók más formátumot használnak, amelyet itt olvashat).

Három fő út van:

  • Az alapértelmezett táblaterületen lévő fájlok esetében a kapcsolat alap / adatbázis_oid / filenode azonosítója
  • Más táblaterületekről származó fájlok esetén: pg_tblspc / tablespace_oid / tablespace_version_subdir / database_oid / filenode id kapcsolatok
  • Általános kapcsolatok: globális / filenode id kapcsolatok

Az általános kapcsolatokat a végén fogják megvitatni. Az első két lehetőség közül, amelyek a leggyakoribbak, amelyekkel leggyakrabban találkozol, az utóbbi utolsó része azonos, az alap oid és az oid kapcsolat.

Megjegyzés: a "filenode id a kapcsolat" kifejezést használtam, nem pedig az "oid kapcsolat". Ez annak köszönhető, hogy a PostgreSQL-nek van egy relfilenode-térképje egy pg_relfilenode.map nevű fájlban minden adatbázis / táblaterület számára. Az asztalfájlok nevei nem feltétlenül egyeznek meg a pg_class-al. és változhatnak a VACUUM FULL, TRUNCATE és mások futása után. Például:

Hát akkor. Hogyan visszakerül ez a kapcsolat egy kapcsolat névhez?

Oid'y adatbázis és filenode ids kapcsolatok

Tegyük fel, hogy hiba van a cikk elején. Több részre osztható:

  • bázis: az alapértelmezett táblaterületen
  • 16396: az 16396-os adatbázisban
  • 3720450 filenód id a 3720450 órás asztalhoz

akkor fontolja meg, mit jelentenek mindegyikük.

OID adatbázis-meghatározás

Először a PostgreSQl folyamat bármely adatbázisához kell csatlakoznia és végrehajtania:

(vagy bármely más meglévő bázisodat). Ez megadja az adatbázis nevét.

Ezt követően csatlakoznia kell az adatbázishoz.

Az átkötések fordított konverziója a 9.4 verzióhoz

Ha a 9.4-es vagy újabb verziót használja, akkor az alábbi rész egyszerű:

(0 jelentése "alapértelmezett táblaterület")

Ez a függvény elvégzi a relripenod fordított konverzióját az Ön számára. Tehát csak megmutatja az asztal nevét. Nem jelenít meg semmilyen sémára mutató linket, ha az eredményül kapott táblanév az aktuális keresési_útvonalhoz tartozik; Használhatja a SET search_path = ''; mielőtt végrehajtaná a függvényt, annak érdekében, hogy az elérési útvonal a séma szerint legyen megadva.

A megfelelő adatbázishoz kell csatlakozni, vagy helytelen választ fog kapni, vagy egyáltalán nem érkezik válasz.

Az relfilenódák fordított konverziója a 9.3 verzióra

Ha a 9.3-as vagy annál korábbi verziót használja, akkor csatlakozzon ahhoz az adatbázishoz, amelyben a táblázat található, és hajtsa végre a következő lekérdezést a pg_class -ra:

(vagy bármely más kapott relfilenod id a táblázatban).

Ez megmondja, hogy melyik táblázathoz tartozik ez a hiba.

Nincs eredmény?

Nos, általában ez segít.

A Relfilenode szintén nulla lehet, ami viszont azt jelenti, hogy a fájl a pg_relfilenode.map segítségével található. Ez egy tipikus forgatókönyv az általános és egyes rendszerkatalógusokhoz, azok indexjeihez, TOAST tábláihoz stb. Például ez lehet pg_database. pg_class és pg_proc.

Mi a helyzet a rendszerrel?

Észrevetted, hogy a séma (névtér) nem jelenik meg az úton?

A PostgreSQL séma csak névtér az adatbázisban. Nincs hatásuk arra, hogy a lemezen lévő táblákat fizikailag tárolják.

A táblaterületek egyéb módjai

A legutóbbi esemény, amellyel találkoztam, a következő hiba volt:

Ez nem az alapértelmezett táblaterület, mivel az elérési út a pg_tblspc paranccsal kezdődik.

A táblázat megtalálása nagyon ugyanaz. A pg_tblspc / nnn / PG_n.n_nnnnnn / partet figyelmen kívül hagyhatja, és azonnal az adatbázis_oid / relation_oidra összpontosíthat. amint azt az alapértelmezett táblaterületekkel kapcsolatos esetekben leírtuk. Ezért érdemes megérteni, hogy mi az út.

Így a hibaszöveg a következő részekre tagolódik:

Már tárgyaltuk az adatbázis oid-ről és a táblázatos relfilenod idről szóló részt. Nem térnek el a táblaterülettől, csak máshol kezdődnek.

Mi a helyzet az asztal térével?

Az Oid a táblaterülethez tartozó pg_tablespace bejegyzést jelenti, amint azt a következők láthatják:

A táblaterület könyvtárában van egy másik könyvtár, amely a PostgreSQL verziója alapján lett elnevezve. Ez a változat statikus, és ennek egyetlen alkalmazása több PostgreSQL folyamat többszörös elérése egy táblaterülethez, például pg_upgrade alatt. Rendszerint csak egy rekord van.

Általában a struktúra megegyezik az alap / elérési utakkal - először az adatbázis oidjával, majd a kapcsolat oidjével.

Globális (megosztott) táblázatok

A hozzájuk tartozó útvonalak a bázis helyett globálisan kezdődnek, és nem rendelkeznek adatbázis-oid-összetevővel.

A gyakori könyvtárak nem jelöltek relphenode-t a pg_class-ban. Vagyis nem láthatja például a pg_class pg_database fájlt. A pg_filenode_hivatkozás null értéket ad vissza, függetlenül attól, hogy az alapértelmezett táblaterület oidjével hívják-e meg, vagy a 1664-es globális táblaterület oidjével.

Ennek megvilágítása a következő cikk témája a megszüntetett linkekkel.

Természetesen, ha problémákat tapasztal a közös könyvtárakkal, akkor valószínűleg nem tudja elvileg elindítani az adatbázist.

Kártérítés

Az adatbázis sérülése nem történhet meg. De minden esetben megtörténhet. Ezek problémákat okozhatnak a hardver, a rendszermag-hibák vagy a fájlrendszerek, az SSD-k, amelyek megbízható lemezáramlások, hibás tárolóhálózatok és természetesen maga a PostgreSQL létrehozására vonatkoznak. Ha az adatbázis sérülését gyanítja, mielőtt bármit megtennél, olvassa el és kövesse a wiki oldalán található tanácsokat.

belsejét

Ha látni szeretné, hogyan működik mindez, futtassa az relpathbackend makrót az src / include / common / relpath.h fájlban. A GetRelationPath-ot az src / common / relpath.c fájlban hívja.