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


当前回答

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"

其他回答

如果你在Windows上运行pgAdmin(备份:pg_dump,恢复:pg_restore),默认情况下,它会尝试将文件输出到c:\Windows\System32,这就是为什么你会得到拒绝权限/访问的错误,而不是因为用户postgres不够高。以管理员身份运行pgAdmin,或者直接选择Windows系统文件夹以外的输出位置。

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

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

提取表并将其直接输送到目标数据库:

pg_dump -t table_to_copy source_db | psql target_db

注意:如果其他数据库已经设置了表,你应该使用-a标志只导入数据,否则你可能会看到奇怪的错误,如“Out of memory”:

pg_dump -a -t table_to_copy source_db | psql target_db

你可以通过两个简单的步骤做到:

# dump the database in custom-format archive
pg_dump -Fc mydb > db.dump

# restore the database
pg_restore -d newdb db.dump

如果是远程数据库:

# dump the database in custom-format archive
pg_dump -U mydb_user -h mydb_host -t table_name -Fc mydb > db.dump

# restore the database
pg_restore -U newdb_user -h newdb_host -d newdb db.dump

没有任何管道,在Windows上,你可以使用:

转储-编辑这是在一行

"C:\Program Files\PostgreSQL\14\bin\pg_dump.exe"
--host="host-postgres01"
--port="1234"
--username="user01"
-t "schema01.table01"
--format=c
-f "C:\Users\user\Downloads\table01_format_c.sql"
"DB-01"

恢复-编辑这是在一行

"C:\Program Files\PostgreSQL\14\bin\pg_restore.exe"
--host="host-postgres02"
--port="5678"
--username="user02"
-1
--dbname="DB-02"
"C:\Users\user\Downloads\table01_format_c.sql"

系统将提示您输入用户密码。

这个解决方案将把新表放在具有相同名称的模式中(schema01)。