Answers:
提取表并将其直接传输到目标数据库:
pg_dump -t table_to_copy source_db | psql target_db
注意:如果另一个数据库已经设置了表,则应该使用该-a
标志仅导入数据,否则可能会看到诸如“内存不足”之类的奇怪错误:
pg_dump -a -t my_table my_db | psql target_db
pg_dump -U remote_user -h remote_server -t table_to_copy source_db | psql target_db
-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
pg_dump -t '"tableToCopy"' source_db | psql target_db
。请注意,表名用单引号和双引号引起来
您也可以在pgAdmin II中使用备份功能。只需按照以下步骤操作:
效果很好,一次可以处理多个表。
Objects
部分下选择多个表。在OSX上,单击SQL按钮或SQL Editor
通过Tools
菜单获取通过以粘贴从备份文件复制的SQL。
使用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);
在与两个服务器都有连接的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" )
PGPASSWORD=password1 psql -U ...
那么您甚至不需要显式的子外壳!通常,您需要先做几件事,所以无论如何都需要子shell。另外,密码不会导出到后续进程中。谢谢!
pg_dump -t '<table_name>' --schema-only
首先安装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
);
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', 'select r_col1, r_col2, r_col3 from r_tbl where r_col1 between ''2015-10-29'' AND ''2015-10-30'' ') AS t1(col1 MACADDR, col2 TIMESTAMP, col3 NUMERIC(7,1));
(l表示本地,r是远程。转义单引号。提供col类型。)
使用pg_dump转储表数据,然后使用psql还原它。
如果同时拥有两个远程服务器,则可以按照以下步骤操作:
pg_dump -U Username -h DatabaseEndPoint -a -t TableToCopy SourceDatabase | psql -h DatabaseEndPoint -p portNumber -U Username -W TargetDatabase
如果您已经有架构,它将把提到的源数据库表复制到目标数据库的相同命名表中。
您可以执行以下操作:
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>
若要在本地设置中将表从数据库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
export PGPASSWORD=<passw>
在运行命令之前完成
我在这里尝试了一些解决方案,它们确实很有帮助。以我的经验,最好的解决方案是使用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
)
)
此方法的问题在于,必须写出要复制的表的字段名称及其类型。
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"
与user5542464和Piyush S. Wanare的回答相同,但分为两个步骤:
pg_dump -U Username -h DatabaseEndPoint -a -t TableToCopy SourceDatabase > dump
cat dump | psql -h DatabaseEndPoint -p portNumber -U Username -W TargetDatabase
否则,管道将同时询问两个密码。
检查此python脚本
python db_copy_table.py "host=192.168.1.1 port=5432 user=admin password=admin dbname=mydb" "host=localhost port=5432 user=admin password=admin dbname=mydb" alarmrules -w "WHERE id=19" -v
Source number of rows = 2
INSERT INTO alarmrules (id,login,notifybyemail,notifybysms) VALUES (19,'mister1',true,false);
INSERT INTO alarmrules (id,login,notifybyemail,notifybysms) VALUES (19,'mister2',true,false);
或者,您也可以使用外部数据包装扩展名将远程表公开为本地表。然后,可以通过从远程数据库中的表中进行选择,将其插入表中。唯一的缺点是速度不是很快。