web-dev-qa-db-fra.com

Importer le vidage MySQL dans la base de données PostgreSQL

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

40
Palani Kannan

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)

32
Rob Contreras

Mac OS X

brew update && brew install pgloader

pgloader mysql://user@Host/db_name postgresql://user@Host/db_name
11
kyo

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:

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

  2. Décompressez et exécutez Pentaho (spoon.sh/spoon.bat selon unix/windows)

  3. Créer un nouvel emploi

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

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

  6. Exécutez l'assistant Copy Tables (Outils -> Wizard -> Copier les tableaux)

  7. Exécuter le travail

10
Wolph

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
10
jibiel
7
WhiteFang34

Vous pouvez utiliser pgloader. 

Sudo apt-get install pgloader

En utilisant:

pgloader mysql://user:pass@Host/database postgresql://user:pass@Host/database
5
Frederik Witte

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'.
5
Nicolay77

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)

4

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()
2
anon

Je pouvais copier des tables de MySQL vers Postgres en utilisant DBCopy Plugin pour SQuirreL SQL Client .

0
weberjn

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!

0
Bo Opfer

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

0
swedge218

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. 

0
Shreyas Chavan

Avec 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://...

Accès à la source MySQL

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.

Préparer la cible Postgres

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.

É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
0
Matthias Braun

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:

  1. Les types de données ne vont pas correspondre. Certains vont, d'autres non. Par exemple, les bits SQL Server (booléens) n'ont pas d'équivalent dans Oracle. 
  2. Les séquences de clés primaires seront générées différemment dans chaque base de données. 
  3. Les clés étrangères indiqueront vos nouvelles séquences. 
  4. Les index seront différents et devront probablement être modifiés. 
  5. Toutes les procédures stockées devront être réécrites 
  6. Schémas. Mysql ne les utilise pas (du moins pas depuis que je l'utilise), Postgresql les utilise. Ne mettez pas tout dans le schéma public. C'est une mauvaise pratique, mais la plupart des applications (Django, par exemple) qui prennent en charge Mysql et Postgresql essaieront de vous faire utiliser le schéma public. 
  7. Migration de données. Vous allez devoir tout insérer de l'ancienne base de données dans la nouvelle. Cela signifie désactiver les clés primaires et étrangères, insérer les données, puis les activer. De plus, toutes vos nouvelles séquences devront être réinitialisées à l'identifiant le plus élevé dans chaque tableau. Sinon, l'enregistrement suivant inséré échouera avec une violation de clé primaire. 
  8. Réécrire votre code pour travailler avec la nouvelle base de données. Cela devrait marcher mais probablement pas. 
  9. N'oubliez pas les déclencheurs. J'utilise créer et mettre à jour des déclencheurs de date sur la plupart de mes tables. Chaque site les situe un peu différent. 

Gardez cela à l'esprit. Le meilleur moyen est probablement d'écrire un utilitaire de conversion. Bonne conversion! 

0
Doug