我需要从远程postgres服务器复制到本地服务器。我不能使用任何ETL工具;它必须使用带有DBI的Perl来完成。这个数据会很大,所以我不想使用“select from source”和“insert into local”。我希望使用COPY创建一个文件,但是这个文件将在远程服务器上创建。我也做不到。我想用\ COPY代替。
如何使用DBI执行“远程表中的\ copy”命令并使用Perl中的DBI创建本地文件。
由于
答案 0 :(得分:4)
您可以使用DBD :: Pg在perl中执行此操作,详细信息可在此处找到:
答案 1 :(得分:2)
您肯定希望使用“copy from”和“copy to”命令来有效地将数据输入和输出数据库。它们比迭代数据行快几个数量级。您还希望在将数据复制到目标表时关闭索引,然后在复制完成时启用它们(并让它们构建)。
假设您只是连接到两个数据库的侦听器端口,只需打开与源数据库的连接,将表复制到文件,打开与目标数据库的连接并将文件复制回到目标表。
答案 2 :(得分:0)
嗯。 \copy to ...
是psql
指令,而不是SQL,因此DBI或另一端的PostgreSQL服务器不会理解它。
我看到PostgreSQL的SQL COPY
命令有FROM STDIN
和TO STDOUT
选项 - 但我怀疑DBI是否有办法执行访问结果所需的“原始读取”数据。 (我确信TO STDOUT
是psql
内部实施\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的东西,并将密码保存在环境之外......(从安全角度来看总是一个好主意)