Как перенести таблицу больших двоичных объектов из mysql в postgresql?

14

Сейчас я нахожусь в процессе миграции моей базы данных MySQL в PostgreSQL. Почти все прошло нормально (ну, после множества поисков правильных параметров mysqldump и т. Д.), За исключением одной таблицы, которая у меня есть - фактически самая важная таблица в моем приложении.

Структура таблицы очень проста:

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

но это очень большой (> 20 Гб).

Я пытался использовать --hex-blob параметр mysqldump - но данные в этом формате не принимаются PostgreSQL, когда я пытался использовать полученный файл дампа в качестве командного файла. Другой вариант, который я пробовал - использовать параметр --tab, чтобы просто получить дамп и затем вставить его в PostgreSQL с помощью команды COPY, но --hex-blob не работает с --tab, а PostgreSQL по-прежнему не принимает файл дампа, в котором говорится недопустимые символы в нем.

Я был бы очень рад получить совет по этому вопросу - хотя я начинаю думать, что написание пользовательского инструмента миграции в конце концов неплохая идея ...

Сергей Кудрявцев
источник
Последнее, что я проверял, dblink в PostgreSQL мог подключаться только к другим экземплярам PostgreSQL. Я не думаю, что MySQL Proxy лучше. Возможно, вам придется использовать ваш любимый язык (IE: Java и т. Д.) Для чтения из MySQL, чтобы вставить его в PostgreSQL ...
@OMG: Как я заметил в вопросе, я почти готов пойти по этому пути - просто есть небольшая надежда, что кто-то что-то знает по этому вопросу.
В какой тип данных на конце pgsql вы пытаетесь вставить его? Я бы сделал bytea сам.
@ Скотт: Да, конечно, это Bytea.
2
Posgresql 9 поддерживает шестнадцатеричный синтаксис для bytea напрямую, см. здесь: postgresql.org/docs/9.0/interactive/… (хотя вам понадобится немного sed)

Ответы:

12

Я думаю, что самый простой способ - использовать это --hex-blobвключение mysqldumpи восстановить с помощью psql decode(string text, type text). Однако это не так просто, потому что вам нужно изменить немного созданный дамп (sed, awk), добавив эту функцию декодирования. Например:

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 сессия:

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

\i 'path/to/pg.dump'
Гжегож Шпетковски
источник
Спасибо за предложение, Гжегож, я попробую и сообщу результаты.
Работал как шарм :) Тест 10 импортированных файлов, все контрольные суммы совпадают с оригиналами. Большое спасибо!
1
Если у вас есть другие поля, вы не захотите, чтобы они совпадали с запятыми или завершающими скобками. Это должно работать:sed "s/0x\([0-9A-F]*\)/decode('\1','hex')/g" prepg.dump > pg.dump
tjmcewan