如何在Postgres中使用DBI执行“远程表中的\ copy”命令?

时间:2009-03-06 20:37:19

标签: perl copy dbi

我需要从远程postgres服务器复制到本地服务器。我不能使用任何ETL工具;它必须使用带有DBI的Perl来完成。这个数据会很大,所以我不想使用“select from source”和“insert into local”。我希望使用COPY创建一个文件,但是这个文件将在远程服务器上创建。我也做不到。我想用\ COPY代替。

如何使用DBI执行“远程表中的\ copy”命令并使用Perl中的DBI创建本地文件。

由于

5 个答案:

答案 0 :(得分:4)

您可以使用DBD :: Pg在perl中执行此操作,详细信息可在此处找到:

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

答案 1 :(得分:2)

您肯定希望使用“copy from”和“copy to”命令来有效地将数据输入和输出数据库。它们比迭代数据行快几个数量级。您还希望在将数据复制到目标表时关闭索引,然后在复制完成时启用它们(并让它们构建)。

假设您只是连接到两个数据库的侦听器端口,只需打开与源数据库的连接,将表复制到文件,打开与目标数据库的连接并将文件复制回到目标表。

答案 2 :(得分:0)

嗯。 \copy to ...psql指令,而不是SQL,因此DBI或另一端的PostgreSQL服务器不会理解它。

我看到PostgreSQL的SQL COPY命令有FROM STDINTO STDOUT选项 - 但我怀疑DBI是否有办法执行访问结果所需的“原始读取”数据。 (我确信TO STDOUTpsql内部实施\copy to ...的方式。)

所以:在您的情况下,我会使用例如将源文件夹上的文件夹安装回目标框。 samba或nfs,并使用普通的COPY TO '/full/path/to/mounted/folder/data.txt' ...

答案 3 :(得分:0)

我使用\ copy(select * from remote_table)到'/local/file.txt'...然后\ copy local_table从'/local/file.txt'将文件加载到本地db 。我从psql脚本执行了\ copy命令。

这是我的剧本

导出PGUSER = remoteuser export PGPASSWORD = remotepwd

/opt/PostgreSQL/8.3/bin/psql -h xx.xx.xx -p 5432 -d remotedb -c“\ COPY(select * from remote_table where date(reccreationtim) e)= date((current_date - interval'4 day')))TO'/ lococal/copied_from_remote.txt'D ELIMITER'|'“

导出PGUSER = localuser export 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'|'”

答案 4 :(得分:0)

您可以使用〜/ .pgpass并自己保存导出PGUSER的东西,并将密码保存在环境之外......(从安全角度来看总是一个好主意)