2017-02-20 122 views
0

我正在使用PostgreSQL。我需要从数据库中删除所有事务数据(最近三个月的事务数据除外),然后将数据恢复到新数据库,同时创建/更新时间戳记更新为现在的时间戳记。另外,过去三个月的更多数据必须重新存入一个数据(例如,甲方的所有发票必须与甲方一起分组为一张发票)。其他规则是,如果数据仍然是过去三个月数据引用的外键,那么数据不能被删除,只能将创建/更新的时间戳更改为现在的时间戳。如何有效保存和恢复过去三个月的数据并删除旧数据?

我不是在SQL查询好,所以现在我使用这个策略:

  1. 首先创建概括数据之前删除(所有数据)(在其他临时表保存)。
  2. 然后删除除最近三个月以外的所有数据。
  3. 接下来在删除后创建回顾数据。
  4. 从(所有数据 - 删除数据后)创建回顾数据,所以我得到的回顾数据的名义与过去三个月前的数据完全相同。
  5. 然后将回顾数据插入表格。所以旧数据是干净的+有数据库中的数据。

所以我的策略是只使用相同的数据库,而不是创建新的数据库,因为使用该程序导入数据的进程非常缓慢(因为有900 ++表)。

但客户端不希望使用此策略,因为他希望数据在新数据库中创建并告诉我使用其他方式。所以问题是:从某些日期清理数据库(使用日期过滤)并回顾旧数据的真实且正确的过程是什么?

回答

1

首先,除非您使用时间戳列追踪行,否则无法确定行何时添加到表中。

这是第一次更改,您必须将时间戳列添加到所有相关列中,以跟踪行的创建时间(或更新时间,取决于需求)。通过时间戳列

  • Partition表,让你有(例如)每月一个分区:

    这时你有两种选择。
    优点:很容易摆脱旧的数据:只需放下分区即可。
    缺点:在PostgreSQL中分区是棘手的。它会变得有些easier to handle in PostgreSQL v10,但潜在的问题依然存在。

  • 使用质量DELETE s摆脱旧行。这很容易实现,但大规模删除真的受到伤害(表和索引膨胀可能需要VACUUM (FULL)REINDEX,这会削弱可用性)。

+0

我已经在所有表格中创建并更新了时间戳列。 – Sky