不带DELETE语句的Postgresql复制

不带DELETE语句的Postgresql复制,postgresql,database-replication,Postgresql,Database Replication,我们有一个要求,要求我们在某一时刻拥有系统中所有项目的副本。解释它的最简单方法是复制,但忽略delete语句INSERT和UPDATE都可以 这可能吗?或者更好的问题是,解决此类问题的最佳方法是什么?制作当前数据库的副本/副本,并通过dblink使用触发器从当前数据库到副本。使用插入后和更新后触发器在复制副本中插入和更新数据 因此,每当当前数据库中发生行插入/更新时,它都会直接反映到副本中。我不确定自己是否完全理解这个问题,但我会尽力帮助: 第一个与@Sunit相反-我建议避免触发器。触发器会带

我们有一个要求,要求我们在某一时刻拥有系统中所有项目的副本。解释它的最简单方法是复制,但忽略delete语句INSERT和UPDATE都可以
这可能吗?或者更好的问题是,解决此类问题的最佳方法是什么?

制作当前数据库的副本/副本,并通过dblink使用触发器从当前数据库到副本。使用插入后和更新后触发器在复制副本中插入和更新数据


因此,每当当前数据库中发生行插入/更新时,它都会直接反映到副本中。

我不确定自己是否完全理解这个问题,但我会尽力帮助:

第一个与@Sunit相反-我建议避免触发器。触发器会带来额外的开销并影响性能。 我会使用的解决方案,实际上我在我的一些有类似需求的项目中使用过——根本不使用DELETE。相反,您可以添加名为Deleted的位布尔列,将其默认值设置为0 false,并将此字段更新为1 true,而不是删除行。您还需要更改您的其他查询选择,以包括WHERE Deleted=0之类的内容。 另一个选项是继续像往常一样使用DELETE,并允许从主记录和副本中删除记录,但要配置WAL存档,并将WAL存档存储在某个共享目录中。这将允许您即时恢复,这意味着您将能够在任何时刻(即删除之前)将另一个PostgreSQL实例恢复到集群的状态。这样,您将有一个已删除记录的跟踪,但访问记录的过程相当复杂。根据将来检查已删除记录的频率,可能根本不检查这些记录,只是为了以防万一而保留这些记录,跟踪这种方法也会有所帮助。