web-dev-qa-db-fra.com

Migration de MySql vers PostgreSql

Mon PostgreSQL est installé sur Windows. Comment puis-je migrer des données de la base de données MySQL vers PostgreSQL? J'ai lu des tonnes d'articles. Rien n'y fait :(

Merci.

Mes actions:

  1. mysql dump:

    mysqldump -h 192.168.0.222 --port 3307 -u root -p --compatible=postgresql synchronizer > c:\dump.sql
    
  2. créer un synchroniseur de base de données à pgsql

  3. dump d'importation:

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

    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
Andrew Kalashnikov

Mon expérience avec MySQL -> La migration Postgresql n’était pas très agréable, je devais donc appuyer la suggestion de Daniel concernant les fichiers CSV.

Dans mon cas, j'ai recréé le schéma à la main puis importé toutes les tables, une par une, à l'aide de mysqldump et de pg_restore.

Ainsi, pendant que cette sauvegarde/restauration peut fonctionne pour les données, le schéma ne vous laisse probablement pas de chance. Je n'ai pas essayé de solutions commerciales, alors voyez ce que les autres disent et ... bonne chance!

UPDATE: J'ai regardé le code laissé par le processus et voici comment je l'ai fait.

J'avais un schéma un peu différent dans ma base de données PostgreSQL, donc certaines tables ont été jointes, d'autres ont été scindées. C'est pourquoi l'importation directe n'était pas une option et que mon cas est probablement plus complexe que ce que vous décrivez et que cette solution risque d'être excessive.

Pour chaque table de la base de données PG, j'ai rédigé une requête qui sélectionne les données pertinentes de la base de données MySQL. Si la table est fondamentalement la même dans les deux bases de données et qu’il n’ya pas de jointures, cela peut être aussi simple que cela.

select * from mysql_table_name

Ensuite, j'ai exporté les résultats de cette requête au format XML. Pour ce faire, vous devez l'exécuter comme suit:

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

Cela créera un fichier XML simple avec la structure suivante:

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

Ensuite, j'ai écrit un script qui produit une instruction INSERT pour chaque élément de ligne de ce fichier XML. Le nom de la table, où insérer les données, a été donné comme paramètre de ligne de commande à ce script. Script Python , au cas où vous en auriez besoin.

Ces instructions SQL ont été écrites dans un fichier, puis envoyées à psql comme ceci:

psql [CONNECTION PARAMETERS] -f FILENAME -1

La seule astuce qui existait dans la transformation XML -> SQL consiste à reconnaître les nombres et à les annuler.

Pour résumer: mysql peut produire des résultats de requête au format XML et vous pouvez les utiliser.

9
Maxim Sloyko

Dans mon cas plutôt simple (30 tables, 10000 enregistrements), j'ai utilisé un script Perl:

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

Il a analysé le fichier de vidage mysql et produit un fichier de vidage pg, avec les problèmes suivants.

J'importais dans Heroku, j'ai donc utilisé le plug-in pgbackups, qui fonctionnait presque parfaitement. 

Problèmes à surveiller

  1. Types de données booléens. MySQL les stocke en tant que 0 et 1. PostGreSQL les stocke en tant que t et f. Veillez à ce que les booléens ne soient pas migrés sous forme d'entiers.
  2. Auto incrémentation des identifiants. Vous trouverez peut-être que vos identifiants commencent à compter à partir de 1. Vous obtiendrez des erreurs comme celle-ci: "la valeur de la clé dupliquée viole la contrainte unique ...". C'est facile à réparer, mais faites attention.
8
superluminary

C'est un peu plus compliqué que ça. Il y a beaucoup de documentation ici:

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

Vous y trouverez également des scripts de conversion.

8
Peter Eisentraut

J'ai utilisé py-mysql2pgsql pour convertir une grande base de données MySQL en Postgres. Il gère très bien la plupart des cas. Je devais le corriger pour quelques cas spécifiques à mes besoins cependant. 

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

Par défaut, il lit les données de MySQL et écrit dans Postgres. Mais vous pouvez lui demander d'écrire le schéma et/ou les données dans un fichier à inspecter avant de les charger dans Postgres.

3
Anand Chitipothu

Vous pouvez utiliser https://github.com/mihailShumilov/mysql2postgresql Ceci est écrit sur PHP convertisseur

1
GodSon

Il y a aussi un très joli (fork of a) convertisseur de python qui est maintenu par les créateurs de gitlab:

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

La fourche d'origine est pour ce projet est périmé. Pour moi, tout fonctionnait parfaitement avec ce script.

0
panmari

Voici un projet qui migre en deux commandes de votre base de données MySQL actuelle vers Postgresql, y compris les index et les clés étrangères. En outre, il permet de définir des analyses de noms de noms, d'index et de types de colonnes afin de remplacer le comportement par défaut.

https://github.com/ggarri/mysql2psql

J'espère que cela pourra être utile à quiconque d'entre vous souhaitant migrer son projet actuel vers PG, dans notre cas, nous avons obtenu une augmentation de performance d'environ 20%. 

0
Gabriel G.