Jak migrować tabelę dużych obiektów blob z mysql do postgresql?

14

Jestem teraz w trakcie migracji mojej bazy danych MySQL do PostgreSQL. Prawie wszystko poszło dobrze (cóż, po wielu googlingach dla poprawnych parametrów mysqldump itp.) Oprócz jednego stołu, który mam - właściwie najważniejszego stołu w mojej aplikacji.

Struktura tabeli jest bardzo prosta:

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

ale jest bardzo duży (> 20 Gb).

Próbowałem użyć parametru --hex-blob mysqldump - ale dane w tym formacie nie są akceptowane przez PostgreSQL, gdy próbowałem użyć wynikowego pliku zrzutu jako pliku komend. Inną opcją, którą próbowałem, jest użycie opcji --tab, aby po prostu uzyskać zrzut, a następnie wstawić go do PostgreSQL za pomocą polecenia COPY - ale --hex-blob nie działa z opcją --tab, a PostgreSQL nadal nie przyjmuje pliku zrzutu mówiącego tam są w nim nieprawidłowe znaki.

Byłbym bardzo szczęśliwy, gdyby uzyskać porady w tej sprawie - chociaż zaczynam myśleć, że napisanie niestandardowego narzędzia do migracji nie jest wcale złym pomysłem ...

Sergey Kudriavtsev
źródło
Ostatnio sprawdziłem, dblink PostgreSQL może łączyć się tylko z innymi instancjami PostgreSQL. Nie sądzę, aby MySQL Proxy było lepsze. Być może będziesz musiał użyć swojego ulubionego języka (IE: Java itp.), Aby czytać z MySQL, aby wstawić do PostgreSQL ...
@OMG: Jak zauważyłem w pytaniu, jestem prawie gotowy, aby pójść tą drogą - mam tylko małą nadzieję, że ktoś coś wie na ten temat.
Do jakiego typu danych na końcu pgsql próbujesz go wstawić? Zrobiłbym bytea osobiście.
@ Scott: Tak, oczywiście, że to bytea.
2
posgresql 9 obsługuje bezpośrednio składnię szesnastkową dla bytea, patrz tutaj: postgresql.org/docs/9.0/interactive/... (będziesz potrzebować trochę sed)

Odpowiedzi:

12

Myślę, że najprostszym sposobem jest użycie tego --hex-blobwłączania mysqldumpi przywracania przez psql, przy pomocy decode(string text, type text). Jednak nie jest to takie proste, ponieważ musisz zmienić trochę wyprodukowanego zrzutu (sed, awk), dodając tę ​​funkcję dekodowania. Na przykład:

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

sesja psql:

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

\i 'path/to/pg.dump'
Grzegorz Szpetkowski
źródło
Dziękuję za sugestię, Grzegorz, spróbuję i przedstawię wyniki.
Działa jak urok :) Przetestuj 10 plików poprawnie zaimportowanych, wszystkie sumy kontrolne pasują do oryginałów. Dziękuję Ci bardzo!
1
Jeśli masz inne pola, nie chcesz, aby pasowały do ​​przecinków lub końcowego nawiasu. Powinno to działać:sed "s/0x\([0-9A-F]*\)/decode('\1','hex')/g" prepg.dump > pg.dump
tjmcewan,