Как я могу использовать DBI для выполнения команды «\ copy from remote table» в Postgres? - PullRequest
3 голосов
/ 06 марта 2009

Мне нужно скопировать с удаленного сервера postgres на локальный. Я не могу использовать любые инструменты ETL; это должно быть сделано с использованием Perl с DBI. Эти данные будут большими, поэтому я не хочу использовать «выбрать из источника» и «вставить в локальный». Я искал использовать COPY для создания файла, но этот файл будет создан на удаленном сервере. Я тоже не могу этого сделать. Я хочу использовать \ COPY вместо.

Как использовать DBI для выполнения команды "\ copy from remote table" и создания локального файла с использованием DBI в Perl.

Спасибо

Ответы [ 5 ]

4 голосов
/ 17 июня 2009

Вы можете сделать это в perl с DBD :: Pg, подробности можно найти здесь:

https://metacpan.org/pod/DBD::Pg#COPY-support

2 голосов
/ 07 марта 2009

Вы определенно хотите использовать команды «копировать из» и «копировать в» для эффективного ввода и вывода данных из баз данных. Они на несколько порядков быстрее, чем итерации по строкам данных. Многие также хотят отключить индексы во время копирования данных в целевую таблицу, а затем включить их (и позволить им строить) после завершения копирования.

Если вы просто подключаетесь к портам прослушивателя двух баз данных, просто откройте соединение с исходной базой данных, скопируйте таблицы в файл, откройте соединение с целевой базой данных и скопируйте файл обратно в целевой стол.

0 голосов
/ 07 января 2010

Вы можете использовать ~ / .pgpass и сохранить себя для экспорта PGUSER, а также сохранить пароль вне среды ... (всегда хорошая идея с точки зрения безопасности)

0 голосов
/ 13 марта 2009

Я заставил его работать, используя \ copy (выбрать * из remote_table) в '/local/file.txt' ... затем \ copy local_table из '/local/file.txt', чтобы загрузить файл в локальную базу данных , Я выполнил команду \ copy из сценария psql.

Вот мой сценарий

export PGUSER = remoteuser экспорт PGPASSWORD = remotepwd

/ opt / PostgreSQL / 8.3 / bin / psql -h xx.xx.xx -p 5432 -d remotedb -c "\ COPY (выбрать * из таблицы с удаленным доступом, где указана дата (reccreationtim e) = дата ((current_date - интервал «4 дня»))) TO '/local/copied_from_remote.txt' D ELIMITER '|' "

export PGUSER = localuser экспорт PGPASSWORD = localpwd

/ opt / PostgreSQL / 8.3 / bin / psql -h xx.xx.xx.xx -p 5432 -d localdb -c "\ COPY local_table FROM '/local/copied_from_remote.txt' DELIMITER '|'"

0 голосов
/ 08 марта 2009

Хм. \copy to ... - это директива psql, а не SQL, поэтому она не будет понята ни DBI, ни сервером PostgreSQL на другом конце.

Я вижу, что команда SQL COPY в PostgreSQL имеет опции FROM STDIN и TO STDOUT, но я сомневаюсь, что в DBI есть способ выполнить «необработанные чтения», необходимые для доступа к данным результата. (Я уверен, что TO STDOUT - это то, как psql внутренне реализует \copy to ....)

Итак: в вашем случае я бы смонтировал папку на вашем исходном ящике обратно на ваш целевой ящик, используя, например, Samba или NFS, и использовать старый добрый COPY TO '/full/path/to/mounted/folder/data.txt' ....

...