PostGIS Funktionen in DB bringen

Hallo miteinander,

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:

psql -d mygeodb -f lwpostgis.sql 
psql -d mygeodb -f spatial_ref_sys.sql

Es erscheinen mehrere Fehlermeldungen á la

psql:/usr/local/pgsql/share/lwpostgis.sql:4321: ERROR: current transaction is aborted, commands ignored until end of transaction block

Leider kann ich mit dieser Fehlermeldung an sich nicht viel anfangen.
Weiß jemand worin das Problem liegen könnte?

Info: das Ganze ist auf einem Ubuntu 6.06 Server installiert, PostgreSQL läuft und bis zu diesem Schritt gab es keine Fehlermeldungen…


Gruß
cga

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?

Gruß Uwe

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.

Andreas

Du könntest psql starten und die Datei mittels \i einlesen, statt -f auf der Kommandozeile zu benutzen. Vorher führst du dann noch das hier aus:

stop psql on first error - ads’ corner

Dann siehst du, wo der Fehler auftritt.

Eventuell könnten auch die anderen Fehlermeldungen Aufschluß bringen :wink:

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.

Gruß Uwe

Ja es scheint wirklich so, dass die entsprechenden Bibliotheken nicht gefunden werden. :angry:

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 :confused: ).

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?

Danke für weitere Tipps…
cga

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!)

Grüssle Uwe

Hallo Gisman,

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:

  • /usr/lib
  • /usr/local/lib/
  • /usr/local/pgsql/lib
  • /usr/local/pgsql/share

Die Fehlermeldung bleibt jedoch bestehen.

Auf der Suche nach Lösungen sind mir folgende Dinge aufgefallen…

  1. 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.

  2. 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?

Gruß cga

Ja. :wink:
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 :wink:

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.


Grüssle Uwe

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. :frowning:

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.

Trotzdem sind weitere Tipps willkommen… :wink:

Gruß cga

Was es nicht alles gibt… :astonished:
Ich habs mir ja schon gedacht, das in Postgres eine Magic-Komponente steckt :wink:

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 :wink:
Wenn du aber was neues weißt, poste es doch hier, dann haben alle was davon.

Grüssle Uwe

Hab in einem PostGIS-Forum auch was passendes zu meinem Problem gefunden…
[postgis-users] Error running lwpostgis.sql

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.

Dort werde ich mal ansetzen…