Comment importer un dump "xxxx.sql" de MySQL vers une base de données PostgreSQL ?
Réponses
Trop de publicités?Il n'est pas possible d'importer un dump Oracle (binaire) vers PostgreSQL.
Si le dump MySQL est au format SQL brut, vous devrez éditer le fichier pour que la syntaxe soit 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 bien d'autres choses)
Voici un programme simple pour créer et charger toutes les tables d'une base de données mysql (miel) vers postgresql. La conversion des types depuis mysql est grossière mais facilement affinée. 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()
Comme pour la plupart des migrations de bases de données, il n'y a pas vraiment de solution toute faite.
Voici quelques idées à garder à l'esprit lors d'une migration :
- Les types de données ne vont pas correspondre. Certains le feront, d'autres non. Par exemple, les bits du serveur SQL (booléens) n'ont pas d'équivalent dans Oracle.
- Les séquences de clés primaires seront générées différemment dans chaque base de données.
- Les clés étrangères pointeront vers vos nouvelles séquences.
- Les indices seront différents et devront probablement être modifiés.
- Toutes les procédures stockées devront être réécrites.
- Les schémas. Mysql ne les utilise pas (du moins pas depuis que je l'ai utilisé), Postgresql les utilise. Ne mettez pas tout dans le schéma public. C'est une mauvaise pratique, mais la plupart des applications (Django en particulier) qui prennent en charge Mysql et Postgresql essaieront de vous faire utiliser le schéma public.
- Migration des données. Vous allez devoir insérer tout ce qui se trouve dans 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. En outre, toutes vos nouvelles séquences devront être réinitialisées à l'identifiant le plus élevé dans chaque table. Sinon, le prochain enregistrement inséré échouera avec une violation de clé primaire.
- Réécrire votre code pour qu'il fonctionne avec la nouvelle base de données. Il devrait fonctionner mais ne le fera probablement pas.
- N'oubliez pas les déclencheurs. J'utilise des déclencheurs de date de création et de mise à jour sur la plupart de mes tables. Chaque base de données les place un peu différemment.
Gardez ces éléments à l'esprit. Le meilleur moyen est probablement d'écrire un utilitaire de conversion. Bonne conversion !
J'ai dû faire cela récemment pour un grand nombre de fichiers .sql d'environ 7 Go. Même VIM avait du mal à les éditer. Le mieux est d'importer le fichier .sql dans MySql, puis de l'exporter au format csv, qui peut ensuite être importé dans Postgres.
Mais, l'exportation MySQL en tant que csv est horriblement lente car elle exécute le programme sélectionnez * à partir de votre tableau requête. Si vous avez une grande base de données/table, je vous suggère d'utiliser une autre méthode. L'une d'entre elles consiste à écrire un script qui lit les insertions sql ligne par ligne et utilise la manipulation des chaînes pour les reformater en instructions d'insertion "conformes à Postgres", puis exécute ces instructions dans Postgres.
J'ai pu copier des tables de MySQL vers Postgres en utilisant Plugin DBCopy pour le client SQL SQuirreL . Ce n'était pas à partir d'un dump, mais entre des bases de données vivantes.
2 votes
Comment avez-vous créé votre fichier "xxxx.dump" à partir d'Oracle. Avez-vous utilisé export ou expdp ou rdbms.get_ddl ?