Un groupe de manchots effectue sa migration

Convertir une base de données MySQL vers PostgreSQL est un véritable casse tête à côté duquel la conversion du plus barbu des islamistes aux thèses du MLF passerait pour une promenade de santé. Propre à rendre fou le plus élevé des maîtres Zen, l’opération m’a plongé dans une fureur comme on n’en avait plus vue depuis 1945 quand j’ai essayé à plusieurs reprises de faire passer ce blog d’un moteur de base de données vers l’autre.

Tout y est passé comme dans l’inventaire des prestations d’un marabout : les traditionnels scripts Perl, mysqldump avec la compatibilité PostgreSQL et des coups de sed dans tous les sens – pourtant, sed, c’est bien – les 518 Mo de Talend, l’export / import de fichiers CSV, et les jeux de mots foireux, un par paragraphe.

C’est pourtant au moment où j’hésitais entre abandonner par flemme et coder un truc maison en ce lundi pluvieux mais toujours moins que le suivant, que j’ai découvert Taps, un bidule en Ruby qui a changé à la fois ma vie et pipe d’adhérents potentiels du MLF, voir plus haut.

Taps est un proxy qui permet de faire dialoguer plusieurs SGDB différents, pour peu qu’ils disposent d’un driver Ruby. Il permet par exemple de transférer un schéma d’une base MySQL vers une base SQLite, les données d’une base SQLite vers une base MySQL vers une base PostgreSQL vert une base SQLite, un entraineur du PSG au Real Madrid etc… Oracle est probablement supporté, mais en l’absence de serveur sous la main, je reste un peu sur ma faim, puisque la Pythie vient en mangeant.

Taps s’installe sous la forme d’une Gem, et j’aime ça ; bien qu’ils ne fassent pas partie des dépendances – problème de cuisine interne – il est nécessaire d’installer les drivers Ruby pour les SGDB source et destination. Pour la conversion depuis MySQL, j’ai choisi le driver mysql2 qui supporte beaucoup mieux l’UTF-8 que son camarade mysql.

gem install mysql2 pg taps

Si l’installation échoue sur un des deux drivers, assurez-vous de disposer des paquets de développement des SGDB utilisés. Sous Debian :

aptitude install libpq-dev libmysqlclient-dev

Taps fonctionne en mode client / serveur. Le serveur prend la commande – le SGDB destination et le nom de la base de données à utiliser, au menu un serveur MySQL.

taps server mysql2://dbuser:dbpassword@dbhost/dbname httpuser httppassword

Le préfixe qui indique le protocole doit être le nom du driver utilisé. Pour le driver MySQL standard, c’est mysql, pour le driver SQLite, c’est sqlite etc.

httpuser et httppassword sont des identifiants permettant de sécuriser le serveur Taps afin d’éviter que quelqu’un d’autre ne puisse accéder aux données.

Le transfert de MySQL vers PgSQL se fait à l’aide de la commande pull. Taps se connecte au proxy précédemment créé et transfert les les donées vers le serveur cible.

taps pull postgres://dbuser:dbpassword@dbhost/dbname http://httpuser:httppassword@localhost:5000

Taps n’est pas exemple de défauts, le principal étant la perte des contraintes sur les clés étrangères. Cela implique un peu de travail après la migration afin de les reconstruire, mais rien d’insurmontable vu le travail accompli par ailleurs.

Perry the Platypus wants you to subscribe now! Even if you don't visit my site on a regular basis, you can get the latest posts delivered to you for free via Email: