Comment migrer une grande table d'objets blob de mysql vers postgresql?


14

Je suis en train de migrer ma base de données MySQL vers PostgreSQL. Presque tout s'est bien passé (enfin, après de nombreuses recherches sur google pour les paramètres mysqldump corrects, etc.) sauf une table que j'ai - en fait la table la plus importante de mon application.

La structure du tableau est très simple:

mysql> show create table samples;
.. skipped ...
CREATE TABLE `samples` (
      `File_ID` int(11) NOT NULL,
      `File` longblob,
      PRIMARY KEY (`File_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=binary

mais il est très grand (> 20 Go).

J'ai essayé d'utiliser le paramètre --hex-blob de mysqldump - mais les données dans ce format ne sont pas acceptées par PostgreSQL lorsque j'ai essayé d'utiliser le fichier de vidage résultant comme fichier de commande. Une autre option que j'ai essayée consiste à utiliser l'option --tab pour simplement obtenir un vidage, puis l'insérer dans PostgreSQL avec la commande COPY - mais --hex-blob ne fonctionne pas avec --tab et PostgreSQL n'accepte toujours pas le fichier de vidage qui y dit contiennent des caractères non valides.

Je serais très heureux d'obtenir des conseils à ce sujet - même si je commence à penser qu'écrire un outil de migration personnalisé n'est pas une mauvaise idée après tout ...


La dernière fois que j'ai vérifié, le dblink de PostgreSQL ne pouvait se connecter qu'à d'autres instances de PostgreSQL. Je ne pense pas que le proxy MySQL soit meilleur. Vous devrez peut-être utiliser votre langue préférée (IE: Java, etc.) pour lire à partir de MySQL afin de l'insérer dans PostgreSQL ...

@OMG: Comme je l'ai remarqué en question, je suis presque prêt à suivre cette voie - j'ai juste un léger espoir que quelqu'un sache quelque chose à ce sujet.

Dans quel type de données pgsql essayez-vous de l'insérer? Je ferais du bytea moi-même.

@Scott: Oui, bien sûr, c'est du bytea.

2
posgresql 9 supporte directement la syntaxe hexadécimale pour bytea, voir ici: postgresql.org/docs/9.0/interactive/… (vous aurez cependant besoin d'un peu de sed)

Réponses:


12

Je pense que le moyen le plus simple est d'utiliser cet --hex-blobinterrupteur mysqldumpet de le restaurer par psql, avec decode(string text, type text). Cependant, ce n'est pas si simple, car vous devez modifier un peu le vidage produit (sed, awk), en ajoutant cette fonction de décodage. Par exemple:

mysqldump -u root -p --skip-quote-names --hex-blob --skip-triggers \
    --compact --no-create-info mysql samples > prepg.dump

sed "s/0x\([0-9,A-F]*\))/decode('\1','hex'))/g" prepg.dump > pg.dump

session psql:

CREATE TABLE samples
(
    file_id integer PRIMARY KEY,
    file bytea
);

\i 'path/to/pg.dump'

Merci pour une suggestion, Grzegorz, je vais essayer et rapporter les résultats.

Fonctionné comme un charme :) Testez 10 fichiers importés correctement, toutes les sommes de contrôle correspondent aux originaux. Merci beaucoup!

1
Si vous avez d'autres champs, vous ne voudrez pas qu'il corresponde à des virgules ou à la parenthèse de fin. Cela devrait fonctionner:sed "s/0x\([0-9A-F]*\)/decode('\1','hex')/g" prepg.dump > pg.dump
tjmcewan
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.