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 ...
źródło
Odpowiedzi:
Myślę, że najprostszym sposobem jest użycie tego
--hex-blob
włączaniamysqldump
i przywracania przez psql, przy pomocydecode(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:sesja psql:
źródło
sed "s/0x\([0-9A-F]*\)/decode('\1','hex')/g" prepg.dump > pg.dump