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.
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 :-(.
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.
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)
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.
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.
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
Hallo,
vielen Dank für die schnelle Antwort. Der finanzielle Rahmen ist leicht beschrieben Null .
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?
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.
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.
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: