2017-02-21 9 views
0

でのMySQLからPostgreSQLのにOnelinerパイプだから私は3台のサーバ間でのbashの日常を使用して、データのかなり多くの配管います:bashの

  • サーバーAのmysql(SSH経由の接続)
  • サーバーBがちょうどですが私は bashスクリプトを実行しています。
  • サーバCはpostgresql 9.6です。

varcharの真ん中にある1つのテーブルに二重引用符を付けて1つの行にするまで、すべてが良好でした。これは挿入レベル(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がこのようなパイプで使用されているときに関連するパラメータを見つけることができませんでした。

私は1本​​のパイプで物事を保つためにリクと思います(なしはmysql-> CSVその後、CSV-> PGください)。#

ありがとう!ここで

+0

だけ考えます。https:// wiki.postgresql.org/wiki/Foreign_data_wrappers –

+0

@ VaoTsunありがとうございます、私はかなり多くのfdwを使用しています。しかし、私の知る限りでは、それらのどれもsshとの接続を許可しません。またはそれらを行うのですか? – Breathe

+0

あなたはsshトンネルを設定することができますので、mysqlはpostgresのlocalhostを参照します –

答えて

0

はpostgresのにCSVファイルをインポートするサンプルを働いている:

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) 

あなたはMySQLへのsshトンネルを開き、(私の例では代わりにエコーの)ローカルmysql -h "$MYHOST" -u "$USER"-p"$PWD" prod -e "SELECT * FROM tableA "'を実行することができます