将结果从一个DB中的PostgreSQL视图复制到另一个DB中的表

时间:2011-11-05 17:49:24

标签: postgresql replication etl

完成PostgreSQL newb。

我在db1中有7到8个视图的数据需要复制到不同数据库db2中具有匹配模式(模式?)的表中。目标数据库可以是PostgreSQL的同一个实例,也可以是另一个盒子上的一个。

我知道有2-3种不同的方法可以用我熟悉的数据库来实现这个目标,但是我对这个数据库很无奈。有人可以为我建议一些基本策略吗?

在一个完美的世界里,我宁愿不做任何感觉太过分的事情 - 我宁愿做某种事情

SELECT FROM instance1.db1.viewname INTO instance2.db5.tablename

然后将数据作为文本文件从视图中转储出来并重新加载到目标表中。

由于我不了解PostgreSQL,但我并不知道可能性范围内的内容。

2 个答案:

答案 0 :(得分:3)

CREATE TEMPORARY TABLE mytmp
AS SELECT * from myview
WHERE 1=1
;


COPY mytmp TO '/tmp/test.csv'
;

更好的方法是:

  • 将视图复制到表格中(将table1创建为select * from view1; ...)
  • 使用pg_dump -t table1 -t table2 ... mydbname> myfile.out
  • 使用myfile.out重新创建并填充表格。

答案 1 :(得分:3)

您无需为COPY TO创建临时表。任何查询都可以是源码自PostgreSQL 8.2

COPY (SELECT * FROM view1) TO '/var/lib/postgres/myfile1.csv';

阅读manual about COPY。使用

在本地创建所需的表
CREATE table tbl1 AS
SELECT * FROM view1
LIMIT 0;   -- no data, just the schema.

复制DDL指令并在目标数据库中创建所有表。 pgAdmin是一个方便的GUI。再次删除源数据库中的空表。使用

加载数据
COPY tbl1 FROM '/var/lib/postgres/myfile1.csv';

像@wildplasser这样的转储/恢复描述它,是另一种方式。

对于一次性转移,建议使用其中一种方法。对于重复申请,dblinkSQL/MED (外部数据管理)可能更合适。