1

私はこれをやろうとしています:

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

header.sqlに含まれる場所:

COPY huge_table (some_fields) FROM stdin;

また、trailer.sqlには\.、ストリームを終了するためのが含まれています。

このパイプが機能するように、MySQLにタブ区切りの値をSTDOUTにダンプさせる方法を私は一生理解できません。パスとして/dev/ stdoutを指定しようとしましたが、権限がないと主張しています。

MySQLからPostgreSQLにできるだけ速くデータを取得するためにこれを実行しようとしています。ディスクに書き込んでPostgreSQLに戻すまでの時間が遅すぎます。

クエリMySQLにパイプすると、ほとんどTSVが出力されますが、完全ではありません。

これを行う方法はありますか、それとも私は死んだ馬を曇らせていますか?

4

1 に答える 1

1

PostgreSQLCOPYではタブ区切りは必要ありません。そのまま使用して\copy tablename from stdin csvください。

パイプで開かれたコマンドに MySQL を書き込むことができない場合、または stdout に直接書き込むことができない場合は、その出力をシェルでパイプすることができます

$ 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'

ただし、これはNULLs の存在下では機能しそうにありません。

別のオプションは、フラグ を使用しmysqldumpて CSV のような出力を生成するために使用することです。の出力を にパイプします。-T--fields-terminated-by=..., --fields-enclosed-by=..., --fields-optionally-enclosed-by=..., --fields-escaped-by=...mysqldumpmysqldumppsql

于 2012-10-25T10:20:02.223 に答える