Andreas Korthaus: Migration von MySQL nach PostgreSQL

Hallo!

Also ich bin jetzt die ganze Nacht schon dabei eine Datenbank von MySQL nach PostgreSQL zu portieren. Das erweist sich als schwieriger, als ich mir das vorgestellt habe.

Und dabei habe ich schon beim erzeugen der MySQL-DB versucht drauf zu achten möglichst wenig MySQL-spezifisches zu verwenden. Aber trotzdem gibt es Probleme ohne Ende.

Als erstes habe ich mal einen MySQL-Dump erzeugt. Ich wollte versuchen daraus SQL-Statemenst zu basteln, die sich in PostgreSQL einlesen lassen.
Natürlich habe ich im Internet ein bisschen gesucht, und einige Artikel zum Thema gefunden, aber so eine richtig zuverlässige Lösung habe ich nicht gefunden. Ich habe ein PHP-Script gefunden, was einige Ersetzungen macht (http://martin.f2o.org/php/my2pgsql).

Dann habe ich noch einige eigene Anpassungen vorgenommen.

Als erstes habe ich die Kommentare von # auf -- geändert.
Dann habe ich auto-increment entfernt.
Dann COMMENT auskommentiert.
tinyint gegen smallint ersetzt.

Naja, es waren noch zig Fehler drin. z.B. darf man keinen Spaltennamen  wie "user" verwenden, den muss man dann per " einschließen.

Dann stehen die Index-Definitionen nicht im CREATE-Statement sondern in eigenen Statements...

Ich habe fast 100 Tabellen, und ich würde schätzen in jeder 2. oder 3. hatte ich einen neuen Syntax-Error.

Naja, nach zig Stunden hatte ich dann einmal alles übertragen, aber ich bin mir jetzt nicht wirklich sicher dass alles wirklich so ist wie es in MySQL mal war. Nur lässt sich das schlecht testen, möglicherweise (oder eher mit ziemlicher Sicherheit) bemerke ich Fehler erst später, und das wäre natürlich schlecht.

Die Anwendung die das Ganze verwendet läuft mit PHP und PEAR::DB, das kann ich also recht einfach umswitchen.

Jetzt wollte ich mal fragen ob hier jemand Erfahrung mit der Thematik hat, oder gute Seiten zum Thema kennt, oder noch besser, ein zuverlässiges Tool welches die Übersetzung übernimmt.

Ich habe noch einige andere Scripte gesehen, aber keines wo ich wirklich vertrauen zu hatte, naja, das was ich oben verwendet habe gehört jedenfalls zu den schlechteren, denn danach waren noch wirklich viele Fehler drin. Hat hier vielleicht jemand Erfahrung mit einem besseren Script/Tool?

Oder kennt jemand noch ne gute Seite zu den Inkompatibiltäten zwischen diesen und vielleicht auch anderen Datenbanken? Also auch zu anderen SQL-Commands als CREATE, vor allem auch zu SELECT...

Viele Grüße
Andreas

  1. Moin  Andreas,
    Ich wäre angesichts der von Dir geschilderten Probleme geneigt, ein csv export zu machen.
    Kann das Phpmyadmin eigentlich sollte er doch oder?
    Und die Daten in Postgre wider einzulesen.
    Das dürfte einigermassen zuverlässig funktionieren, weil Du ja die Problematik der SQL Spezifika aussen vor läst.
    Problematisch sehe ich nur die Wahl des Trennzeichens an.
    Aber sonst..

    Viele Grüße aus Berlin

    TomIRL

    1. Kleine Ergänzung:
      Vielleicht helfen Dir diese beiden Links weiter..
      Es dürfte auch Äquivalente Formen für Postgre geben.

      http://www.mysql.de/doc/de/LOAD_DATA.html

      [http://www.dclp-faq.de/q/q-mysql-csv-export.html]

      TomIRL

    2. Hi Tom!

      Ich wäre angesichts der von Dir geschilderten Probleme geneigt, ein csv export zu machen.
      Kann das Phpmyadmin eigentlich sollte er doch oder?
      Und die Daten in Postgre wider einzulesen.
      Das dürfte einigermassen zuverlässig funktionieren, weil Du ja die Problematik der SQL Spezifika aussen vor läst.
      Problematisch sehe ich nur die Wahl des Trennzeichens an.

      Das Problem sind weniger die Daten, sondern die zuverlässige Übertragung der Tabellenschemen. Der mysqldump ohen die Daten, also nur die Struktur, hat weit über 1000 Zeilen. Das ist nicht "mal eben" von Hand gemacht, und Konvertierungs-Tools habe ich wie gesagt noch kein Zuverlässiges gefunden.

      OK, ews gibt ein Plugin für pgAdmin2, aber das funktioniert nicht mit MyODBC, zumindest nicht mit den Versionen die ich getestet habe, und andere finde ich nicht nicht zum Download. Im Postgres-Archiv habe ich auch gefunden dass die Treiber wohl irgendeinen Bug enthalten der dafür verantortlich ist, naja, ich denke eher der Migration-Wizzard enthält einen Bug. AFAIK wird das Teil aber nicht weiterentwickelt.

      Die Daten muss ich dann mal sehen, entweder per csv, oder INSERTS, da dürfte eigentlich nicht so viel dran falsch sein. die CREATE-Statements sind das Problem.

      Grüße
      Andreas

  2. Hallo Andreas,

    Kennst Du DBManager von http://www.dbtools.com.br/? Ich weiss nicht, wie gut die Umwandlung von MySQL nach PostgreSQL ist, aber ich hab damit zwischen MySQL und SQLite konvertiert, das ging problemlos.

    Dieter

    1. Hi!

      Kennst Du DBManager von http://www.dbtools.com.br/? Ich weiss nicht, wie gut die Umwandlung von MySQL nach PostgreSQL ist, aber ich hab damit zwischen MySQL und SQLite konvertiert, das ging problemlos.

      Vielen Dank, das Tool sieht jedenfalls schonmal vielversprechend aus - nur wie konvertiere ich jetzt die Tabellen damit?
      Ich kann zwar einen Dump exportieren, aber der ist dann total im MySQL-Stil, also nicht wirklich anders als die Ausgabe von mysqldump.

      Dann kann ich Typen konvertieren - wobei das soweit ich das sehe nur auf Daten angewendet wird, zumindest ändert sich nichts an den Typen/Syntax in der Tabellen-Definition wenn ich das mal anwende.

      Was hast Du genau gemacht um von MySQL nach sqlite zu konvertieren? Übersehe ich etwas?

      Viele Grüße
      Andreas

      1. Hi Andreas,

        Um ehrlich zu sein, weiss ich's nicht mehr, und was schlimmer ist, ich kann's auch nicht mehr nachvollziehen. Wahscheinlich war doch csv im Spiel.

        Sorry fuer die wenig hilfreiche Antwort.

        Dieter

        1. Hi!

          Um ehrlich zu sein, weiss ich's nicht mehr, und was schlimmer ist, ich kann's auch nicht mehr nachvollziehen. Wahscheinlich war doch csv im Spiel.

          csv bringt nur nichts für die Tabellen-Definitionen.

          Aber im pg-source waren 2 poerl-scripte, my2pg.pl und mysql2postgres.pl, erseres habe ich verwendet und das sieht schonmal viel besser aus (hat auch mal eben 1000 Zeilen). Jetzt habe ich nur Probleme mit den Sequenz-Tabellen die PEAR::DB angelegt hat, weil pg ja native sequenzen unterstützt ist das ganze da anders implementiert... ärgerliche Sache...

          Ich überlege zur Zeit ob es Sinn macht, eine PEAR::MDB  XML-Definition zu erzeugen, denn wenn ich die einmal habe wird das ganze erheblich einfacher, auch wenn ich demnächst nochmal was an der Datenstruktur ändere, oder andere RDBMS unterstzützen will.

          Mal sehen...

          Grüße
          Adnreas