我有一个数据库,该数据库具有大多数数据所依赖的中心对象。多参考表,一对多联接和多对多联接。我需要基于中央表中的属性备份所有行,并能够还原这些行。
出于备份目的。我已将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)
);
答案 0 :(得分:1)
使用table partitioning似乎是一个很好的解决方案。它需要进行大量准备工作,但在备份和还原数据时会非常舒适。每个客户在包含特定于客户的数据的所有表中都应该有自己的分区,因此您可以使用一个命令(最好以二进制格式)备份整个数据库,并且仅还原选定的表。您还可以考虑在单独的架构中创建客户端分区,并在需要时还原整个架构。
如果出于某种原因上述操作无法实现,我会考虑以下方案: