Comment importer un dump "xxxx.sql" de MySQL vers une base de données PostgreSQL ?
Réponses
Trop de publicités?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 :
-
Téléchargez Pentaho ETL à partir de http://kettle.pentaho.org/ (version communautaire)
-
Dézipper et lancer Pentaho (spoon.sh/spoon.bat selon unix/Windows)
-
Créer un nouveau poste
-
Créez une connexion à la base de données pour la source MySQL (Outils -> Assistant -> Créer une connexion à la base de données)
-
Créer une connexion à la base de données pour la source PostgreSQL (comme ci-dessus)
-
Exécuter le
Copy Tables
assistant (Outils -> Assistant -> Copier les tables) -
Exécuter le travail
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'.
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
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 !
2 votes
Comment avez-vous créé votre fichier "xxxx.dump" à partir d'Oracle. Avez-vous utilisé export ou expdp ou rdbms.get_ddl ?