¿Cómo migrar una tabla de blob grande de mysql a postgresql?


14

Ahora estoy en proceso de migrar mi base de datos MySQL a PostgreSQL. Casi todo salió bien (bueno, después de buscar en Google los parámetros correctos de mysqldump, etc.) excepto una tabla que tengo, en realidad la tabla más importante de mi aplicación.

La estructura de la tabla es muy 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

pero es muy grande (> 20 Gb).

Intenté usar el parámetro --hex-blob de mysqldump - pero PostgreSQL no aceptó los datos en este formato cuando intenté usar el archivo de volcado resultante como un archivo de comando. Otra opción que he probado es usar la opción --tab para obtener un volcado y luego insertarlo en PostgreSQL con el comando COPY - pero --hex-blob no funciona con --tab y PostgreSQL todavía no acepta el archivo de volcado que dice allí son caracteres inválidos en el mismo.

Me alegraría recibir algún consejo sobre este asunto, aunque estoy empezando a pensar que escribir una herramienta de migración personalizada no es una mala idea después de todo ...


La última vez que verifiqué, el dblink de PostgreSQL solo podía conectarse a otras instancias de PostgreSQL. No creo que MySQL Proxy sea ​​mejor. Es posible que necesite usar su idioma favorito (IE: Java, etc.) para leer desde MySQL para insertarlo en PostgreSQL ...

@OMG: Como he notado en cuestión, estoy casi listo para seguir este camino, solo tengo una ligera esperanza de que alguien sepa algo sobre este asunto.

¿En qué tipo de datos al final de pgsql está tratando de insertarlos? Lo haría yo mismo.

@ Scott: Sí, por supuesto que es bytea.

2
posgresql 9 admite la sintaxis hexadecimal para bytea directamente, consulte aquí: postgresql.org/docs/9.0/interactive/… (aunque necesitará un poco de sed)

Respuestas:


12

Creo que la forma más sencilla es usar ese --hex-blobinterruptor mysqldumpy restaurarlo mediante psql, con decode(string text, type text). Sin embargo, no es tan simple, porque necesita cambiar un pequeño volcado producido (sed, awk), agregando esa función de decodificación. Por ejemplo:

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

sesión psql:

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

\i 'path/to/pg.dump'

Gracias por una sugerencia, Grzegorz, lo intentaré e informaré los resultados.

Funcionó de maravilla :) Pruebe 10 archivos importados correctamente, todas las sumas de verificación coinciden con los originales. ¡Muchas gracias!

1
Si tiene otros campos, no querrá que coincidan con las comas o el paréntesis final. Esto debería funcionar:sed "s/0x\([0-9A-F]*\)/decode('\1','hex')/g" prepg.dump > pg.dump
tjmcewan
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.