在Postgres中将表从一个数据库复制到另一个数据库

nix*_*nix 244 postgresql copy database-table

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

tho*_*max 272

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

pg_dump -t table_to_copy source_db | psql target_db
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果其他数据库已经设置了表,则应该为_data only_使用`-a`标志.即`pg_dump -a -t my_table my_db | psql target_db`.虽然我在这里,如果您的数据库在服务器上,我发现将数据库转储到文件然后将该文件scp到数据库更容易,然后将文件的内容发送到psql.例如`_pg_dump -a -t my_table my_db> my_file.sql`并将其放在你的服务器上 - >`psql my_other_db <my_file.sql` (14认同)
  • @curlyreggie没有试过这个,但我认为没有理由不这样做.尝试在命令中添加用户和服务器细节,例如`pg_dump -U remote_user -h remote_server -t table_to_copy source_db | psql target_db` (10认同)
  • 这对远程数据库链接有什么作用?例如,我需要从不同的位置转储. (4认同)
  • 您可以尝试以下操作:“ pg_dump -U remote_user -h remote_server -t table_to_copy source_db | psql target_db -U remote_user -h remote_server” (2认同)
  • @EamonnKenny要转储区分大小写的表,请执行:pg_dump -t'“ tableToCopy”' psql target_db`。请注意,表名用单引号和双引号引起来 (2认同)
  • 是否可以将表复制到另一个数据库但具有不同的(现有)架构?我可以将任何开关添加到“psql target_db”部分吗? (2认同)

a2r*_*n44 94

您还可以使用pgAdmin II中的备份功能.只需按以下步骤操作:

  • 在pgAdmin中,右键单击要移动的表,选择"备份"
  • 选择输出文件的目录并将Format设置为"plain"
  • 单击"转储选项#1"选项卡,选中"仅数据"或"仅架构"(取决于您正在执行的操作)
  • 在"查询"部分下,单击"使用列插入"和"用户插入命令".
  • 单击"备份"按钮.这会输出到.backup文件
  • 使用记事本打开此新文件.您将看到表/数据所需的插入脚本.将它们复制并粘贴到pgAdmin中的新数据库sql页面中.以pgScript格式运行 - 查询 - >执行为pgScript F6

效果很好,一次可以做多个表.

  • 这是一个基于 GUI 的良好解决方案,用于在数据库之间移动数据。谢谢! (4认同)
  • 您可以在"对象"部分下选择多个表.在OSX上,单击SQL按钮或通过`Tools`菜单获取`SQL Editor`以粘贴从备份文件复制的SQL. (3认同)
  • @Timothy这里是关于如何加快备份和恢复的[postgres文档页面](http://www.postgresql.org/docs/9.3/static/populate.html) (3认同)

tin*_*hen 70

使用dblink会更方便!

truncate table tableA;

insert into tableA
select *
from dblink('dbname=postgres hostaddr=xxx.xxx.xxx.xxx dbname=mydb user=postgres',
            'select a,b from tableA')
       as t1(a text,b text);
Run Code Online (Sandbox Code Playgroud)

  • 为什么两次dbname两次..?哪一个是来源和目标. (12认同)
  • 如果我想使用dblink Bun我不知道源源表的结构? (3认同)
  • 我们要插入的 tableA 是目标,dbLink 中的 tableA 是源。 (2认同)

Ale*_*dov 28

在与两台服务器连接的linux主机上使用psql

( export PGPASSWORD=password1 
  psql -U user1 -h host1 database1 \
  -c "copy (select field1,field2 from table1) to stdout with csv" ) \
| 
( export PGPASSWORD=password2 
  psql -U user2 -h host2 database2 \ 
   -c "copy table2 (field1, field2) from stdin csv" )
Run Code Online (Sandbox Code Playgroud)

  • 不需要导出,“PGPASSWORD=password1 psql -U ...”那么你甚至不需要显式的子shell!通常,您需要先做几件事来设置,因此无论如何子 shell 可能都是必要的。此外,密码不会导出到后续流程中。谢谢! (2认同)
  • 该表必须存在于目标数据库中。要创建它,请尝试 `pg_dump -t '&lt;table_name&gt;' --schema-only` (2认同)
  • 将密码放入 [`~/.pgpass`](https://www.postgresql.org/docs/current/libpq-pgpass.html)。 (2认同)

小智 23

首先安装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 
);
Run Code Online (Sandbox Code Playgroud)

  • 这个答案很棒,因为它允许过滤复制的行(在 dblink 的第二个参数中添加 WHERE 子句)。但是,需要明确列名(Postgres 9.4),例如:`INSERT INTO l_tbl (l_col1, l_col2, l_col3) SELECT * FROM dblink('dbname=r_db hostaddr=r_ip password=r_pass user=r_usr', '从 r_tbl 中选择 r_col1, r_col2, r_col3 其中 r_col1 介于 ''2015-10-29'' 和 ''2015-10-30'' ') AS t1(col1 MACADDR, col2 TIMESTAMP, col3 NUMERIC(7,1)); `(l 表示本地,r 表示远程。转义单引号。提供 col 类型。) (2认同)

Pab*_*ruz 13

使用pg_dump转储表数据,然后使用psql将其还原.

  • 然后使用另一个databaserole进行连接,该角色具有足够的权限.http://www.postgresql.org/docs/8.4/static/app-pgdump.html (2认同)
  • 考虑到其他答案向您展示了如何使用 pg_dump,这并不是一个真正有用的答案 (2认同)

Piy*_*are 11

如果您同时拥有远程服务器,则可以按照以下步骤操作

pg_dump -U Username -h DatabaseEndPoint -a -t TableToCopy SourceDatabase | psql -h DatabaseEndPoint -p portNumber -U Username -W TargetDatabase
Run Code Online (Sandbox Code Playgroud)

如果您已有现有模式,它会将提到的源数据库表复制到目标数据库的同一个命名表中.


Gow*_*amy 9

pg_dump -h <host ip address> -U <host db user name> -t <host table> > <host database> | psql -h localhost -d <local database> -U <local db user>
Run Code Online (Sandbox Code Playgroud)

  • 你想谈点什么吗 (2认同)

max*_*max 8

这对我有用.首先转储到文件:

pg_dump -h localhost -U myuser -C -t my_table -d first_db>/tmp/table_dump
Run Code Online (Sandbox Code Playgroud)

然后加载转储的文件:

psql -U myuser -d second_db</tmp/table_dump
Run Code Online (Sandbox Code Playgroud)


Dev*_*ine 7

我正在使用DataGrip(由 Intellij Idea 提供)。将数据从一个表(在不同的数据库中复制到另一个表)非常容易。

首先,确保您已连接到 Data Grip 中的两个数据源。

选择源表并按 F5 或(右键单击 -> 选择将表复制到。)

这将显示所有表的列表(您也可以在弹出窗口中使用表名称进行搜索)。只需选择您的目标并按“确定”即可。

DataGrip 将为您处理其他一切。

  • 请注意,DataGrip 是**不是免费的**! (5认同)

小智 6

要在本地设置中将表从数据库A移动到数据库B,请使用以下命令:

pg_dump -h localhost -U owner-name -p 5432 -C -t table-name database1 | psql -U owner-name -h localhost -p 5432 database2


小智 5

我在这里尝试了一些解决方案,它们真的很有帮助。根据我的经验,最好的解决方案是使用psql命令行,但有时我不想使用 psql 命令行。所以这是pgAdminIII 的另一个解决方案

create table table1 as(
 select t1.* 
 from dblink(
   'dbname=dbSource user=user1 password=passwordUser1',
   'select * from table1'  
  ) as t1(
    fieldName1 as bigserial,
    fieldName2 as text,
    fieldName3 as double precision 
  )
 )
Run Code Online (Sandbox Code Playgroud)

这种方法的问题在于,必须写入要复制的表的字段名称及其类型。


Ado*_*obe 5

user5542464Piyush S. Wanare 的回答相同,但分为两步:

pg_dump -U Username -h DatabaseEndPoint -a -t TableToCopy SourceDatabase > dump
cat dump | psql -h DatabaseEndPoint -p portNumber -U Username -W TargetDatabase
Run Code Online (Sandbox Code Playgroud)

否则管道会同时询问两个密码。


Yor*_*iev 5

pg_dump并不总是有效。

鉴于您在两个数据库中有相同的表 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"
Run Code Online (Sandbox Code Playgroud)