Wie migriert man eine große Blob-Tabelle von MySQL nach PostGresQL?

14

Ich bin gerade dabei, meine MySQL-Datenbank auf PostgreSQL zu migrieren. Fast alles ist gut gelaufen (naja, nachdem ich viel nach korrekten mysqldump-Parametern gegoogelt habe usw.), bis auf eine Tabelle, die ich habe - eigentlich die wichtigste Tabelle in meiner App.

Die Tabellenstruktur ist sehr einfach:

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

aber es ist sehr groß (> 20 GB).

Ich habe versucht, den Parameter --hex-blob von mysqldump zu verwenden, aber Daten in diesem Format werden von PostgreSQL nicht akzeptiert, als ich versuchte, das resultierende Dumpfile als Befehlsdatei zu verwenden. Eine andere Option, die ich ausprobiert habe, ist die Verwendung der Option --tab, um nur einen Speicherauszug abzurufen und ihn dann mit dem Befehl COPY in PostgreSQL einzufügen sind ungültige Zeichen.

Ich würde mich sehr freuen, wenn Sie mir diesbezüglich einen Rat geben würden - obwohl ich langsam denke, dass das Schreiben eines benutzerdefinierten Migrationstools keine schlechte Idee ist ...

Sergey Kudriavtsev
quelle
Zuletzt überprüfte ich, dass der dblink von PostgreSQL nur eine Verbindung zu anderen PostgreSQL-Instanzen herstellen konnte. Ich denke nicht, dass MySQL Proxy besser ist. Möglicherweise müssen Sie Ihre Lieblingssprache (IE: Java usw.) zum Lesen von MySQL verwenden, um sie in PostgreSQL einzufügen ...
@OMG: Wie ich in der Frage bemerkt habe, bin ich fast bereit, diesen Weg zu gehen - ich hoffe nur, dass jemand etwas in dieser Angelegenheit weiß.
In welchen Datentyp am Ende von pgsql möchten Sie ihn einfügen? Ich würde bytea selbst tun.
@Scott: Ja, natürlich ist es bytea.
2
posgresql 9 unterstützt die hexadezimale Syntax für bytea direkt, siehe hier: postgresql.org/docs/9.0/interactive/… (du brauchst aber ein bisschen sed)

Antworten:

12

Ich denke, der einfachste Weg ist, diesen --hex-blobSchalter zu benutzen mysqldumpund per psql wiederherzustellen, mit decode(string text, type text). Es ist jedoch nicht so einfach, da Sie ein wenig produziertes Dump (sed, awk) ändern müssen, um diese Dekodierungsfunktion hinzuzufügen. Beispielsweise:

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

PSQL-Sitzung:

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

\i 'path/to/pg.dump'
Grzegorz Szpetkowski
quelle
Danke für einen Vorschlag, Grzegorz, ich werde es versuchen und die Ergebnisse melden.
Arbeitete wie ein Zauber :) Testen Sie 10 korrekt importierte Dateien. Alle Prüfsummen stimmen mit den Originalen überein. Vielen Dank!
1
Wenn Sie andere Felder haben, möchten Sie nicht, dass diese mit Kommas oder der nachfolgenden Klammer übereinstimmen. Dies sollte funktionieren:sed "s/0x\([0-9A-F]*\)/decode('\1','hex')/g" prepg.dump > pg.dump
tjmcewan