postgresql 中的数据库丢失行,如何用备份副本填充丢失的行?

Lor*_*xus 2 postgresql pgadmin postgresql-9.4 django

我有一个大问题,我对 postgresql 不太好,因为我使用 Django 进行查询,而且我只有 sql 查询的基础知识。

我的问题是有一个问题,超级用户删除了一个与我的表“客户”相关的字段(我不知道她是怎么做的,我没有设计系统,我只是管理它),所以有 120 个客户端从表中消失了,我从昨天开始备份(我知道备份有多重要),我想将所有数据从我的备份“复制”到缺少行的数据库中。

我试图只从 pgadmin 恢复表(简单的方法),但它说“重复键值违反了唯一约束“user_client_pkey”,详细信息:Key(id) = 461 已经存在。所以我猜我无法恢复,因为有与确切 id 匹配的值,是否有任何简单的方法(或程序)可以复制丢失的行,只提供 id 并填充我备份中的数据?

类似于比较行,如果没有具有该 id 的行,则在那里插入数据?我知道这不是一个简单的查询,但任何帮助都会很棒。我确定最简单的方法是回滚、删除数据库和恢复,但是有这么多表有更多信息,客户端是唯一真正需要恢复的。

我尝试创建一个新表并从备份中恢复数据但它没有填充(可能是因为它的名称与新表不匹配),我还更改了缺少行的表的名称,然后创建一个新表并从备份中恢复,但 pk 丢失了,我收到此错误:

我更改了表cliente的原始表,然后创建了一个新表并将其命名为原始表,恢复数据库,它填满了,但给了我这个错误:

由于表 public."admin_clienteB" 没有主键或 OID,您只能查看数据。没有主键的“编辑数据”工具无法插入新行和更改现有行。

任何帮助都会很棒。

Eze*_*nay 5

您可以将所有受影响的表恢复到不同的模式,有多种方法可以做到这一点(/sf/ask/293415741/ 中的几个好主意-具有不同模式的数据库)。

一旦表处于单独的模式中,您可以通过主键比较它们,并插入缺失的,就像对每个受影响的表一样:

INSERT INTO production.table
SELECT b.*
FROM backup.table b
LEFT JOIN production.table p ON (p.pkey = b.pkey)
WHERE p.pkey IS NULL;
Run Code Online (Sandbox Code Playgroud)

您只需要找出受影响表的列表,在单独的模式中恢复它们的备份,确定它们的主键是什么,使用插入创建脚本,然后运行它。