Comment importer un cliché "xxxx.sql" de MySQL vers une base de données PostgreSQL?
Ne vous attendez pas à ce que cela fonctionne sans édition. Peut-être beaucoup de montage.
mysqldump a un argument de compatibilité , --compatible=name
, où "name" peut être "Oracle" ou "postgresql", mais cela ne garantit pas la compatibilité. Je pense que les paramètres de serveur tels que ANSI_QUOTES ont également un effet.
Vous obtiendrez une aide plus utile ici si vous incluez la commande complète que vous avez utilisée pour créer le cliché, ainsi que tous les messages d'erreur que vous avez reçus au lieu de simplement "Rien n'a fonctionné pour moi".
Cette question est un peu ancienne mais, il y a quelques jours, je traitais cette situation et trouvais pgloader.io .
C’est de loin le moyen le plus simple de le faire, vous devez l’installer, puis exécuter un simple script LISP (script.LISP) avec les 3 lignes suivantes:
/* content of the script.LISP */
LOAD DATABASE
FROM mysql://dbuser@localhost/dbname
INTO postgresql://dbuser@localhost/dbname;
/*run this in the terminal*/
pgloader script.LISP
Et après cela, votre base de données postgresql aura toutes les informations que vous aviez dans votre MySQL SB.
Sur une note de côté, assurez-vous de compiler pgloader car au moment de cette publication, le programme d’installation a un bogue. (version 3.2.0)
brew update && brew install pgloader
pgloader mysql://user@Host/db_name postgresql://user@Host/db_name
Le moyen le plus rapide (et le plus complet) que j'ai trouvé était d'utiliser Kettle. Cela va également générer les tables nécessaires, convertir les index et tout le reste. L'argument de compatibilité mysqldump
fait fonctionner pas.
Les marches:
Téléchargez Pentaho ETL depuis http://kettle.pentaho.org/ (version communautaire)
Décompressez et exécutez Pentaho (spoon.sh/spoon.bat selon unix/windows)
Créer un nouvel emploi
Créez une connexion à la base de données pour la source MySQL (Outils -> Wizard -> Créer une connexion à la base de données)
Créez une connexion à la base de données pour la source PostgreSQL (comme ci-dessus)
Exécutez l'assistant Copy Tables
(Outils -> Wizard -> Copier les tableaux)
Exécuter le travail
Pour les Googlers qui sont en 2015+.
J'ai perdu toute la journée à ce sujet et je voudrais faire le point.
J'ai essayé toutes les solutions décrites dans this article de Alexandru Cotioras (qui est plein de désespoir). De toutes les solutions mentionnées, une seule a fonctionné pour moi.
- lanyrd/mysql-postgresql-converter @ github.com (Python)
Mais cela ne suffira pas. Lorsque vous importez votre nouveau fichier de vidage converti:
# \i ~/Downloads/mysql-postgresql-converter-master/dump.psql
PostgreSQL
vous informera sur les types en désordre de MySQL
:
psql:/Users/jibiel/Downloads/mysql-postgresql-converter-master/dump.psql:381: ERROR: type "mediumint" does not exist
LINE 2: "group_id" mediumint(8) NOT NULL DEFAULT '0',
Vous devrez donc corriger ces types manuellement selon this table.
En bref c'est:
tinyint(2) -> smallint
mediumint(7) -> integer
# etc.
Vous pouvez utiliser regex
et n’importe quel éditeur cool pour le faire.
MacVim
+ Substitute
:
:%s!tinyint(\w\+)!smallint!g
:%s!mediumint(\w\+)!integer!g
Vous pouvez potentiellement exporter au format CSV depuis MySQL puis importer le fichier CSV dans PostgreSQL .
Vous pouvez utiliser pgloader.
Sudo apt-get install pgloader
En utilisant:
pgloader mysql://user:pass@Host/database postgresql://user:pass@Host/database
J'ai ce script bash pour migrer les données, il ne crée pas les tables, car elles sont créées dans des scripts de migration. J'utilise une liste des tables pour ne pas importer les données des tables migrations
et sessions
. La voici, juste testée:
#!/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 de nombreux avertissements que vous pouvez ignorer en toute sécurité, comme ceci:
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'.
Il n'est pas possible d'importer une image Oracle (binaire) dans PostgreSQL.
Si le vidage MySQL est au format SQL simple, vous devrez éditer le fichier pour rendre la syntaxe correcte pour PostgreSQL (par exemple, supprimer les guillemets non standard, supprimer la définition du moteur pour les instructions CREATE TABLE, ajuster les types de données et beaucoup d'autres choses)
Voici un programme simple pour créer et charger toutes les tables dans une base de données mysql (honey) sur postgresql. La conversion de type à partir de mysql est à grain grossier mais facile à affiner. Vous devrez recréer les index manuellement:
import MySQLdb
from magic import Connect #Private mysql connect information
import psycopg2
dbx=Connect()
DB=psycopg2.connect("dbname='honey'")
DC=DB.cursor()
mysql='''show tables from honey'''
dbx.execute(mysql); ts=dbx.fetchall(); tables=[]
for table in ts: tables.append(table[0])
for table in tables:
mysql='''describe honey.%s'''%(table)
dbx.execute(mysql); rows=dbx.fetchall()
psql='drop table %s'%(table)
DC.execute(psql); DB.commit()
psql='create table %s ('%(table)
for row in rows:
name=row[0]; type=row[1]
if 'int' in type: type='int8'
if 'blob' in type: type='bytea'
if 'datetime' in type: type='timestamptz'
psql+='%s %s,'%(name,type)
psql=psql.strip(',')+')'
print psql
try: DC.execute(psql); DB.commit()
except: pass
msql='''select * from honey.%s'''%(table)
dbx.execute(msql); rows=dbx.fetchall()
n=len(rows); print n; t=n
if n==0: continue #skip if no data
cols=len(rows[0])
for row in rows:
ps=', '.join(['%s']*cols)
psql='''insert into %s values(%s)'''%(table, ps)
DC.execute(psql,(row))
n=n-1
if n%1000==1: DB.commit(); print n,t,t-n
DB.commit()
Je pouvais copier des tables de MySQL vers Postgres en utilisant DBCopy Plugin pour SQuirreL SQL Client .
Mac/Win
Téléchargez la version d'essai de Navicat pendant 14 jours (je ne comprends pas 1300 $) - forfait entreprise complet:
connecter les deux bases de données mysql et postgres
menu - outils - transfert de données
connectez les deux dbs sur ce premier écran. Tandis que vous êtes toujours sur cet écran, il y a un général/options - sous les options, cochez à droite - continuez sur erreur * Notez que vous voulez probablement décocher les index et les clés à gauche .. vous pouvez les réaffecter facilement. dans postgres.
au moins vos données de MySQL dans Postgres!
j'espère que cela t'aides!
Utilisez votre fichier xxx.sql pour configurer une base de données MySQL et utilisez FromMysqlToPostrgreSQL . Très facile à utiliser, configuration courte et fonctionne comme un charme. Il importe votre base de données avec les clés primaires, les clés étrangères et les index définis dans les tables. Vous pouvez même importer des données uniquement si vous définissez un indicateur approprié dans le fichier de configuration.
L'outil de migration FromMySqlToPostgreSql d'Anatoly Khaytovich fournit une migration précise des données de table, des index, des clés PK, des FK ... Utilise largement le protocole PostgreSQL COPY.
Voir aussi ici: PG Wiki Page
Je devais le faire récemment avec beaucoup de gros fichiers .sql d’environ 7 Go. Même VIM avait eu du mal à les éditer. La meilleure solution consiste à importer le fichier .sql dans MySql, puis à l'exporter sous forme de fichier csv pouvant être importé dans Postgres.
Mais l’exportation MySQL en tant que csv est terriblement lente car elle exécute la requête select * de votre table query. Si vous avez une grande base de données/table, je vous suggérerais d’utiliser une autre méthode. Une solution consiste à écrire un script qui lit ligne par ligne les insertions SQL et utilise la manipulation de chaînes pour le reformater en instructions d’insertion «conformes à Postgres», puis exécuter ces instructions dans Postgres.
pgloader
Obtenez une version récente de pgloader
; celui fourni par Debian Jessie (version 2019-01-27) est 3.1.0 et ne fonctionnera pas puisque pgloader
sera erroné avec
Can not find file mysql://...
Can not find file postgres://...
Tout d’abord, assurez-vous que vous pouvez établir une connexion à mysqld
sur le serveur qui exécute MySQL en utilisant
telnet theserverwithmysql 3306
Si cela échoue avec
Nom ou service inconnu
connectez-vous à theserverwithmysql
et éditez 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
à
bind-address = *
Sachez qu'autoriser l'accès à votre base de données MySQL à partir de toutes les adresses peut poser 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.
Effectuez les modifications apportées à mysqld.cnf
en redémarrant mysqld
.
En supposant que vous soyez connecté au 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 des privilèges suffisants pour créer le schéma. Sinon, vous rencontrez
autorisation refusée pour la base de données
en appelant pgloader
. J'ai eu cette erreur bien que l'utilisateur ait le droit de créer des bases de données selon psql > \du
.
Vous pouvez vous en assurer dans psql
:
GRANT ALL PRIVILEGES ON DATABASE databasename TO otherusername;
Là encore, il peut s’agir d’un dépassement des privilèges et donc d’un risque pour la sécurité si vous laissez tous ces privilèges à l’utilisateur otherusername
.
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
Comme dans la plupart des migrations de bases de données, il n’existe pas vraiment de solution simplifiée.
Voici quelques idées à garder à l'esprit lors d'une migration:
Gardez cela à l'esprit. Le meilleur moyen est probablement d'écrire un utilitaire de conversion. Bonne conversion!