Pg_stat_statements: ERROR: extension "pg_stat_statements" has no installation script nor update path for version "1.7"

Hallo,

ich habe postgreSQL 12.5 installiert (RHEL 8.3)

dazu rief if psql aufund führte folgendes Kommando aus:
postgres=# create extension pg_stat_statements;

die Ausgabe war dann aber:
ERROR: extension “pg_stat_statements” has no installation script nor update path for version “1.7”

Hat jemand eine Idee ?

Danke im Voraus

Hast Du die Extension in shared_preload_libraries eingetragen, so wie es im Handbuch beschrieben ist?

ja, das habe ich:

shared_preload_libraries = 'pg_stat_statements' # (change requires restart)

Aber beim Restart bekam ich dann folgende Meldung:

FATAL: could not access file "pg_stat_statements": No such file or directory

habe ich versucht.
dann hat er die Extension nicht gefunden. Ich bekomme die Fehlermeldung:
2021-02-25 20:06:19.696 CET [1313179] FATAL: could not access file “pg_stat_statements”: No such file or directory

shared_preload_libraries = ‘pg_stat_statements’

Hast Du den das “contrib” Package installiert?

yum install postgresql12-contrib

(bin mir aber grad nicht ganz sicher ober RPM Name stimmt)

ich habe die Sourcen heruntergeladen, compiliert und die Bins erzeugt (make).

im contrib Verzeichnis liegt pg_stat_statements

Bin mir aber nicht sicher, ob er denn auch dort suchst, ob nur im ./share/extension Verzeichnis.
oder muss ich dann etwas (z.B. als Präfix) angeben, damit er im contrib Verzeichnis sucht.
Leider gibt die Fehlermeldung nicht her, wo er was sucht …

Also wenn ich das contrib Paket über die rpms installiere, landen die “.so” Dateien unter /usr/pgsql-12/lib und die dazugehörigen .sql Dateien (die für ein CREATE EXTENSION benötigt werden) unter /usr/pgsql-12/share/extension

Über pg_config kannst Du Dir anzeigen lassen welche Verzeichnisse Deine Installation verwendet (LIBDIR und SHAREDIR sind dafür zuständig wenn ich das richtig im Kopf habe)

Hallo @castrop
leider habe ich keine RPMs - sondern den Source Code heruntergeladen und compilert.

pg_config liefert bei mir
BINDIR = /opt/postgres/12.5/bin
DOCDIR = /opt/postgres/12.5/share/doc
HTMLDIR = /opt/postgres/12.5/share/doc
INCLUDEDIR = /opt/postgres/12.5/include
PKGINCLUDEDIR = /opt/postgres/12.5/include
INCLUDEDIR-SERVER = /opt/postgres/12.5/include/server
LIBDIR = /opt/postgres/12.5/lib
PKGLIBDIR = /opt/postgres/12.5/lib
LOCALEDIR = /opt/postgres/12.5/share/locale
MANDIR = /opt/postgres/12.5/share/man
SHAREDIR = /opt/postgres/12.5/share
SYSCONFDIR = /opt/postgres/12.5/etc
PGXS = /opt/postgres/12.5/lib/pgxs/src/makefiles/pgxs.mk
CONFIGURE = ‘–prefix=/opt/postgres/12.5’
CC = gcc
CPPFLAGS = -D_GNU_SOURCE
CFLAGS = -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -O2
CFLAGS_SL = -fPIC
LDFLAGS = -Wl,–as-needed -Wl,-rpath,’/opt/postgres/12.5/lib’,–enable-new-dtags
LDFLAGS_EX =
LDFLAGS_SL =
LIBS = -lpgcommon -lpgport -lpthread -lz -lreadline -lrt -lcrypt -ldl -lm
VERSION = PostgreSQL 12.5

in /opt/postgres/12.5/share/extension habe ich nur folge drei Dateien
-rw-r–r-- 1 postgres postgres 310 Feb 19 21:01 plpgsql–1.0.sql
-rw-r–r-- 1 postgres postgres 179 Feb 19 21:01 plpgsql.control
-rw-r–r-- 1 postgres postgres 370 Feb 19 21:01 plpgsql–unpackaged–1.0.sql

in /opt/postgres/12.5/contrib habe ich ein Unterverzeichnis pg_stat_statements, dass aber weitesgehnd leer ist:
$ ls -lR pg_stat_statements/
pg_stat_statements/:
total 12
drwxr-xr-x 2 postgres postgres 4096 Feb 19 20:42 expected
lrwxrwxrwx 1 postgres postgres 79 Feb 19 20:42 Makefile → /opt/postgres/12.5/software/postgresql-12.5/contrib/pg_stat_statements/Makefile
drwxr-xr-x 2 postgres postgres 4096 Feb 19 20:42 sql

pg_stat_statements/expected:
total 0

pg_stat_statements/sql:
total 0

was kann ich tun?

pg_stat_statements.so müsste bei Deiner Konfiguration in /opt/postgres/12.5/lib liegen, damit es funktioniert.

Unabhängig davon: ich finde die Idee die Minor Version im Namen der Verzeichnisse zu verwenden eher schlecht. Wenn Du 12.6 installieren willst, dann musst Du die komplette Verzeichnisstruktur neu aufbauen. Typischerweise nimmt man nur die Major-Version in den Verzeichnisnamen mit auf. Besser wäre also eine Installation nach /opt/postgres/12/

Hallo @castrop,

danke Dir für den Hinweis. Ich werde das so für einen anderen (und weitere übernehmen).

Wo kann ich denn diese Datei pg_stat_statements.so herbekommen, wenn ich keine rpm installiert habe?

Muss ich das make mit einem speziellen Parameter aufrufen?

Leider finde ich dazu keine Doku …

Danke DIr im Voraus

Sorry, keine Ahnung. Ich installiere immer über die RPMs.

Aus Neugier: warum kannst Du keine RPMs verwenden?

@castorp

a) Die Server, auf die installiere, haben alle keine Verbindung zum Internet
b) rpm installieren immer an eine feste Position (im FS), mit make kann ich die Bins an die Stelle legen, die mir passt
c) da es bisher noch keinen wirklichen Grund gab, rpm vorzuziehen, haben ich es so gemacht wie auch bei mysql und mariadb

Oder gibt es neben diesem noch andere Vorteile von rpm ?

Der Server braucht keine Verbindung zum Internet. Genau wie die Sourcen, kannst Du die ja vorher manuell herunterladen und auf den Server kopieren.

Die RPMs halten sich üblicherweise an das empfohlene Dateisystemlayout der Distribution. Dadurch findet man sich überall zurecht, und muss nicht auf jedem System wieder suchen “wie es dort gemacht wurde”. Auch ist die Installation der vierteljährlichen Bugfix Versionen deutlich einfacher über RPMs

1 Like

Ich baue mir PostgreSQL auch ab und zu aus den Quellen und mache das immer folgendermaßen:

make -j2 && make check && make install
cd contrib && make && make install 

Für dich ist die 2. Zeile interessant.

1 Like

Hallo frastr,

danke das hat geholfe.
Das war genau die Information ich benötigte.