MySQL将TSV导出为STDOUT,而不是文件

时间:2012-10-25 10:16:39

标签: mysql postgresql

我正在尝试这样做:

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,但不完全。

有没有办法做到这一点,还是我鞭打死马?

1 个答案:

答案 0 :(得分:1)

PostgreSQL的COPY不需要以制表符分隔;只需使用\copy tablename from stdin csv

如果你不能让MySQL写入管道打开的命令,或者直接写入stdout以便你可以使用shell管道输出,那么使用unix 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。

出现时起作用

另一种选择是使用mysqldump使用-T标志生成类似CSV的输出 --fields-terminated-by=..., --fields-enclosed-by=..., --fields-optionally-enclosed-by=..., --fields-escaped-by=...根据the manual for mysqldump。将mysqldump的输出传递给psql