Як перенести велику таблицю крапки з 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 Gb).

Я намагався використовувати параметр --hex-blob mysqldump - але дані в такому форматі PostgreSQL не приймають, коли я намагався використовувати отриманий dumpfile як командний файл. Інший варіант, який я спробував, - використовує --tab варіант, щоб просто отримати дамп, а потім вставити його в PostgreSQL з командою COPY - але - hex-blob не працює з --tab, а PostgreSQL все ще не приймає dumpfile, що говорить там є недійсними символами в ньому.

Буду дуже радий отримати будь-яку пораду з цього приводу - хоча я починаю вважати, що написання користувальницького інструменту міграції не є поганою ідеєю ...


Востаннє я перевірив, що dblink PostgreSQL міг підключатися лише до інших екземплярів PostgreSQL. Я не думаю, що MySQL Proxy є кращим. Можливо, вам потрібно буде використовувати свою улюблену мову (IE: Java тощо) для читання з MySQL, щоб вставити в PostgreSQL ...

@OMG: Як я вже помітив питання, я майже готовий піти цим шляхом - просто маю надію, що хтось щось знає з цього питання.

Який тип даних на кінці pgsql ви намагаєтеся вставити в нього? Я б сам займався байтою.

@Scott: Так, звичайно, це 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.