Archiv des Monats: Dezember 2025

Postgresql: Ermitteln Datenbankname aus postgresql-filesystem

Postgres speichert seine Datenbanken in einem „base“-Ordner mit Unterordnern pro Datenbank. Das Problem ist, dass die Unterordner aus einer Zahlenkombination bestehen (welche die oid der Datenbank darstellt). Falls es zu Problemen mit dem Filesystem kommt, kann man mit folgender Abfrage ermitteln, welcher Unterordner zu welcher Datenbank gehört (von postgresql-console psql):

postgres=# SELECT pg_database.datname,pg_database.oid FROM pg_database ORDER BY datname;

Damit erhält man eine Auflistung aller Datenbanknamen und der zugehörigen oid (welche die Zahl des Unterordners ist).

Ist der Unterordner bekannt (Unterordner = oid zB 16429), kann man mit folgender Abfrage die Datenbank ermitteln:

postgres=# SELECT oid,datname from pg_database WHERE oid=16429;

Beispiel: rsync error in /var/lib/postgresql/9.3/main/base/16429/234035538

Dann verbindet man sich mit der betroffenen Datenbank:

postgres=# \c my-database

Um den Tabellennamen bei Postgresql < 9.4 zu ermitteln:

SELECT 
    n.nspname AS tableschema, 
    c.relname AS tablename
FROM pg_class c
INNER JOIN pg_namespace n ON (c.relnamespace = n.oid)
WHERE c.relfilenode = 234035538; -- "subdir name"
 tableschema |          tablename          
-------------+-----------------------------
public | customers_bookings_services
(1 row)

Für Postgresql > 9.4:

SELECT pg_filenode_relation(0, 234035538); -- "0" stands for default tablespace