2012-10-25 4 views
0

나는이 할 노력하고있어 :MySQL의 수출 TSV

COPY huge_table (some_fields) FROM stdin; 

그리고 trailer.sql 그냥 \.에 포함되어 있습니다

mysql -u root old_db -e "SELECT some_fields FROM huge_table INTO OUTFILE ..." \ 
| cat header.sql - trailer.sql \ 
| psql new_db 

header.sql에 포함 된 경우를 스트림을 종료합니다.

나는이 파이프가 작동 할 수 있도록 MySQL에서 탭으로 구분 된 값을 STDOUT으로 덤프하는 방법을 알지 못한다. 나는/dev/stdout을 경로로 지정하려고했지만 권한이 없다고 주장한다.

가능한 한 빨리 MySQL에서 PostgreSQL으로 데이터를 가져 오려고합니다. 디스크에 쓰고 PostgreSQL로 되돌릴 시간이 너무 느립니다.

MySQL에 파이프하면 거의 TSV가 출력되지만 그렇지는 않습니다.

이렇게 할 방법이 있습니까? 아니면 죽은 말을 매질하고 있습니까?

답변

1

PostgreSQL의 COPY에는 탭으로 구분할 필요가 없습니다. \copy tablename from stdin csv을 사용하면됩니다. 당신이 파이프 쉘과 출력을 할 수 있도록 MySQL은 표준 출력에 직접 파이프 열 명령에 기록하거나 얻을 수없는 경우

는 유닉스 named pipe를 사용하여 고전적인 해결 방법은 다음과 같습니다

$ mkfifo copy_fifo 
$ psql dbname '\copy table1 from copy_fifo csv' 

다음 다른 터미널에서 : 대안

$ mysql -u root old_db -e "SELECT some_fields FROM huge_table INTO OUTFILE copy_fifo FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"'" 

시도 :

$ mysql dbname -B -e "SELECT some_fields FROM huge_table" | psql dbname '\copy table1 from stdin' 

이것은 NULL s에서 작동하지 않을 수도 있습니다.

또 다른 옵션은 -T 플래그와 the manual for mysqldump에 따라 --fields-terminated-by=..., --fields-enclosed-by=..., --fields-optionally-enclosed-by=..., --fields-escaped-by=...를 사용하여 CSV와 같은 출력을 생성 mysqldump을 사용하는 것입니다. 파이프 mysqldump의 출력은 psql입니다.

+1

흠, 정말이 기능을 사용하고 싶었지만 불행히도 MySQL은 파일이 이미 존재한다고 불평합니다 (새로운 파일 생성을 주장합니다). 나는 이것이 쉽게 해결할 수 없다고 생각한다. 젠장, 너 MySQL : P – d11wtq

+0

@ d11wtq 젠장 ... 나는 그걸 확인하지 않을 것이라고 생각했다. INTO OUTFILE에는'OVERWRITE' 또는'APPEND' 플래그가 없습니다. 또는'INTO'를'stdout'에 쓰고 쉘을 사용하여 결과를'psql'으로 파이프 할 수 있습니까? –

+0

당신은이 문제에 홀로 있지 않습니다. http://stackoverflow.com/q/5016010/398670 –