Làm thế nào để di chuyển bảng blob lớn từ mysql sang postgresql?


14

Tôi hiện đang trong quá trình di chuyển cơ sở dữ liệu MySQL của mình sang PostgreSQL. Hầu như mọi thứ đều ổn (tốt, sau rất nhiều lần tìm kiếm thông số mysqldump chính xác, v.v.) ngoại trừ một bảng tôi có - thực sự là bảng quan trọng nhất trong ứng dụng của tôi.

Cấu trúc bảng rất đơn giản:

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

nhưng nó rất lớn (> 20 Gb).

Tôi đã thử sử dụng tham số --hex-blob của mysqldump - nhưng dữ liệu ở định dạng này không được PostgreQuery chấp nhận khi tôi cố gắng sử dụng kết quả dumpfile làm tệp lệnh. Một tùy chọn khác mà tôi đã thử là sử dụng tùy chọn --tab để chỉ nhận một kết xuất và sau đó chèn nó vào PostgreQuery bằng lệnh COPY - nhưng --hex-blob không hoạt động với --tab và PostgreQuery vẫn không chấp nhận kết xuất tại đó là những ký tự không hợp lệ trong đó.

Tôi rất vui mừng khi nhận được bất kỳ lời khuyên nào về vấn đề này - mặc dù tôi bắt đầu nghĩ rằng viết một công cụ di chuyển tùy chỉnh không phải là một ý tưởng tồi sau tất cả ...


Tôi đã kiểm tra lần cuối, dblink của PostgreSQL chỉ có thể kết nối với các phiên bản PostgreQuery khác. Tôi không nghĩ MySQL Proxy là tốt hơn. Bạn có thể cần sử dụng ngôn ngữ yêu thích của mình (IE: Java, v.v.) để đọc từ MySQL để chèn vào PostgreQuery ...

@OMG: Như tôi đã nhận thấy trong câu hỏi, tôi gần như đã sẵn sàng để đi theo con đường này - chỉ cần hy vọng một chút rằng ai đó biết điều gì về vấn đề này.

Loại dữ liệu nào ở cuối pssql bạn đang cố gắng chèn nó vào? Tôi sẽ tự mình làm điều đó.

@Scott: Vâng, tất nhiên đó là bytea.

2
posgresql 9 hỗ trợ cú pháp hex cho bytea trực tiếp, xem tại đây: postgresql.org/docs/9.0/interactive/, (bạn sẽ cần một chút sed mặc dù)

Câu trả lời:


12

Tôi nghĩ rằng cách đơn giản nhất là sử dụng --hex-blobbật mysqldumpvà khôi phục bằng psql, vớidecode(string text, type text) . Tuy nhiên nó không đơn giản, bởi vì bạn cần thay đổi một ít kết xuất (sed, awk), thêm chức năng giải mã đó. Ví dụ:

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

phiên psql:

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

\i 'path/to/pg.dump'

Cảm ơn về một gợi ý, Grzegorz, tôi sẽ thử và báo cáo kết quả.

Hoạt động như một bùa mê :) Kiểm tra 10 tệp được nhập chính xác, tất cả các tổng kiểm tra đều khớp với bản gốc. Cảm ơn rât nhiều!

1
Nếu bạn có các trường khác, bạn sẽ không muốn nó khớp với dấu phẩy hoặc dấu ngoặc đơn. Điều này sẽ hoạt động:sed "s/0x\([0-9A-F]*\)/decode('\1','hex')/g" prepg.dump > pg.dump
tjmcewan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.