Datenimport von MSSQL Server zu PostgresSQL mit ODBC

Hallo zusammen,

ich habe bei meinen SQL Server Management Studio einen linked Server über den ODBC Windows 32 Bit Treiber eingerichtet. Mit einen Insert möchte ich nun 100 Millionen Einträge auf den Postgre Server importieren.

Leider kommt es dabei immer zu einen Timeout und die Windwos SQL Instanz schmiert vollständig ab;( Wenn ich den Import auf 100 000 Einträge beschränke läuft alles durch.

Das SQL System ist nur miniaml mit RAM ausgestatet und dieser ist auch komplett voll bevor die SQL Instanz abstürzt. Hat jemand schon mal mit ähnlichen Problemen zu kämpfen gehabt?

Danke für eure Hilfe!

Gesundes neues noch…

Das klingt für mich so, als ob da der Treiber alle Einträge erst einmal im RAM zwischenzuspeichern gedenkt. Ich bin mir recht sicher: wenn Du aus der Ursprungstabelle die Daten in eine CSV exportierst und diese dann via COPY in PostgreSQL einlesen würdest, würde es nicht nur schneller, sondern überhaupt funktionieren.

Für Systeme mit 100 Millionen Rows solltest Du Dir bzw. der Maschine allerdings etwas RAM gönnen…


Andreas

Danke für die Antwort!

Der Weg über CSV ist für mich leider keine Option da ich die Daten bevor ich Sie inserte noch aufbereite.
Außerdem möchte ich damit auch die Zuverläßigkeit des ODBC Treibers testen da die Postgre DB zukünftig im produktiv Betrieb auch noch von einigen MSSQL Servern Daten beziehen wird.

Vielleicht kann man ja noch was am ODBC Treiber ändern damit kenn ich mich aber leider noch nicht gut genug aus.

Grüße aus Kiev

Das ist kein Argument, zumindest in PostgreSQL kannst Du dies tun:

COPY (SELECT ... FROM table WHERE ...) TO ...

Damit also kannst Du innerhalb Deiner Quell-DB Deine Aufbereitung durchführen.

Zu ODBC: da sollte es IMHO eine Option ‘sql pass through’ geben, damit der Treiber das SQL nicht verschlimmbessert. Ob das in Deinem Fall, wo Daten von einem System zum anderen wandern sollen, relevant ist, vermag ich aber nicht zu sagen. Vermutlich nicht, denn, wie schon gesagt, vermute ich, daß der Treiber da erst mal alles an sich zieht und im Speicher halten will.

Ich an Deiner Stelle würde die CSV-Option weiter auf dem Tisch lassen …

Andreas

Auch nach vielen Einstellungen am Postgres SQL Treiber ist es mir nicht gelungen das Problem mit dem Speicherüberlauf und dem Absturz der SQL Instanz zu beheben.

Fazit: für große Datenmengen die man auf einmal einspielen möchte ist der ODBC Treiber 32Bit nicht gemacht
den Test mit den 64 Bit werde ich noch nachholen.


Als Lösung auch wenn nicht sehr schnell aber ich mich für eine Cursor Variante entschieden. Diese läßt sich zwar auch noch von der Geschwindigkeit steigern für erste reicht mir aber das überhaupt daten kommen.

FETCH
NEXT FROM contact_cursor into @RID,@TS,@SA,@UNIT,@ID,@S1,@S2,@S3


Der Cursor enthält damit immer eine Zeile welche ich dann mit insert into in meine PostgreSQL Datenbank einspielen kann.

Mache das (auf PostgreSQL-Seite) in einer Transaktion, das geht dann schneller. Also, Autocommit abschalten, begin transaction zuerst, commit zum Schluß nicht vergessen …


Andreas

Danke für den Hinweis! Sobald ich von der Linux Seite aus den MSSQL Server ansprechen kann werde ich das versuchen. Gibt es die Möglichkeit einen MSSQL Server in das PG Admin Studio einzubinden? Oder muss ich dann dort alles von der Kommdozeile mit dem MSSQL Server machen.

Gruß und Danke!

Zu M$SQL kann ich Dir exakt überhaupt nicht helfen.

Andreas