Bestes Tool zum Migrieren einer PostgreSQL-Datenbank nach MS SQL 2005?


8

Ich habe eine Datenbank in PostgreSQL 8.3.1, die ich auf MS SQL Server 2005 (oder vielleicht 2008) migrieren möchte, einschließlich des Tabellenschemas und der Daten. Die Datenbank ist ungefähr 50 GB groß und hat ungefähr 400.000.000 Zeilen. Ich denke, einfache INSERT-Anweisungen kommen nicht in Frage. Kann jemand das beste Tool für diese Migration empfehlen? Offensichtlich muss es zuverlässig sein, damit die Daten in der Zieldatenbank genau dieselben sind wie in der Quelldatenbank, und es muss in der Lage sein, dieses Datenvolumen innerhalb einer angemessenen Zeit zu kopieren.


4
Nur aus Neugier: Warum um alles in der Welt willst du das tun?
wzzrd

Ich nehme an, Sie wechseln aus einem anderen Grund als nur wegen der Datenbankfunktionalität auf einen Windows-Server. Ich hoffe :)
Warren

Antworten:


6

Am Ende habe ich kein Tool von Drittanbietern für die Daten verwendet, da keines der Tools, die ich ausprobiert habe, für die großen Tabellen funktioniert hat. Sogar SSIS ist fehlgeschlagen. Ich habe jedoch ein kommerzielles Tool für das Schema verwendet. Mein Konvertierungsprozess war also wie folgt:

  1. Vollständige Konvertierung von Enterprise zum Kopieren des Schemas (keine Daten).
  2. pg_dump , um die Daten von Postgres im " Nur- Text" -Format zu exportieren, bei dem es sich im Grunde um eine TSV-Datei (Tab-Separated Values) handelt.
  3. Python-Skripte zum Umwandeln der exportierten Dateien in ein Format bcp würden verstehen.
  4. bcp , um die Daten in MSSQL zu importieren.

Der Transformationsschritt hat einige Unterschiede in den von pg_dump und bcp verwendeten Formaten berücksichtigt, wie z.

  • pg_dump setzt einige Postgres-spezifische Dinge am Anfang der Datei und beendet die Daten mit ".", während bcp erwartet, dass die gesamte Datei Daten enthält
  • pg_dump speichert NULL-Werte als "\ N", während bcp nichts anstelle von NULL erwartet (dh keine Daten zwischen Spaltentrennzeichen).
  • pg_dump codiert Registerkarten als "\ t" und Zeilenumbrüche als "\ n", während bcp diese wörtlich behandelt
  • pg_dump verwendet immer Tabulatoren und Zeilenumbrüche als Trennzeichen, während bcp dem Benutzer ermöglicht, Trennzeichen anzugeben. Dies ist erforderlich, wenn die Daten Registerkarten oder Zeilenumbrüche enthalten, da diese nicht codiert sind.

Ich fand auch heraus, dass einige einzigartige Einschränkungen, die in Postgres in Ordnung waren, in MSSQL verletzt wurden, sodass ich sie löschen musste. Dies lag daran, dass in MSSQL NULL = NULL ist (dh NULL wird als eindeutiger Wert behandelt), in Postgres jedoch nicht.


Das ist eine SQL-Server-Eigenart. Anstelle einer eindeutigen Einschränkung müssen Sie einen gefilterten eindeutigen INDEX festlegen (WHERE Spaltenname IST NICHT NULL).
Dilemma

Sie haben mir ein Werkzeug geführt, von dem ich meinen Chef überzeugt habe, es zu kaufen. Es ist fantastisch #FullConvert
Mugume David

6

Wenn Sie die entsprechenden Postgres-Supporttreiber auf Ihrer SQL 2005-Box installiert haben (oder Postgres über ODBC verwenden oder die Daten von Postgres in eine Datei sichern und daraus importieren möchten), können Sie den Import- / Export-Assistenten in SQL Server in verwenden um die Daten zu kopieren. Dadurch werden Ihnen verschiedene Fragen gestellt und der Import als SSIS-Paketjob (SQL Server Integration Services) unter Verwendung geeigneter Stapeleinfügevorgänge ausgeführt.

Wenn dieser Assistent jedoch keine Option ist, sollten Sie berücksichtigen, dass trotz einer großen Anzahl von Zeilen die individuelle Größe der Zeilen im Durchschnitt <135 Byte beträgt und ausreichend Transaktionsprotokollspeicherplatz vorhanden ist, damit eine Transaktion mit 50 GB ausgeführt werden kann. ' einfache Einfügungsanweisungen kommen selbst nicht in Frage.


1
Sehen Sie sich die Verwendung von BCP an (ein Dienstprogramm, das mit SQL Server geliefert wird), wenn Sie am Ende die Daten exportieren und dann in SQL Server importieren. Die Verwendung von SSIS ist jedoch eine gute Idee, wenn Sie es nur direkt vom PG-Server abrufen möchten, aber möglicherweise Probleme mit der Protokollierung haben.
ColtonCat

Das SSIS-Paket klang sehr vielversprechend und ich habe es versucht, aber leider geht ihm der Speicher aus und es schlägt fehl. :( ERROR [HY000] Nicht genügend Speicher beim Lesen von Tupeln.; Fehler beim Ausführen der Abfrage (PSQLODBC35W.DLL)
EMP


0

Fast 10 Jahre später, und dies ist immer noch kein einfaches Thema. Am Ende hatte ich eine Hybridlösung. Ich habe meinen eigenen Schema-Mapper gerollt, indem ich die Schema- und Tabellen- / Spaltenkommentare mit dem folgenden Befehl exportiert habe:

pg_dump --schema-only --no-owner --no-privileges your_db_name > schema_create_script.sql

Ich habe dann ein PHP-Skript geschrieben, das das Schema in T-SQL übersetzt hat. Anschließend habe ich die folgende Software von Drittanbietern verwendet, um den eigentlichen Import von Zeilen durchzuführen (keine Zugehörigkeit):

http://www.convert-in.com/pgs2mss.htm

Es war etwas langsam, aber soweit so gut. Unsere Datenbank war kleiner als Ihre, nur 15 GB, aber dieses Tool schien gut damit umzugehen. Es war auch das billigste, das ich bei etwa 50 Dollar finden konnte. Bisher hat sich die Investition gelohnt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.