我正在尝试这样做:
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,但不完全。
有没有办法做到这一点,还是我鞭打死马?
答案 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
。