MySQL에서 PostgreSQL로 큰 Blob 테이블을 마이그레이션하는 방법은 무엇입니까?


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

그러나 매우 큽니다 (> 20Gb).

mysqldump의 --hex-blob 매개 변수를 사용하려고했지만 결과 덤프 파일을 명령 파일로 사용하려고 할 때 PostgreSQL 에서이 형식의 데이터를 허용하지 않습니다. 내가 시도한 또 다른 옵션은 --tab 옵션을 사용하여 덤프를 가져 와서 COPY 명령으로 PostgreSQL에 삽입하는 것입니다. 그러나 --hex-blob가 --tab과 작동하지 않고 PostgreSQL은 여전히 ​​거기에서 말하는 덤프 파일을 수락하지 않습니다 잘못된 문자입니다.

사용자 지정 마이그레이션 도구를 작성하는 것이 결코 나쁜 생각이 아니라고 생각하기 시작했지만이 문제에 대한 조언을 얻을 수있어서 매우 기쁩니다 ...


마지막으로 PostgreSQL의 dblink 는 다른 PostgreSQL 인스턴스에만 연결할 수 있습니다. MySQL 프록시 가 더 낫다고 생각하지 않습니다 . PostgreSQL에 삽입하기 위해 MySQL에서 읽기 위해 선호하는 언어 (IE : Java 등)를 사용해야 할 수도 있습니다.

@OMG : 의문의 여지가 있듯이, 나는 거의 이런 식으로 갈 준비가되어 있습니다. 누군가가이 문제에 관해 무언가를 알고 싶어한다는 약간의 희망 만 갖습니다.

pgsql의 끝에서 어떤 데이터 유형을 삽입하려고합니까? 나는 bytea를 스스로 할 것입니다.

@ 스콧 : 네, 물론 bytea입니다.

2
직접 bytea와 대한 posgresql 9 개 지원 육각 구문은 여기를 참조 : postgresql.org/docs/9.0/interactive/...가 (당신이 비록 나오지도의 비트가 필요합니다)

답변:


12

가장 간단한 방법은 --hex-blob스위치 를 켜고 mysqldumppsql로 복원하는 것입니다 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.