Postgres – všetko, čo si chcel vedieť, ale bál sa spýtať svojho seniora, aby si nevypadal ako jelito 18. OID, relfilenode.
OID je interný identifikátor entity v postgrese. V rámci pg_class identifikuje relačné entity (table like).
Ten vzťah je vyjadrený v pg_class prostredníctvom relfilenode – identifikátore súboru. Postgres má 2 funkcie, ktorými to je možné rýchlo prevádzať na odpovedajúcu hodnotu:
pg_relation_filenode() – OID preložený na relfilenode
pg_filenode_relation() – relfilenode preložený na OID
pg_relation_filepath() – cesta k datovému súboru tabuľky
Pozor!!! Filenode sa u tabuliek mení – napr. po TRUNCATE, alebo VACUUM FULL, ktoré vytvoria nové relfilenode (pochopiteľne, vytvárajú nový datový súbor).
Pozor!!! Nie všetky tabule v postgresq majú relfilenode. Takzvané “nail tabule” systémového katalógu (napr. pg_class, pg_attributes….) majú filenode = 0 a mapovanie ich filenode je prostredníctvom binárneho súboru v PGDATA/base nazvaného pg_filenode.map
OIDs…
No a keď sme pri OIDoch, tak taká roztomilosť. pg_class má atribút (stĺpec) relhasoids (boolean), ktorý definuje, či bol pri CREATE TABLE vynútený parameter WITH OID (nie je to default a bavíme sa o user tables). Pokiaľ áno, tak je to pekný problém od verzie Postgresu 12, pretože táto a vyššie tento atribút zakazujú a nie je možné priamočiarý pg_upgrade na vyššie verzie, ak staršie tabule majú OIDy. Najprv je nutné deoidizovať ručne (ALTER TABLE ‘table’ SET WITHOUT OIDS)