Postgres 转储选定的行

Postgres Dump Selected Rows

我有一个数据库,它有一个大部分数据都依赖的中心对象;许多引用 table、一对多连接和多对多连接。我需要根据中央 table 中的 属性 备份所有行,并能够恢复这些行。

用于备份目的。我已将 ON DELETE CASCADE 添加到相关的依赖 table 中。所以我可以简单地擦除所有行

DELETE FROM main_table WHERE attr=1

但我需要能够将与它们关联的所有行和引用恢复到较早的时间点。积分:

因此这是我提出的解决方案,我讨厌它。每个table,属性值:

CREATE TABLE tmp_main_table AS SELECT * FROM main_table WHERE attr=val;
CREATE TABLE tmp_table_1 AS SELECT * FROM table_1 WHERE main_table_id IN (SELECT id FROM main_Table WHERE attr=val);
...

然后pg_dump -t tmp_main_table -t tmp_table_1 ...

恢复将需要将行重新插入到那些 table 中。我可以完全控制数据库,所以我可以确定引用 table ides 保持不变,但它看起来非常脆弱。有没有更好的方法?

编辑:更多详细信息

我们 运行 一堆商业网站,客户通过 API 更新他们的库存。然而,经常会发生客户API的电话是错误的,他们好几天都没有注意到。在这种情况下,他们会打电话给我们,要求将他们的库存恢复到以前的状态。我们需要能够按客户定期拍摄数据快照,以便快速恢复。这是一个简单的示例数据库来说明,在下面的示例中,我只需要通过 customer_id 备份 product 中的行,以便在以后恢复,当我恢复时,我希望其他行保持不变并且只有属于该特定 customer_id 的行已恢复:

CREATE TABLE customer (
    id SERIAL PRIMARY KEY,
    name TEXT
);

CREATE TABLE color (
    id SERIAL PRIMARY KEY,
    name TEXT
);

CREATE TABLE flag (
    id SERIAL PRIMARY KEY,
    name TEXT
);

CREATE TABLE product (
    id SERIAL PRIMARY KEY,
    name TEXT,
    color_id INTEGER, -- foreign key to color(id)
    customer_id INTEGER -- foreign key to customer(id)
);

CREATE TABLE product_flag_join (
   id SERIAL PRIMARY KEY,
   product_id INTEGER, -- foreign key to product(id)
   flag_id -- foreign key to flag(id)
);

使用 table partitioning 似乎是一个很好的解决方案。它需要大量的准备工作,但在备份和恢复数据方面提供了极大的便利。每个客户在所有包含客户特定数据的表中都应该有自己的分区,因此您可以使用一个命令(最好是二进制格式)备份整个数据库,并只恢复选定的表。您还可以考虑在单独的架构中创建客户端分区,并在需要时恢复整个架构。

如果由于某种原因上述不可能,我会想到以下架构:

  • 在本地机器上安装救援 Postgres 服务器
  • 对整个数据库执行每日二进制备份
  • 在需要时将所需日期的备份恢复到救援服务器
  • 通过查询救援服务器生成 SQL 转储
  • 将 SQL 转储恢复到主服务器