我试图在Postgres中从一个数据库复制整个表到另一个数据库。有什么建议吗?


当前回答

首先安装dblink

然后,你可以这样做:

INSERT INTO t2 select * from 
dblink('host=1.2.3.4
 user=*****
 password=******
 dbname=D1', 'select * t1') tt(
       id int,
  col_1 character varying,
  col_2 character varying,
  col_3 int,
  col_4 varchar 
);

其他回答

如果两个db (from & to)都有密码保护,在这种情况下,终端不会要求输入两个db的密码,密码提示只会出现一次。 因此,要解决这个问题,请将密码与命令一起传递。

PGPASSWORD=<password> pg_dump -h <hostIpAddress> -U <hostDbUserName> -t <hostTable> > <hostDatabase> | PGPASSWORD=<pwd> psql -h <toHostIpAddress> -d <toDatabase> -U <toDbUser>

使用pg_dump转储表数据,然后使用psql恢复。

Pg_dump并不总是有效。

假设在两个dbs中有相同的表ddl 你可以从stdout和stdin中破解它,如下所示:

 # grab the list of cols straight from bash

 psql -d "$src_db" -t -c \
 "SELECT column_name 
 FROM information_schema.columns 
 WHERE 1=1 
 AND table_name='"$table_to_copy"'"
 # ^^^ filter autogenerated cols if needed     

 psql -d "$src_db" -c  \
 "copy ( SELECT col_1 , col2 FROM table_to_copy) TO STDOUT" |\
 psql -d "$tgt_db" -c "\copy table_to_copy (col_1 , col2) FROM STDIN"

必须使用DbLink将一个表数据复制到不同数据库中的另一个表中。 您必须安装和配置DbLink扩展才能执行跨数据库查询。

我已经在这个话题上创建了详细的帖子。 请访问此链接

作为一种替代方法,您还可以使用外部数据包装器扩展将远程表公开为本地表。然后,您可以通过从远程数据库中的表进行选择,将数据插入到您的表中。唯一的缺点是速度不是很快。