Come migrare la tabella BLOB di grandi dimensioni da mysql a postgresql?


14

Ora sto migrando il mio database MySQL su PostgreSQL. Quasi tutto è andato bene (beh, dopo aver cercato su google per i parametri di mysqldump corretti ecc.) Tranne una tabella che ho - in realtà la tabella più importante della mia app.

La struttura della tabella è molto semplice:

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

ma è molto grande (> 20 Gb).

Ho provato ad usare il parametro --hex-blob di mysqldump - ma i dati in questo formato non sono accettati da PostgreSQL quando ho provato a usare il file di dump risultante come file di comando. Un'altra opzione che ho provato è usare l'opzione --tab per ottenere solo un dump e quindi inserirlo in PostgreSQL con il comando COPIA - ma --hex-blob non funziona con --tab e PostgreSQL non accetta ancora il dumpfile che dice lì sono caratteri non validi in esso.

Sarei molto felice di ricevere consigli su questo argomento, anche se sto iniziando a pensare che scrivere uno strumento di migrazione personalizzato non sia una cattiva idea dopo tutto ...


L'ultima volta che ho controllato, il dblink di PostgreSQL poteva connettersi solo ad altre istanze di PostgreSQL. Non penso che MySQL Proxy sia migliore. Potrebbe essere necessario utilizzare la tua lingua preferita (IE: Java, ecc.) Per leggere da MySQL per poter inserire in PostgreSQL ...

@OMG: Come ho notato in questione, sono quasi pronto per andare in questo modo - solo una leggera speranza che qualcuno sappia qualcosa al riguardo.

In quale tipo di dati alla fine di pgsql stai cercando di inserirlo? Lo farei da solo.

@Scott: Sì, certo che è bytea.

2
posgresql 9 supporta la sintassi esadecimale per bytea direttamente, vedi qui: postgresql.org/docs/9.0/interactive/… (avrai bisogno di un po 'di sed)

Risposte:


12

Credo che in questo modo più semplice è quello di utilizzare tale --hex-blobinterruttore mysqldumpe ripristinare da psql, con decode(string text, type text). Tuttavia non è così semplice, perché è necessario modificare un dump prodotto poco (sed, awk), aggiungendo quella funzione di decodifica. Per esempio:

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

sessione psql:

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

\i 'path/to/pg.dump'

Grazie per un suggerimento, Grzegorz, ci proverò e riferirò i risultati.

Ha funzionato come un fascino :) Prova 10 file importati correttamente, tutti i checksum sono originali corrispondenti. Grazie mille!

1
Se hai altri campi, non vorrai che corrisponda alle virgole o alla parentesi finale. Questo dovrebbe funzionare:sed "s/0x\([0-9A-F]*\)/decode('\1','hex')/g" prepg.dump > pg.dump
tjmcewan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.