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:
mysql dump:
mysqldump -h 192.168.0.222 --port 3307 -u root -p --compatible=postgresql synchronizer > c:\dump.sql
créer un synchroniseur de base de données à pgsql
dump d'importation:
psql -h 192.168.0.100 -d synchronizer -U postgres -f C:\dump.sql
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','','???????? ...
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.
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.
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.
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.
Vous pouvez utiliser https://github.com/mihailShumilov/mysql2postgresql Ceci est écrit sur PHP convertisseur
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.
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%.