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,以便您可以使用 shell 将其输出通过管道传输,则有一个使用 unix命名管道的经典解决方法:

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

尽管在 s 存在的情况下这不太可能起作用NULL

另一种选择是使用标志和 根据手册mysqldump生成类似 CSV 的输出。管道的输出到.-T--fields-terminated-by=..., --fields-enclosed-by=..., --fields-optionally-enclosed-by=..., --fields-escaped-by=...mysqldumpmysqldumppsql

于 2012-10-25T10:20:02.223 回答