ich bin gerade dabei einen PostGIS 1.2.1-Aufsatz in meine PostgreSQL 8.2.7-DB zu bringen. Nachdem ich PostGIS konfiguriert + installiert und erfolgreich eine TestDB inkl. plpgsql eingerichtet habe, scheitern jedoch die weiteren Schritte:
Vermutlich findet er die PostGIS-Library nicht oder ein anderes Pfadproblem.
Du könntest nach dem kompilieren ein ldconfig probieren. Dazu muß der Pfad zu den PostGIS-libs in /etc/ld.so.conf vertreten sein, oder du gibst ihn manuell an.
Aber warum nimmst du nicht PostGIS 1.3, da hat sich einiges geändert gegenüber 1.2.x?
Neben dem, was Gisman sagte: obige Fehlermeldung ist nur ein Folgefehler, der Auslöser ist eher. Egal was passiert, wenn in einer Transaktion ein Fehler passiert, scheitern alle nachfolgenden Befehle in dieser Transaktion. Nix anderes ist hier passiert.
Also, wenn Du genau wissen willst, was die Ursache ist, dann hilft nur eines: den Fehler zu suchen, der die TX scheitern läßt.
Eventuell könnten auch die anderen Fehlermeldungen Aufschluß bringen
Ergänzend zu Andreas:
Meine Erfahrungen mit diesen Fehlern sind die, das beim Installieren der PostGIS-Funktionen in der Datenbank mit lwpostgis.sql die Lib nicht gefunden wird und deshalb das sql-Statement einen Fehler erzeugt, der die Transaktion abbricht.
Ja es scheint wirklich so, dass die entsprechenden Bibliotheken nicht gefunden werden.
Ich habe nun doch PostGIS 1.3.3 installiert. Dafür musste ich allerdings die libgeos - Bibliotheken manuell konfigurieren + installieren, weil mein Ubuntu die aktuell geforderten per Paketverwaltung nicht unterstützt.
Nach der Neuinstallation gelange ich wieder bis zum besagten Punkt, allerdings sind die Fehlermeldungen jetzt etwas ausführlicher (beinhalten z.B. die gesamte Funktion ).
Der erste ERROR lautet:
cgadge@metacities:~$ /usr/local/pgsql/bin/psql -d mygeodb -f /usr/local/pgsql/share/lwpostgis.sql
BEGIN
NOTICE: type "histogram2d" is not yet defined
DETAIL: Creating a shell type definition.
psql:/usr/local/pgsql/share/lwpostgis.sql:46: NOTICE: type "histogram2d" is not yet defined
DETAIL: Creating a shell type definition.
ERROR: could not load library "/usr/local/pgsql/lib/liblwgeom.so": libgeos_c.so.1: cannot open shared object file: No such file or directory
STATEMENT: CREATE OR REPLACE FUNCTION histogram2d_in(cstring)
RETURNS histogram2d
AS '$libdir/liblwgeom', 'lwhistogram2d_in'
LANGUAGE 'C' IMMUTABLE STRICT;
psql:/usr/local/pgsql/share/lwpostgis.sql:46: ERROR: could not load library "/usr/local/pgsql/lib/liblwgeom.so": libgeos_c.so.1: cannot open shared object file: No such file or dir
Bisher habe ich aufgrund mangelnder Erfahrung immer per Paketverwaltung nachinstalliert…
Muss bei der Konfiguration der libgeos etwas beachtet werden? Oder wie kann ich den Pfad der PostGIS libs direkt angeben?
Moin!
Du solltest prüfen, ob der postgres-user, unter dem du die sqls ausführen solltest, das Verzeichnis zur Lib im Pfad hat, so das er sie finden kann.
Daraus ergeben sich die folgenden Möglichkeiten zu Lösung:
Einbinden des $libdir in die Path-Variable
Setzen von sym-Links der Lib in ein Verzeichnis im Pfad
ersetzen der Ausdrucks ‘$libdir’ im sql-Statement durch den absoluten Pfad zur Lib (at your own risk!)
Setzen von sym-Links der Lib in ein Verzeichnis im Pfad
Ich habe in dem bei der PostGIS-Installation angegebnenen $libdir nachgeshen, wo ich besagte liblwgeo.so (link nach liblwgeo.so.1.3) auch finden konnte.
Ich habe nun mal Symlinks zu verschiedenen Verzeichnissen gesetzt:
Auf der Suche nach Lösungen sind mir folgende Dinge aufgefallen…
Da die Funktion ja mittels user ‘postgres’ ausgeführt wird, muss da etwas beachtet werden?
Alle verlinkten lib-Ordner haben zumindest ‘read’ + ‘execute’ Rechte…so dass ‘postgres’ darauf zugreifen kann.
Da in der Fehlermeldung auch etwas von ‘cannot load shared objects’ stand, habe ich mal ldconfig ausgeführt. Dort kam neben der Auflistung aller Verzeichnisse inkl. libs die Meldung, dass die Datei /etc/ld.so.conf nicht existiert. Schlimm?
Ja.
Ich kann mir nicht vorstellen, das es die nicht gibt, den da steht drin, wo der Linker nach zusätzlichen Libraries suchen soll. ich weiß aber nicht, wie das unter Debianoidem gehandhabt wird. Da soll ja öfters mal was auskommentiert werden
Versuch mal find / -type f -name ld.so.conf
Ich vermute stark, das du ein Pfadproblem hast, leider kann ich dir nicht genau sagen, wie Ubuntu das alles handhabt, weil ich nur Susen hier rennen hab. Die Leserechte stimmen auch sicherlich, nur, wenn unter dem Nutzer Postgres der Pfad nicht gefunden wird, hilft das nichts. Du könntest unter postgres mal probieren was ‘echo $PATH’ hevorzaubert un ggf. dort die richtigen Pfade setzen.
Die Datei ld.so.conf existiert (standardmäßig unter Ubuntu?!) nicht…
Daher habe ich sie nun per Hand erzeugt und die entsprechenden Pfade zu den libs eingetragen.
Jetzt scheint die benötigte lib gefunden zu werden. Allerdings gibt es nun ein Kompatibilitätsproblem mit der lib, wenn ich die Fehlermeldung richtig interpretiere.
BEGIN
psql:/usr/local/pgsql/share/lwpostgis.sql:46: NOTICE: type "histogram2d" is not yet defined
DETAIL: Creating a shell type definition.
psql:/usr/local/pgsql/share/lwpostgis.sql:46: ERROR: incompatible library "/usr/local/pgsql/lib/liblwgeom": missing magic block
HINT: Extension libraries are required to use the PG_MODULE_MAGIC macro.
Ich weiß allerdings überhaupt nicht, was es mit dem PG_MODULE_MAGIC auf sich hat. Da werde ich mich erstmal schlau machen müssen.
Was es nicht alles gibt…
Ich habs mir ja schon gedacht, das in Postgres eine Magic-Komponente steckt
Du könntest dich mal auf der PostGIS-Mailingliste umsehen, da kann dir vielleicht eher jemand helfen, weil das ist mir jetzt noch nicht untergekommen
Wenn du aber was neues weißt, poste es doch hier, dann haben alle was davon.
Tatsächlich habe ich zwei PostgreSQL Installationen, eine 8.1 im Produktivsystem und eine 8.2 für meine TestGeoDB. Da ab 8.2 die Magic_Komponente integriert ist, die Installationen aber mglw. auf gleiche libs zugreifen bzw. auf die ‘falschen’ Header zugegriffen wird, könnte das Problem dort liegen.