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

时间:2010-07-07 13:27:59

标签: postgresql copy database-table

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

20 个答案:

答案 0 :(得分:246)

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

pg_dump -t table_to_copy source_db | psql target_db

答案 1 :(得分:81)

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

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

运行良好,可以一次执行多个表。

答案 2 :(得分:65)

使用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);

答案 3 :(得分:24)

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

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

答案 4 :(得分:18)

首先install 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 
);

答案 5 :(得分:13)

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

答案 6 :(得分:10)

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

pg_dump -U Username -h DatabaseEndPoint -a -t TableToCopy SourceDatabase | psql -h DatabaseEndPoint -p portNumber -U Username -W TargetDatabase

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

答案 7 :(得分:8)

您可以执行以下操作:

movq (%rax, %rcx, 3), %rbx

答案 8 :(得分:8)

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

pg_dump -h localhost -U myuser -C -t my_table -d first_db>/tmp/table_dump

然后加载转储文件:

psql -U myuser -d second_db</tmp/table_dump

答案 9 :(得分:5)

要在本地设置中将表从数据库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

答案 10 :(得分:4)

我在这里尝试了一些解决方案,他们真的很有帮助。根据我的经验,最佳解决方案是使用 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 
  )
 )

此方法的问题是必须写入要复制的表的字段名称及其类型。

答案 11 :(得分:4)

scrollEnabled无效。

鉴于您在两个dbs中都有相同的表ddl 你可以从stdout和stdin中删除它,如下所示:

pg_dump

答案 12 :(得分:3)

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

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

答案 13 :(得分:2)

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

我已经就此主题创建了详细的帖子。 Please visit this link

答案 14 :(得分:2)

选中此python script

import pandas as pd
import numpy as np

df = pd.DataFrame({'var1': [23, 23, 43, 43, 53],
                   'var2': [1, 0, 0, 0,1],
                   'var3': [0, 0, 0, 1, 0],
                   'var4': [0, 0, 0, 1, 0],
                   'var5': [0, 1, 1, 0, 0]})
print(df)

df['Dup'] = np.where(df['var1'].duplicated(keep=False), 'dup', np.nan)

df['var2'] = np.where(df['Dup']=="dup", df.groupby(['var1'])['var2'].transform('max'), df['var2'])
df['var3'] = np.where((df['Dup']=="dup") & (df['var2']==1), 0 , df['var3'])
df['var4'] = np.where((df['Dup']=="dup") & (df['var2']==1), 0 , df['var4'])
df['var5'] = np.where((df['Dup']=="dup") & (df['var2']==1), 0 , df['var5'])

df['others_dup'] = np.where((df['Dup']=='dup') & (df['var2']==0), 1, np.nan)

df['var3']=np.where(df['others_dup']==1, df.groupby(['var1'])['var3'].transform('max'), df['var3'])
df['var4']=np.where(df['others_dup']==1, df.groupby(['var1'])['var4'].transform('max'), df['var4'])
df['var5']=np.where(df['others_dup']==1, df.groupby(['var1'])['var5'].transform('max'), df['var5'])

print(df)

答案 15 :(得分:1)

如果两个数据库(从&到)都受到密码保护,则在这种情况下,终端将不会要求两个数据库都提供密码,密码提示将仅出现一次。 因此,要解决此问题,请将密码和命令一起传递。

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

答案 16 :(得分:0)

如果从Windows运行pgAdmin(备份:pg_dump,还原:pg_restore),它将默认尝试将文件输出到c:\Windows\System32,这就是为什么您将获得许可/访问权限的原因拒绝错误,不是因为用户postgres权限不足。 以管理员身份运行 pgAdmin 或仅选择输出的位置,而不是Windows的系统文件夹。

答案 17 :(得分:0)

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

答案 18 :(得分:0)

我当时使用的是 DataGrip (通过Intellij Idea)。而且从一个表(从另一个数据库到另一个表)复制数据非常容易。

首先,请确保您同时连接了Data Grip中的两个DataSource。

选择源表,然后按F5或(右键单击->选择“将表复制到”。)

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

DataGrip将为您处理其他所有事情。

答案 19 :(得分:0)

对于 DBeaver tool 用户,您可以“导出数据”到另一个数据库中的表格。

enter image description here

我一直面临的唯一错误是因为wrong postgres driver

SQL Error [34000]: ERROR: portal "c_2" does not exist
    ERROR: Invalid protocol sequence 'P' while in PortalSuspended state.

这是关于如何导出数据的官方维基https://github.com/dbeaver/dbeaver/wiki/Data-transfer