2017-02-21 48 views
0

所以我管了很多使用3臺服務器之間的bash日常的數據:Oneliner管從MySQL PostgreSQL的使用bash

  • 服務器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參數報價,但未能成功播放。 我應該在管道中間放一些sed嗎? 我也嘗試了從mysql中獲取數據時雙引號,但是當mysql在像這樣的管道中使用時找不到相關參數。

我LIK保持對事物的一個管(沒有MYSQL-> CSV然後CSV-> PG請)。#

謝謝!

+0

只是一個想法:https://開頭wiki.postgresql.org/wiki/Foreign_data_wrappers –

+0

@VaoTsun謝謝,我使用fdw相當多。然而就我所知,他們都不允許通過ssh進行連接;或者他們? – Breathe

+0

你可以設置ssh隧道,所以mysql會查看localhost for postgres –

回答

0

這裏的工作樣品導入CSV到Postgres的:

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

您可以打開SSH隧道,MySQL和(在我的例子,而不是回聲)運行mysql -h "$MYHOST" -u "$USER"-p"$PWD" prod -e "SELECT * FROM tableA "'本地