mysql - 使用 bash 从 MySQL 到 PostgreSQL 的 Oneliner 管道

标签 mysql bash postgresql pipeline

所以我每天使用 bash 在 3 个服务器之间传输大量数据:

  • 服务器 A 是 mysql(通过 SSH 连接)
  • 服务器 B 只是一台 centos 服务器,我在其中运行 bash 脚本。
  • 服务器 C 是 postgresql 9.6。

一切都很好,直到一个表在 varchar 中间出现一行带有双引号的行。这在插入级别(在 pg 侧)破坏了我的管道。

确实,这样从Mysql获取数据时,是没有引用的。所以,我相信最终这是因为 COPY 及其 QUOTE 参数的基本行为。

这是 bash 代码:

ssh -o ConnectTimeout=5 -i "$SSH_KEY" "$SSH_USER"@"$SSH_IP" 'mysql -h "$MYHOST" -u "$USER"-p"$PWD" prod -e "SELECT * FROM tableA "' | \
psql -h "$DWH_IP" "$PG_DB" -c "COPY tableA FROM stdin WITH CSV HEADER DELIMITER E'\t' NULL AS 'NULL';"

我尝试使用 COPY 参数 QUOTE 但没有成功。 我应该在管道中间放一些 sed 吗? 我在从mysql中获取数据时也尝试过双引号,但当mysql在这样的管道中使用时找不到相关参数。

我希望将所有内容保存在一个管道中(请不要使用 MYSQL->CSV,而是使用 CSV->PG)。#

谢谢!

最佳答案

这是将 csv 导入 postgres 的工作示例:

t=# create table so10 (i int,t text);
CREATE TABLE
t=# \q
postgres@vao-VirtualBox:~$ echo "1,Bro" | psql -d t -c "copy so10 from stdin with csv"
COPY 1
postgres@vao-VirtualBox:~$ psql t -c "select * from so10"
 i |  t
---+-----
 1 | Bro
(1 row)

您可以打开到 mysql 的 ssh 隧道并在本地运行 mysql -h "$MYHOST"-u "$USER"-p"$PWD"prod -e "SELECT * FROM tableA "' (而不是我的示例中的 echo)

关于mysql - 使用 bash 从 MySQL 到 PostgreSQL 的 Oneliner 管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42368225/

相关文章:

php - SQL JOIN 失败的问题

java - hibernate从与具有一对多关系的子表完全匹配的列表中搜索查询

linux - 需要一些帮助编写 shell 脚本来添加数字

bash - 如何调试 Bash 脚本?

mysql - 将列类型从 int 或 bigint 更改为时间戳

mysql - 在 ubuntu 中将 postgres 转储转换为 mysql 转储

php - 如何在 PHP 中转义 mysqli_query() 中的双引号字符?

python - SQLAlchemy/MySQL 的表设计

bash - 存在字符串时如何在两个定界符之间提取文本

Mac OS 10.6.5 中 Postgresql 的 Drupal 7 配置错误