82 votes

Importer un dump MySQL vers une base de données PostgreSQL

Comment importer un dump "xxxx.sql" de MySQL vers une base de données PostgreSQL ?

2 votes

Comment avez-vous créé votre fichier "xxxx.dump" à partir d'Oracle. Avez-vous utilisé export ou expdp ou rdbms.get_ddl ?

12voto

Wolph Points 28062

Le moyen le plus rapide (et le plus complet) que j'ai trouvé est d'utiliser Kettle. Cela génère également les tables nécessaires, convertit les index et tout le reste. Le site mysqldump L'argument de la compatibilité ne no travail.

Les étapes :

  1. Téléchargez Pentaho ETL à partir de http://kettle.pentaho.org/ (version communautaire)

  2. Dézipper et lancer Pentaho (spoon.sh/spoon.bat selon unix/Windows)

  3. Créer un nouveau poste

  4. Créez une connexion à la base de données pour la source MySQL (Outils -> Assistant -> Créer une connexion à la base de données)

  5. Créer une connexion à la base de données pour la source PostgreSQL (comme ci-dessus)

  6. Exécuter le Copy Tables assistant (Outils -> Assistant -> Copier les tables)

  7. Exécuter le travail

12voto

Frederik Witte Points 101

Vous pouvez utiliser pgloader.

sudo apt-get install pgloader

Utilisation :

pgloader mysql://user:pass@host/database postgresql://user:pass@host/database

8voto

Nicolay77 Points 331

J'ai ce bash script pour migrer les données, il ne crée pas les tables car elles sont créées dans les scripts de migration, j'ai donc seulement besoin de convertir les données. J'utilise une liste des tables pour ne pas importer de données de l'application migrations y sessions tables. Le voici, juste testé :

#!/bin/sh

MUSER="root"
MPASS="mysqlpassword"
MDB="origdb"
MTABLES="car dog cat"
PUSER="postgres"
PDB="destdb"

mysqldump -h 127.0.0.1 -P 6033 -u $MUSER -p$MPASS --default-character-set=utf8 --compatible=postgresql --skip-disable-keys --skip-set-charset --no-create-info --complete-insert --skip-comments --skip-lock-tables $MDB $MTABLES > outputfile.sql

sed -i 's/UNLOCK TABLES;//g' outputfile.sql
sed -i 's/WRITE;/RESTART IDENTITY CASCADE;/g' outputfile.sql
sed -i 's/LOCK TABLES/TRUNCATE/g' outputfile.sql
sed -i "s/'0000\-00\-00 00\:00\:00'/NULL/g" outputfile.sql
sed -i "1i SET standard_conforming_strings = 'off';\n" outputfile.sql
sed -i "1i SET backslash_quote = 'on';\n" outputfile.sql
sed -i "1i update pg_cast set castcontext='a' where casttarget = 'boolean'::regtype;\n" outputfile.sql
echo "\nupdate pg_cast set castcontext='e' where casttarget = 'boolean'::regtype;\n" >> outputfile.sql

psql -h localhost -d $PDB -U $PUSER -f outputfile.sql

Vous obtiendrez beaucoup d'avertissements que vous pouvez ignorer sans risque comme celui-ci :

psql:outputfile.sql:82: WARNING:  nonstandard use of escape in a string literal
LINE 1: ...,(1714,38,2,0,18,131,0.00,0.00,0.00,0.00,NULL,'{\"prospe...
                                                         ^
HINT:  Use the escape string syntax for escapes, e.g., E'\r\n'.

6voto

Matthias Braun Points 1114

Avec pgloader

Obtenez une version récente de pgloader ; celui fourni par Debian Jessie (à la date du 2019-01-27) est 3.1.0 et ne fonctionne pas depuis pgloader se trompera avec

Can not find file mysql://...
Can not find file postgres://...

Accès à la source MySQL

D'abord, assurez-vous que vous pouvez établir une connexion à mysqld sur le serveur exécutant MySQL en utilisant

telnet theserverwithmysql 3306

Si cela échoue avec

Nom ou service non connu

se connecter à theserverwithmysql et modifiez le fichier de configuration de mysqld . Si vous ne savez pas où se trouve le fichier de configuration, utilisez find / -name mysqld.cnf .

Dans mon cas, j'ai dû changer cette ligne de mysqld.cnf

# By default we only accept connections from localhost
bind-address    = 127.0.0.1

a

bind-address    = *

N'oubliez pas que le fait d'autoriser l'accès à votre base de données MySQL à partir de toutes les adresses peut présenter un risque pour la sécurité, ce qui signifie que vous voudrez probablement modifier cette valeur après la migration de la base de données.

Apportez les modifications à mysqld.cnf efficace en redémarrant mysqld .

Préparation de la cible Postgres

En supposant que vous êtes connecté sur le système qui exécute Postgres, créez la base de données avec

createdb databasename

L'utilisateur de la base de données Postgres doit disposer de privilèges suffisants pour créer le schéma, sinon vous rencontrerez le problème suivant

permission refusée pour la base de données nom_de_données

lors de l'appel pgloader . J'ai obtenu cette erreur bien que l'utilisateur ait le droit de créer des bases de données selon les règles de l'UE. psql > \du .

Vous pouvez vous en assurer en psql :

GRANT ALL PRIVILEGES ON DATABASE databasename TO otherusername;

Encore une fois, cela pourrait être une surenchère de privilèges et donc un risque de sécurité si vous laissez tous ces privilèges à l'utilisateur otherusername .

Migrer

Enfin, la commande

pgloader mysql://theusername:thepassword@theserverwithmysql/databasename postgresql://otherusername@localhost/databasename

exécuté sur la machine exécutant Postgres devrait produire une sortie qui se termine par une ligne comme celle-ci :

Total import time               877567   158.1 MB       1m11.230s

5voto

Bo Opfer Points 61

Mac/Win

Téléchargez la version d'essai de Navicat pendant 14 jours (je ne comprends pas les 1300 $) - paquet complet pour les entreprises :

connecter les deux bases de données mysql et postgres

menu - outils - transfert de données

connecter les deux dbs sur ce premier écran. Alors que vous êtes toujours sur cet écran, il y a un général / options - sous les options vérifier sur le côté droit vérifier - continuer sur erreur * Notez que vous voudrez probablement décocher les index et les clés sur la gauche vous pouvez les réassigner facilement dans postgres.

au moins faire passer vos données de MySQL à Postgres !

J'espère que cela vous aidera !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X