Postgres转储选定的行

时间:2019-10-22 02:44:49

标签: sql postgresql database-backups pg-dump

我有一个数据库,该数据库具有大多数数据所依赖的中心对象。多参考表,一对多联接和多对多联接。我需要基于中央表中的属性备份所有行,并能够还原这些行。

出于备份目的。我已将ON DELETE CASCADE添加到相关的从属表中。所以我可以通过

擦除所有行
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_dump -t tmp_main_table -t tmp_table_1 ...

然后还原将需要将行重新插入到那些表中。我对数据库具有完全控制权,因此可以确定引用表的ide保持不变,但是看起来都很脆弱。有更好的方法吗?

编辑:更多详细信息

我们经营着许多商业网站,客户通过API更新其库存。但是,经常会发生客户的API调用错误并且他们几天都没有注意到它的情况。在这种情况下,他们会给我们打电话,并要求将其库存恢复到以前的状态。我们需要能够由客户定期拍摄数据快照以进行快速还原。这是一个简单的示例数据库,在下面的示例中,我只需要备份product中的customer_id中的行,以便以后进行恢复,而当我恢复时,我希望其他行保留不变并且仅还原属于该特定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)
);

1 个答案:

答案 0 :(得分:1)

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

如果出于某种原因上述操作无法实现,我会考虑以下方案:

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