想象在一个共享数据库上有多个客户(例如),并且需要一个备份系统,以便可以回滚单个客户而不影响其他客户。- 客户自己是否可以下令回滚或只有某种管理员可以下令并不重要,但出于多种原因,为每个客户拥有一个数据库不是一种选择。
编辑:会有一个客户表,但客户的数据将分布在许多表中。也许是因为客户可以添加只有他们可以访问的东西。\编辑
怎样才能最好地做到这一点?
我考虑了以下选项(不介意顺序):
#1 定期进行数据库备份并建立一种机制,清除所有相关表中的所有相关行,然后从备份文件中读取客户数据并将其插入数据库。随着数据库的变化,必须维护这种机制。
#2 为每个相关表制作一个影子表。所需的机制与#1 基本相同,但不需要从外部备份文件中读取。随着数据库的变化,必须维护机制和影子表。如果客户需要能够自主订购回滚,这将比 #1 更好。
我缺少任何选项吗?有什么我应该注意的吗?最重要的是:做这种事情的任何最佳实践?
我正在使用 PostgreSQL,以防万一包含任何可以提供帮助的东西。
模仿PostgreSQL的事务系统:
每个受影响的表都有一个列
visible_from
和visible_to
类型timestamp with time zone
。当您更新或删除表时,将
visible_to
旧版本的行设置为当前时间戳,而不是实际更新或删除它。当您更新或插入表时,添加一个
visible_from
设置为当前时间戳的新行。通过这种方式,您可以确定表格在任何给定时间点的状态。回滚现在是删除一些行并清除
visible_to
其他行的问题。作业会定期删除
visible_to
超过某个宽限期的数据。