PostgreSQL: column d.daticu does not exist

13-cze-2021

Do wylistowania baz danych w clustrze PostgreSQL można użyć skrótowego polecenia

\l

Niestety,  od pewnego momentu uruchomienie tego polecenia kończy się błędem:

postgres=# \l
ERROR: column d.daticu does not exist
LINE 6: d.daticu as "ICU",
 ^
HINT: Perhaps you meant to reference the column "d.datacl".

Co się stało?

Na serwerze wcześniej był zainstalowany PostgreSQL 13 w wersji Community (czysty postgres).

Później na tym samym serwerze został zainstalowany Enterprise DB Advanced Server (czyli postgres „na sterydach” publikowany przez EDB). Podczas tej instalacji do katalogu /usr/bin został wkopiowany plik psql właśnie od EDB.

EDB budując własną dystrybucję PostgreSQL dodało pewne kolumny do tabel systemowych, w szczególności do tabeli pg_database.

Kiedy uruchamiasz psql, to w pierwszej kolejności jest przeszukiwana ścieżka /usr/bin, więc uruchamiany jest program od EDB. W tym programie skrót „\l” jest skojarzony z zapytaniem, które ma wydobyć z tabeli pg_database kolumnę daticu, a standardowy PostgreSQL jej po prostu nie ma.

Co z tym zrobić? Przede wszystkim należałoby pogrozić palcem EDB, bo to bardzo zły zwyczaj, żeby psuć inne instalacje swoją instalacją. Podstawowa dystrybucja Postgresa postąpiła o wiele mądrzej. Skoro już jednak się stało, jak się stało, to można albo:

  • uruchamiać psql podając pełną ścieżkę do tej komendy
/usr/pgsql-13/bin/psql
  • zmodyfikować zmienną PATH, tak aby ścieżka wskazująca na /usr/pgsql-13/bin znalazła się przed /usr/bin. Generalnie nie jest to zalecane, bo… w ten sposób można „przykryć” inne polecenia systemowe, ale… polecenia postgresa są specyficzne (nie przykryją innych komend systemu), a ponadto zmiana jest wykonywana tylko dla jednego użytkownika, no więc… można zaryzykować. Najłatwiej zrobić to w .bash_profile, lub jeśli korzystasz z pgsql_profile, to tam:
PATH=/usr/pgsql-13/bin:$PATH

 

Komentarze są wyłączone

Autor: Rafał Kraik