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.