2009-04-21 8 views
32

Je suis en train d'envisager un passage de MySQL à PostgreSQL. Quels sont vos trucs, astuces et astuces pour travailler avec PostgreSQL?Passer de MySQL à PostgreSQL - trucs et astuces?

À quoi doit ressembler un MySQLer?

Voir aussi: How different is PostgreSQL to MySQL?
Voir aussi: Migrate from MySQL to PostgreSQL

Remarque - Je ne pense pas que ce soit un doublon. En particulier le type de réponses est assez différent et les réponses ici ont beaucoup plus de détails de mise en œuvre, ce que je cherchais

+0

Juste une note: ceci n'est pas réellement relié aux nouvelles au sujet d'Oracle et de Sun. J'ai une application Rails qui nécessite plusieurs bases de données et qui cherche à utiliser les schémas PostgreSQL. –

+0

Voir: http://stackoverflow.com/questions/724867/how-different-is-postgresql-to-mysql – vartec

Répondre

49

Je viens de passer par moi-même, eh bien je suis toujours ...

  • Case texte sensible
  • Manque de INSERT IGNORE et REPLACE
  • casting explicite nécessaire presque partout
  • Aucun des accents graves
  • LOAD DATA INFILE (COPY est proche, mais pas assez près)
  • changement autoincrement à SERIAL
  • Bien que la mauvaise forme MySQL, dans Postgres, une INNER JOIN sans clause ON ne peut pas se produire, utiliser CROSS JOIN ou similaire
  • COUNT(*) peut être lent
  • folles bases de données sont codés avec des jeux de caractères, tables non
  • Vous peut avoir plusieurs bases de données, avec plusieurs schémas (MySQL a vraiment juste une base de données et des schémas multiples)
  • Cloisonnement est différent
  • MySQL interval contre Postgres interval (pour des intervalles de temps)
  • changement de nom de colonne Implicite, Postgres nécessite AS
  • Impossible de mettre à jour plusieurs tables en même temps dans Postgres
  • fonctions Postgres sont puissants. Il n'y a donc pas de CALL proc();; réécrire proc() en tant que fonction et SELECT proc();.
+0

+1: Auto_increment to serial? Pas de séquences comme? –

+1

@OMG Poneys: dans les versions PG modernes, vous n'avez pas besoin d'utiliser des séquences explicitement pour les ID automatiques. Les types sériels et bigsériens cachent la sémantique de tout sauf sous ses séquences et toute leur puissance. Ils créent une séquence auto nommée et définissent la valeur par défaut de la colonne sur nextval. – rfusca

+0

Je viens d'Oracle, donc j'ai une préférence pour les séquences. Quand la fonctionnalité série/bigserial a-t-elle été introduite - 8.x? –

5

Avant de convertir, réglez votre MySQL à la norme ANSI-en démarrant le rigueur serveur avec: --transaction-isolation = SERIALIZABLE --sql mode = ANSI

Assurez-vous de ne pas utiliser les tables MyISAM. MySQL permet beaucoup de conversions qu'il ne devrait pas; pg nécessitera un casting.

Vos procédures, fonctions et triggers stockés devront être réécrits. pg vous donne un choix de langues pour celles-ci, mais vous devez installer les langues; ce n'est pas aussi convivial que MySQL. Pg autorisera seulement dans une liste de sélection les colonnes qui sont dans un groupe par ou sont des agrégats; MySQL va tricher en sélectionnant la première valeur dans le groupe si vous faites cela.

MySQL ajoute un tas d'extensions: l'opérateur sans égal peut être != comme en C, il permet « & & » comme synonyme de « et », « || » pour 'ou' etc. En particulier, pg utilise '||' pour signifier caténation de cordes.

Fondamentalement, pg est assez strictement ANSI, MySQL n'est pas. Je suggère fortement d'obtenir une conformité ANSI aussi stricte que possible avant de passer en pg, puis de vérifier les éventuels avertissements lorsque vous exécutez vos applications.

9

Il va être une énorme tâche que vous devrez tester votre base de code entier - chaque requête, en tout lieu, pour

  • Syntaxe
  • Comportement correct (ie renvoie la mêmes résultats)
  • Performance - par ex. Existe-t-il des régressions/améliorations de performance, et pouvez-vous les gérer?
  • Traitement des erreurs - ils ne se comportent pas les mêmes dans des conditions d'erreur, peut-être votre code se fiait sur les codes d'erreur spécifiques

Opérationnellement, vous aurez besoin de regarder:

  • Sauvegarde/restauration
  • Utilisation de l'espace disque
  • Utilisation de la mémoire
  • Migration de données ponctuelle - peut être une tâche longue et fastidieuse
  • Plan Rollback pour si elle échoue
  • Surveillance - comment allez-vous le suivi de votre MySQL, et peut ces méthodes adapter
  • (le cas échéant) - réplication

Vous aurez certainement à faire des quantités importantes des tests de performance avant d'envisager un tel changement.

Ces coûts rendent le passage à une base de données différente trop coûteux pour la plupart des applications non triviales. Considérez les avantages TRÈS soigneusement contre les vastes, vastes coûts de faire tout ce qui précède.

Je serais surpris si cela vous prend moins de trois mois, dans une application non triviale, au cours de laquelle vous ne serez pas en mesure de poursuivre le développement régulier.

+4

Ceci est un nouveau projet, donc il n'y a pas de coût de migration à ce stade. Mais ce sont tous d'excellents conseils à considérer. –

6

J'ai trouvé ce script qui va se connecter à votre base de données MySQL et à votre base de données PostgreSQL et en transférer le contenu. Cela a fonctionné comme un charme pour moi.

https://github.com/philipsoutham/py-mysql2pgsql

installé par

$ pip install py-mysql2pgsql 

Run

$ py-mysql2pgsql 

dans un dossier, et il crée un fichier modèle de paramètres pour vous (mysql2pgsql.yml) que vous pouvez modifier et entrez les détails de vos bases de données.

J'ai dû installer argpars e pour que ça marche.

$ pip install argparse 

Lorsque les détails de votre base de données sont remplis, il suffit d'exécuter à nouveau

$ py-mysql2pgsql 

dans le même dossier que le fichier de paramètres, et vlan, vous avez terminé. Il n'a rien imprimé à l'écran, mais ma base de données a été entièrement copiée par la suite.

+0

Je viens de découvrir que je ne pouvais pas ajouter de messages ou de commentaires dans mon forum (le logiciel qui utilise la base de données), mais il a été résolu en exportant la base de données postgresql dans un fichier, en supprimant et en créant la base de données. Qui sait, je pourrais avoir eu les mauvaises permissions d'utilisateur pour l'utilisateur dans mon test-DB où je l'ai importé la première fois .. – Dahlo

1

En dehors de la structure de base de données en mouvement, où vous ne pouvez pas éviter des réglages manuels ...

La méthode la plus fiable de transfert de données (table en table, à condition que les structures sont les mêmes):

mysql --default-character-set=utf8 -e "SELECT * FROM mytable" > mytable.txt 

psql 
\copy mytable from '/path/to/mytable.txt' WITH NULL AS 'NULL'; 

J'ai essayé toutes les autres approches récemment (comme mysqldump avec des tonnes d'options + sed etc.), mais rien n'a fonctionné aussi bien que cela. Cette approche permet également une certaine flexibilité lorsque la structure est modifiée en cours de route - il suffit d'écrire un SELECT approprié.

Questions connexes