db.dobo.sk

Postgres – všetko, čo si chcel vedieť, ale bál sa spýtať svojho seniora, aby si nevypadal ako jelito 18. OID, relfilenode.

bez komentára

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)

píše: ďobo

March 11th, 2024 o 2:50 pm

chlievik: mimo

okomentuj