Mit PG auf Oracle-View zugreifen

Hallo Wissende,
ich muss (unter Windows) eine PG-Tabelle mit Daten aus einer Oracle-View aktualisieren.

Mein aktuelles Verfahren PG und Oracle per ODBC in Access zu verknüpfen und (einmal am Tag) zu aktualisieren stößt langsam an seine Grenzen.

Wie könnte man nur mit PostgreSQL das alte Verfahren ablösen?

Gruß Steffen

Eine Lösung ist ein Foreign Data Wrapper, siehe: https://wiki.postgresql.org/wiki/Fdw#Specific_SQL_Database_Wrappers. Dann musst Du eventuell gar nichts mehr “replizieren” weil der Zugriff einfach immer “direkt” zu Oracle geht.

Die andere Alternative ist ein Text (“CSV”) Export/Import. Der Import in Postgres dürfte dann am schnellsten via COPY gehen - um vernünftige Text-Exports aus Oracle zu ziehen gibt es viele Tools.

Letztendlich hängt das auch davon ab, über wie viele Datensätze wir hier reden. Hunderte? Tausende? Millionen? Zig-Millionen?

Hallo,
vielen Dank für die (rasend) schnelle Antwort.
Es geht nicht um einen reinen Import sondern um eine (tägliche) Aktualisierung einer bestehenden Tabelle. (Löschabfrage+Aktualiserungsabfrage+Anfügeabfrage). CSV ist leider keine Alternative, da ich keine habe.

Den Wrapper werde ich mal einmal anschauen.

Gruß Steffen

Hallo,
ich noch mal :rolleyes: .

Ich habe mich jetzt an der Wrapper Installation versucht.

Ich habe PostgreSQL x64-9.3 und entsprechend oracle_fdw-1.2.0-pg93-win64.zip installiert.

Ich bekomme allerdings beim Anlegen der Extention:

CREATE EXTENSION oracle_fdw

den Fehler:

FEHLER:  konnte Bibliothek „D:/Programme/PostgreSQL/9.3/lib/oracle_fdw.dll“ nicht laden: unknown error 193

********** Fehler **********

FEHLER: konnte Bibliothek „D:/Programme/PostgreSQL/9.3/lib/oracle_fdw.dll“ nicht laden: unknown error 193
SQL Status:58P01

Vorhanden ist die Datei:

 Verzeichnis von d:\Programme\PostgreSQL\9.3\lib

02.02.2015  16:09           140.800 oracle_fdw.dll
               1 Datei(en),        140.800 Bytes
               0 Verzeichnis(se), 100.426.485.760 Bytes frei

Habe es auch schon auf einem anderen Rechner versucht. Im iNet kann ich nichts helfendes zum Fehler finden.

Hat jemand für das Problem einen Ansatzpunkt?

Gruß Steffen

Der Fehler 193 kommt üblicherweise wenn es ein 32/64bit Durcheinander gibt.

Hast Du auch einen 64bit Oracle client?

Ich nehme bei Problemen mit DLLs immer den DependencyWalker her: http://www.heise.de/download/dependency-walker.html

Hallo,

Hast Du auch einen 64bit Oracle client?

Oracle müsste 32bit sein. Greift denn an der Stelle schon Oracle? Nach der Fehlermeldung will er doch (die) eine dll-laden. Geht eigentlich so ein “mixed mode” überhaupt?
Ein Test mit der 32bit-Version bringt übrigens den gleichen Fehler.

Evtl. könnten es noch mangelnde Reche sein - allerdings läuft ja der Rest problemlos :-(.

Gruß Steffen

Ja, Wenn oracle_fdw.dll geladen wird, dann lädt die DLL wiederum die oci.dll vom Oracle Client nach. Wenn die nicht geladen werden kann, dann kann auch die oracle_fdw.dll nicht geladen werden.

Geht eigentlich so ein “mixed mode” überhaupt?

Nein, natürlich nicht. Es muss alles durchgängig 32bit oder 64bit sein, Postgres, FDW und Oracle Client (also die Oracle Client Software die auf dem Rechner liegt auf dem Postgres läuft)

Ein Test mit der 32bit-Version bringt übrigens den gleichen Fehler.

Du meinst ein Test mit 32bit Oracle Client, 32bit Postgres und 32bit FDW?

Wie gesagt, lad’ dir den DependencyWalker runter und öffne damit die oracle_fdw.dll, dann siehst Du warum die DLL nicht geladen werden kann.

Hallo,
also wenn PGx64 und Oracle 32bit nicht zusammen geht, dann ist für mich hier leider Feierabend :-(.
PG auf 32bit zurück ist mir zu aufwändig/zu unsicher und Oracle 64bit werde ich hier nicht “durchbekommen”.

DependencyWalker werde ich mal privat testen. Hier bekomme ich nix so einfach installiert :-(.

Trotzdem vielen Dank für die schnelle und kompetente Hilfe.

Gruß Steffen

Du musst nicht Oracle auf 64bit bekommen, Du musst nur den Client auf 64bit bekommen (ein 64bit Client kann mit einem 32bit Server “reden”)
Der Instant Client ist das einfach eine ZIP Datei die ausgepackt wird: Instant Client for Microsoft Windows (x64) 64-bit
Mit Ausnahme von ein paar Umgebungsvariablen muss da nichts weiter “installiert” werden.

Läuft den Oracle auf dem gleichen Rechner wie Postgres? Wenn ja, dann müsste man dafür sorgen, dass der Postgres Service eben den Instant Client “sieht” und nicht die “richtige” Oracle Installation. Am einfachsten ist das wenn der Postgres Service als eigener Windows Benutzer läuft (also nicht “Lokaler Netzwerkdienst” bzw. “Lokales System”) dann kann man die Umgebungsvariable (PATH, ORACLE_HOME, ORACLE_SID usw) entsprechend nur für diesen Benutzer setzen.

DependencyWalker werde ich mal privat testen. Hier bekomme ich nix so einfach installiert

Das ist auch nur eine ZIP Datei die ausgepackt werden muss. Da muss man nichts installieren. Aber wenn Du nur einen 32bit Oracle Client hast, dann muss man gar nicht weiter probieren, das kann nicht funktionieren.


Als Alternative kannst Du mal den SQL Client versuchen den ich verwende (http://sql-workbench.net/). Der hat ein (proprietären) Befehl mit dem man Daten von einem DB System zu einem andere kopieren kann (22. Copy data across databases). Am einfachsten wäre es damit die Daten der View 1:1 in eine Zwischentabelle zu kopieren, und dann via SQL die eigentlichen UPDATE, INSERT, DELETE Statements von der Zwischentabelle in die “richtige” Tabelle zu machen. Das geht auch im Batchmodus (z.B. über eine geplanten Task in Windows)

Hallo,

Du musst nur den Client auf 64bit bekommen

Schon klar ;-).
Aber es ist ein recht großer Anwendungsserver auf welchem die PG-DB läuft und da ist (im Moment) unsicher was ein Wechsel des Ora-Clients auf andere Applikationen für einen Einfluss hat. Der Oracle-Server selbst läuft woanders.
PG selbst läuft unterm Systemkonto, so dass auch die Anpassung der Systemvariablen nicht so einfach geht.

DependencyWalker …Das ist auch nur eine ZIP Datei die ausgepackt werden muss.

Ja versuch macht klug. Hatte nur gelesen “nicht portabel - da Registryeintragung”.

Also werde ich zunächst mal eine private “Versuchsanordnung” aufbauen. Ich habe nicht so den extremen Druck, da die Aufgabe im Moment mit MSAccess und odbc bis auf eine Kleinigkeit zuverlässig gelöst ist.
Letztendlich ist die Frage ob ich mit der “Wrapper”-Lösung eine aktuelle Lösung hinbekomme. Eine “Livesicht” geht nicht, da die Daten zwingend in eine bestimmte pg-Tabelle geschrieben werden müssen. Ein Trigger wird nicht funktionieren, da dieser die Änderungen in der View wohl nicht mitbekommt. Bliebe noch ein fester Aktualisierungszyklus …
Aber das ist dann ein ganz anderes Thema für welches ich im Fall der Fälle einen neuen Thread aufmache.

Vielen Dank
Steffen

Hallo,
nach gut einem Jahr habe ich es jetzt endlich geschafft die Verbindung zu Oracle herzustellen.
War gar nicht so kompliziert, man muss halt nur 32/64bit beachten.

Bliebe das bereits angedeutete Thema

Letztendlich ist die Frage ob ich mit der “Wrapper”-Lösung eine aktuelle Lösung hinbekomme. Eine “Livesicht” geht nicht, da die Daten zwingend in eine bestimmte pg-Tabelle geschrieben werden müssen. Ein Trigger wird nicht funktionieren, da dieser die Änderungen in der View wohl nicht mitbekommt. Bliebe noch ein fester Aktualisierungszyklus …

Also ich muss also Daten aus der Oracle-VIEW in eine PG-Tabelle schaffen.
Dies muss mindestens einmal täglich bzw. optimaler Weise bei Änderungen in Oracle erfolgen.

Gibt es hierfür einen Ansatz?

Gruß Steffen :slight_smile:

ein ‘Ansatz’ wäre logical replication. 2ndQuadrant hat dazu eine Entwicklung, pg_logical. IIRC wurde damit bei einem oder mehreren unserer Kunden damit schon sowas erfolgreich gemacht… bin da aber nicht involviert.

Falls Dein finanzieller Rahmen das zuläßt kannst ja mal bei uns anklopfen :wink:

Hallo,
vielen Dank für die schnelle Antwort. Der finanzielle Rahmen ist leicht beschrieben Null :rolleyes: .

Aber irgendwas zeitgesteuertes (terminierter Trigger??) sollte doch möglich sein!? Würde dann halt z.B. aller paar Minuten schauen, ob Änderungen in Oracle gemacht wurden.

Muss ich wirklich ein externes Programm erstellen, um PostgreSQL zu einer Aktion zu veranlassen?

Gruß Steffen

Du kannst Dir pgBucket anschauen, damit kannst Du innerhalb von PG quasi einen Cron laufen lassen: https://bitbucket.org/dineshopenscg/pgbucket

Du mußt halt zusehen, alle Änderungen aus Ora nachzuführen: Inserts, Updates, Deletes. Da aller N Sekunden/Minuten einen ‘Snapshot’ der Tabellen zu vergleichen ist um einiges mühsammer als wenn man diese Änderungen als logischen Stream bekommen könnte.

Vielleicht kommst Du besser, in Ora via TRIGGER Änderungen zu protokollieren und daraus Anweisungen für PG zu generieren.

Oder, falls das reicht, einmal/mehrmals täglich in PG alles wegwerfen und komplett aus Ora neu ziehen. Das hängt letztendlich auch von der Datenmenge ab, über die wir reden.

Postgres hat leider keinen eingebauten Scheduler so Oracles dbms_scheduler.
Es gibt aber mehrere Extensions die das nachrüsten, z.B. diese hier GitHub - citusdata/pg_cron: Run periodic jobs in PostgreSQL

Hallo,
vielen Dank für die Antworten.

Ich habe mir als ersten Schritt jetzt folgendes überlegt:
Mein GIS (welches auf PG zugreift) lasse ich beim Start einen Datensatz in eine PG-Tabelle schreiben. Dieser Insert löst dann den Trigger aus, welcher einen Oracle-PG Abgleich durchführt.
Werde außerdem versuchen nach dem gleichen Prinzip einen Knopf im GIS einzubauen, welcher dann die Aktion sofort auslöst.

Gruß Steffen

Btw.: PostgreSQL 9.3.6 (deine Signatur), aktuell ist 9.3.14. Da sind etlich kritische Bugs. Übrigends wird 9.3.15 (und andere Versionen) demnächst einen weiteren nicht ganz unkritischen Bug beheben: