PostgreSQL - 将数据从一个数据库传输到另一个数据库

时间:2017-09-04 07:11:36

标签: python database postgresql pgadmin

我有一个原始数据库[1],其中我删除了很多我不打算使用错误查询的数据。

我创建了一个备份数据库[2],它是我删除之前删除的原始数据库[1]的副本。现在我想将错误删除的数据从我的备份数据库[2]移动到我的原始数据库[1]

我需要确保在此过程中不会创建重复项,因为某些数据仍在我的原始数据库中[1]。

我的数据库具有以下结构:

-----------------------------------------------------
| id (serial - auto incrementing int) | - primary key
| did (varchar) |
| sid (int) |
| timestamp (bigint) |
| data (json) | 
| db_timestamp (bigint) |
-----------------------------------------------------

我试过通过谷歌搜索找到解决方案,但无济于事。根据我的SQL知识,我不认为这可以完成(从一个数据库到另一个数据库),但是我已经准备好实现一个Python脚本了,如果需要的话(我在Python中非常全面) 。我正在运行PostgreSQL 9.6,我正在使用pgAdmin 3向我的数据库写入查询。

我需要转移的表名为datastore,我希望有人知道如何执行此数据传输,而不会创建重复项。

我希望我得到了所有细节,如果没有,请告诉我,我会提供。

更新

我想最好提一下我在原始数据库中加入的问题[1]是我删除了一点点数据。我想要传输的行是我意外删除的行。

所以我假设,检查每行的id是否已经存在就足够了。如果确实如此,我应该跳过有问题的行,如果没有,我应该转移行。

欢迎任何建议!我不是最聪明的SQL鹰;)

1 个答案:

答案 0 :(得分:1)

您可以使用copy(在本地计算机上的psql -h db2_restored中):

\copy datastore to '/tmp/d.csv'

然后在本地计算机上psql -h db1_original

create table tt as select * from datastore where false;
\copy tt from '/tmp/d.csv'
insert into datastore 
  select * 
  from tt 
  join datastore orig on tt.id = orig.id 
  where orig.id is null
;

它将通过网络连接到您的计算机并返回到RDS,从这一点来说效率很低,但使用dblink将需要更改(创建扩展,配置RDS以相互通信等等)。如果你选择dblink - 逻辑保持不变 - 使用PK来识别丢失的密钥