วิธีโยกย้ายตารางหยดขนาดใหญ่จาก mysql ไปยัง postgresql


14

ตอนนี้ฉันกำลังย้ายฐานข้อมูล MySQL ไปยัง PostgreSQL เกือบทุกอย่างเป็นไปด้วยดี (ดีหลังจาก googling มากมายสำหรับ mysqldump params และอื่น ๆ ) ยกเว้นตารางเดียวที่ฉันมี - จริง ๆ แล้วเป็นตารางที่สำคัญที่สุดในแอปของฉัน

โครงสร้างตารางง่ายมาก:

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 ฉันทำ bytea ด้วยตัวเอง

@Scott: ใช่แน่นอนมันเป็น bytea

2
posgresql 9 รองรับไวยากรณ์ฐานสิบหกสำหรับ bytea โดยตรงดูที่นี่: postgresql.org/docs/9.0/interactive/ ...... (คุณต้องมีบิตของความคิด)

คำตอบ:


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'

ขอบคุณสำหรับคำแนะนำ Grzegorz ฉันจะลองและรายงานผลลัพธ์

ทำงานเหมือนเครื่องราง: ทดสอบไฟล์ 10 ไฟล์ที่นำเข้าอย่างถูกต้องเช็คซัมทั้งหมดนั้นตรงกับต้นฉบับ ขอบคุณมาก!

1
หากคุณมีฟิลด์อื่นคุณจะไม่ต้องการให้มันตรงกับเครื่องหมายจุลภาคหรือวงเล็บต่อท้าย สิ่งนี้น่าจะใช้ได้:sed "s/0x\([0-9A-F]*\)/decode('\1','hex')/g" prepg.dump > pg.dump
tjmcewan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.