Sql Postgres转储所选行

Sql Postgres转储所选行,sql,postgresql,database-backups,pg-dump,Sql,Postgresql,Database Backups,Pg Dump,我有一个数据库,它有一个大多数数据所依赖的中心对象;多引用表、一对多联接和多对多联接。我需要基于中心表中的属性备份所有行,并能够还原这些行 用于备份目的。我已在删除级联时将添加到相关的从属表中。所以我可以通过简单的 DELETE FROM main_table WHERE attr=1 但是我需要能够将所有与它们相关联的行和引用恢复到较早的时间点。要点: pg_dump不允许基于sql语句的转储 COPY不生成SQL 因此,这就是我提出的解决方案,我讨厌它。对于每个表,属性值: CREAT

我有一个数据库,它有一个大多数数据所依赖的中心对象;多引用表、一对多联接和多对多联接。我需要基于中心表中的属性备份所有行,并能够还原这些行

用于备份目的。我已在删除级联时将
添加到相关的从属表中。所以我可以通过简单的

DELETE FROM main_table WHERE attr=1
但是我需要能够将所有与它们相关联的行和引用恢复到较早的时间点。要点:

  • pg_dump
    不允许基于sql语句的转储
  • COPY
    不生成SQL
因此,这就是我提出的解决方案,我讨厌它。对于每个表,属性值:

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\u dump-t tmp\u main\u table-t tmp\u table\u 1…

然后,恢复将需要将行重新插入这些表中。我可以完全控制数据库,因此我可以确保引用表IDE保持不变,但这一切看起来都非常脆弱。有更好的办法吗

编辑:更多详细信息

我们运行了一系列商业网站,客户通过API更新他们的库存。然而,经常发生的情况是,客户的API调用是错误的,他们好几天都没有注意到。在这种情况下,他们会打电话给我们,要求将库存恢复到以前的状态。我们需要能够按客户定期拍摄数据快照,以便快速恢复。这里有一个简单的示例DB来说明,在下面的示例中,我需要通过
customer\u id
仅备份
product
中的行,以便在以后恢复,当我恢复时,我希望其他行不受影响,只恢复属于特定
customer\u 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)
);
使用似乎是一个很好的解决方案。它需要大量的准备工作,但在备份和恢复数据时却非常方便。每个客户在包含特定于客户的数据的所有表中都应该有自己的分区,因此您可以使用一个命令(最好是二进制格式)备份整个数据库,并仅恢复选定的表。您还可以考虑在单独的架构中创建客户端分区,并在需要时还原整个架构。

如果出于某种原因,上述情况不可能实现,我会考虑以下模式:

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

您可以查询
信息\u架构
视图,在
main\u表
中查找所有带有外键的表,然后构造并运行动态SQL以转储每个表的选定行。数据库结构是已知的和静态的,因此我有相关的表,这更多的是一个高效备份/恢复的问题实际的用例是什么?@Steve I添加了更多细节和一个示例(简化)数据模型。希望这有帮助。我真的很高兴。我真的很喜欢这个主意。但是,每个客户机在所有表中都应该有自己的分区。要使用上面概述的模式,表
flag
color
是否应该有自己的分区?我想只做带有
customer\u id
的表是合适的,所以目前我有大约3000个客户。这看起来太多了。有一些分区性能增强,包括在具有数千个分区的表上提高查询性能,。。。我会在你的情况下试试。另请参阅更新后的答案和替代解决方案。因此我选择了10.1,但我发现目前只有40个客户有产品。我将按
customer\u id
进行分区,并在插入
product
时触发,以在
customer
实际拥有产品时创建分区表。如果我们有多达3000名客户,我将在那时实施共享。谢谢你的帮助