2017-02-21 33 views
0

Поэтому я ТРУБОПРОВОДНЫЙ довольно много данных, используя Баш ежедневно между 3 серверами:Oneliner трубы к PostgreSQL из MySQL с Башем

  • Сервером А MySQL (соединение через SSH)
  • сервер B просто centos, где я запускаю сценарий bash .
  • Сервер C - postgresql 9.6.

Все было хорошо, пока один стол не получил один ряд с двойной кавычкой в ​​середине варчара. Это разрушает мою трубу на уровне вставки (на стороне pg).

Действительно, при получении данных из Mysql он не цитируется. Поэтому я считаю, что в конечном итоге это связано с основным поведением COPY и его параметром QUOTE.

Вот код Баш:

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 пожалуйста). #

Спасибо!

+0

только мысль: https: // wiki.postgresql.org/wiki/Foreign_data_wrappers –

+0

@VaoTsun Спасибо, я использую fdw довольно много. Тем не менее, насколько мне известно, ни одна из них не позволяет подключиться к ssh; или они? – Breathe

+0

вы можете настроить ssh tunnel, так что mysql будет смотреть на localhost для 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 "' локально (вместо эхо в моем примере)