it-swarm.com.de

MySql zu PostgreSql Migration

Mein PostgreSQL ist unter Windows installiert. Wie kann ich Daten aus der MySQL-Datenbank nach PostgreSQL migrieren? Ich habe Tonnen von Artikeln gelesen. Nichts hilft :(

Vielen Dank.

Meine Handlungen:

  1. mysql dump:

    mysqldump -h 192.168.0.222 --port 3307 -u root -p --compatible=postgresql synchronizer > c:\dump.sql
    
  2. db-Synchronizer bei pgsql erstellen

  3. import Dump:

    psql -h 192.168.0.100 -d synchronizer -U postgres -f C:\dump.sql
    
  4. ausgabe: 

    psql:C:/dump.sql:17: NOTICE:  table "Db_audit" does not exist, skipping
    DROP TABLE
    psql:C:/dump.sql:30: ERROR:  syntax error at or near "("
    СТРОКА 2:  "id" int(11) NOT NULL,
               ^
    psql:C:/dump.sql:37: ERROR:  syntax error at or near ""Db_audit""
    СТРОКА 1:LOCK TABLES "Db_audit" WRITE;
                 ^
    psql:C:/dump.sql:39: ERROR:  relation "Db_audit" does not exist
    СТРОКА 1:INSERT INTO "Db_audit" VALUES (4068,4036,4,1,32,'2010-02-04 ...
                 ^
    psql:C:/dump.sql:40: ERROR:  relation "Db_audit" does not exist
    СТРОКА 1:INSERT INTO "Db_audit" VALUES (19730,2673,2,2,44,'2010-11-23...
                 ^
    psql:C:/dump.sql:42: ERROR:  syntax error at or near "UNLOCK"
    СТРОКА 1:UNLOCK TABLES;
     ^
    psql:C:/dump.sql:48: NOTICE:  table "ZHNVLS" does not exist, skipping
    DROP TABLE
    psql:C:/dump.sql:68: ERROR:  syntax error at or near "("
    СТРОКА 2:  "id" int(10) unsigned NOT NULL,
               ^
    psql:C:/dump.sql:75: ERROR:  syntax error at or near ""ZHNVLS""
    СТРОКА 1:LOCK TABLES "ZHNVLS" WRITE;
                 ^
    psql:C:/dump.sql:77: WARNING:  nonstandard use of escape in a string literal
    СТРОКА 1:...???????? ??? ???????','10','4607064820115','0','','??????-??...
                                                          ^
    ПОДСКАЗКА:  Use the escape string syntax for escapes, e.g., E'\r\n'.
    Cancel request sent
    psql:C:/dump.sql:77: WARNING:  nonstandard use of escape in a string literal
    СТРОКА 1:...??????????? ????????','10','4602784001189','0','','???????? ...
    
20

Meine Erfahrung mit MySQL -> Postgresql-Migration war nicht wirklich angenehm, also musste ich Daniels Vorschlag über CSV-Dateien unterbreiten.

In meinem Fall habe ich das Schema by hands neu erstellt und dann alle Tabellen mit mysqldump und pg_restore nacheinander importiert.

Während dieses Dump/Restore möglicherweise für die Daten arbeitet, haben Sie mit dem Schema höchstwahrscheinlich kein Glück. Ich habe keine kommerziellen Lösungen ausprobiert, also sehen Sie was andere Leute sagen und ... viel Glück!

UPDATE: Ich habe mir den Code angesehen, den der Prozess hinterlassen hat, und hier ist, wie ich es tatsächlich gemacht habe.

Ich hatte ein etwas anderes Schema in meiner PostgreSQL-Datenbank, also wurden einige Tabellen verbunden, andere aufgeteilt. Aus diesem Grund war der direkte Import keine Option, und mein Fall ist wahrscheinlich komplexer als das, was Sie beschreiben, und diese Lösung kann ein Overkill sein.

Für jede Tabelle in der PG-Datenbank habe ich eine Abfrage geschrieben, in der die relevanten Daten aus der MySQL-Datenbank ausgewählt werden. Für den Fall, dass die Tabelle in beiden Datenbanken grundsätzlich gleich ist und es keine Verknüpfungen gibt, kann dies so einfach sein

select * from mysql_table_name

Dann habe ich die Ergebnisse dieser Abfrage nach XML exportiert. Dazu müssen Sie sie wie folgt ausführen:

echo "select * from mysql_table_name" | mysql [CONNECTION PARAMETERS] -X --default-character-set=utf8 > mysql_table_name.xml

Dadurch wird eine einfache XML-Datei mit der folgenden Struktur erstellt:

<resultset statement="select * from mysql_table_name">
  <row>
    <field name="some_field">field_value</field>
    ...
  </row>
  ...
</resultset>

Dann schrieb ich ein Skript, das eine INSERT-Anweisung für jedes Zeilenelement in dieser XML-Datei erstellt. Der Name der Tabelle, in die die Daten eingefügt werden sollen, wurde diesem Skript als Befehlszeilenparameter angegeben. Python-Skript , falls Sie es brauchen.

Diese SQL-Anweisungen wurden in eine Datei geschrieben und dann wie folgt an psql übergeben:

psql [CONNECTION PARAMETERS] -f FILENAME -1

Der einzige Trick bei der XML-> SQL-Umwandlung bestand darin, Zahlen zu erkennen und sie zu bewerten.

Um es zusammenzufassen: mysql kann Abfrageergebnisse als XML erzeugen und Sie können es verwenden.

9
Maxim Sloyko

In meinem eher einfachen Fall (30 Tabellen, 10000 Datensätze) habe ich ein Perl-Skript verwendet:

http://pgfoundry.org/frs/?group_id=1000198

Es durchforstete die mysql-Dump-Datei und erzeugte eine Pg-Dump-Datei mit den folgenden Problemen.

Ich habe zu Heroku importiert, also habe ich ihr pgbackups-Plugin verwendet, das fast einwandfrei funktionierte. 

Probleme, auf die Sie achten sollten

  1. Boolesche Datentypen. MySQL speichert diese als 0 und 1. PostGreSQL speichert sie als t und f. Achten Sie darauf, dass die Booleschen nicht als Ganzzahlen migriert werden.
  2. IDs automatisch inkrementieren. Möglicherweise werden Ihre IDs ab 1 erneut gezählt. Sie erhalten folgende Fehler: "Doppelter Schlüsselwert verstößt gegen eindeutige Einschränkung ...". Es ist leicht zu reparieren, aber pass auf.
8
superluminary

Es ist etwas komplizierter als das. Es gibt viele Dokumentationen hier:

http://wiki.postgresql.org/wiki/Converting_from_other_databases_to_PostgreSQL#MySQL

Dort finden Sie auch Konvertierungsskripte.

8

Ich habe py-mysql2pgsql zum Konvertieren einer großen MySQL-Datenbank in Postgres verwendet. Es geht meistens sehr gut. Ich musste es jedoch für einige Fälle anpassen, die auf meine Bedürfnisse zugeschnitten waren. 

https://pypi.python.org/pypi/py-mysql2pgsql

Standardmäßig werden Daten aus MySQL gelesen und in Postgres geschrieben. Sie können jedoch das Schema und/oder die Daten in eine Datei schreiben, um sie vor dem Laden in Postgres zu prüfen.

3

Sie können https://github.com/mihailShumilov/mysql2postgresql Verwenden. Dies ist in PHP - Konverter geschrieben

1
GodSon

Es gibt auch einen sehr schönen (Fork of a) Python-Konverter, der von den Gitlab-Erstellern gepflegt wird:

https://github.com/gitlabhq/mysql-postgresql-converter

Die ursprüngliche Gabel ist für dieses Projekt veraltet. Für mich funktionierte alles perfekt mit diesem Skript.

0
panmari

Hier gibt es ein Projekt, das paarweise Ihre aktuelle MySQL-Datenbank zu Postgresql migriert, einschließlich Indizes und Fremdschlüssel. Außerdem können Sie Namen, Indizes und Spaltentypanalyse definieren, um das Standardverhalten zu überschreiben.

https://github.com/ggarri/mysql2psql

Ich hoffe, es könnte für jeden von Ihnen nützlich sein, der an der Migration seines aktuellen Projekts zu PG interessiert ist. In unserem Fall haben wir eine Leistungssteigerung von etwa 20% erzielt. 

0
Gabriel G.