Bagaimana cara memigrasi tabel gumpalan besar dari mysql ke postgresql?

14

Saya sekarang sedang dalam proses migrasi database MySQL saya ke PostgreSQL. Hampir semuanya berjalan dengan baik (well, setelah banyak googling untuk params mysqldump yang benar, dll.) Kecuali satu meja yang saya miliki - sebenarnya tabel yang paling penting di aplikasi saya.

Struktur tabel sangat sederhana:

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

tetapi sangat besar (> 20 Gb).

Saya sudah mencoba menggunakan --hex-gumpalan parameter mysqldump - tetapi data dalam format ini tidak diterima oleh PostgreSQL ketika saya mencoba menggunakan dumpfile yang dihasilkan sebagai file perintah. Opsi lain yang saya coba adalah menggunakan opsi --tab untuk mendapatkan dump dan kemudian memasukkannya ke PostgreSQL dengan perintah COPY - tetapi --hex-blob tidak bekerja dengan --tab dan PostgreSQL masih tidak menerima dumpfile yang mengatakan ada adalah karakter yang tidak valid di dalamnya.

Saya akan sangat senang mendapatkan saran tentang masalah ini - meskipun saya mulai berpikir bahwa menulis alat migrasi kustom bukanlah ide yang buruk ...

Sergey Kudriavtsev
sumber
Terakhir saya periksa, dblink PostgreSQL hanya bisa terhubung ke instance PostgreSQL lainnya. Saya tidak berpikir MySQL Proxy lebih baik. Anda mungkin perlu menggunakan bahasa favorit Anda (IE: Java, dll) untuk membaca dari MySQL untuk memasukkan ke dalam PostgreSQL ...
@ OMG: Seperti yang saya perhatikan dalam pertanyaan, saya hampir siap untuk pergi dengan cara ini - hanya memiliki sedikit harapan bahwa seseorang mengetahui sesuatu tentang masalah ini.
Jenis data apa di ujung pgsql yang Anda coba masukkan? Saya akan melakukan bytea sendiri.
@ Esc: Ya, tentu saja itu bytea.
2
posgresql 9 mendukung sintaks hex untuk bytea secara langsung, lihat di sini: postgresql.org/docs/9.0/interactive/… (Anda akan memerlukan sedikit sed)

Jawaban:

12

Saya pikir cara paling sederhana adalah dengan menggunakan --hex-blobsaklar itu mysqldumpdan mengembalikan oleh psql, dengan decode(string text, type text). Namun itu tidak sesederhana itu, karena Anda perlu mengubah sedikit dump yang diproduksi (sed, awk), menambahkan fungsi decode itu. Sebagai contoh:

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

sesi psql:

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

\i 'path/to/pg.dump'
Grzegorz Szpetkowski
sumber
Terima kasih atas sarannya, Grzegorz, saya akan mencoba ini dan melaporkan hasilnya.
Bekerja seperti pesona :) Uji 10 file yang diimpor dengan benar, semua checksum adalah dokumen asli yang cocok. Terima kasih banyak!
1
Jika Anda memiliki bidang lain, Anda tidak ingin itu cocok dengan koma atau tanda kurung. Ini seharusnya bekerja:sed "s/0x\([0-9A-F]*\)/decode('\1','hex')/g" prepg.dump > pg.dump
tjmcewan