在Postgresql中存档旧数据

时间:2019-07-11 09:22:31

标签: postgresql archiving

我目前希望有人建议我进行数据库归档的过程。

我有一个数据库(DB-1),它有2个非常大的表,一个表有25 GB的数据,另一个表有20 GB的数据。即使我有索引,这也会导致主要的性能问题。

因此,我们考虑通过以下过程将旧数据存档

  1. 从现有数据库(DB-1)克隆一个新数据库(DB-2)。
  2. 删除DB-1中的旧数据,因此只有最近2年的记录。如果我需要旧数据,可以连接DB-2。
  3. 每个月应将旧数据从DB-1移至DB-2,并从DB-1中删除移出的行。

2 个答案:

答案 0 :(得分:2)

那是错误的方法。

您要寻找的是partitioning

您可以创建一个范围为每个一年的范围分区。要删除旧数据,您需要做的就是删除不再需要的年份的分区。

如果出于某些原因需要保留数据,也可以仅将分区与表分离。然后,数据仍在“四处散布”,但不会显示在(分区的)表中。您可以直接查询(分离的)分区以访问该数据。您甚至可以将该(分离的)分区移动到速度较慢的硬盘上,以释放快速磁盘上的空间(如果有多个磁盘)。

但是您甚至可能会发现,单独进行分区可能已经提高了性能,但这在很大程度上取决于您的查询。

请注意,您应该为此使用Postgres 11,因为在旧版本中分区并不那么复杂。

答案 1 :(得分:0)

尽管您无疑应该升级当前版本(我建议您从正在使用的EDB系统中移出,转而使用基于社区的Postgres 11),即使您不能升级,分区仍然是一个很大的过程。比创建第二个数据库更好的答案。

通过将表重新创建为同一数据库中的一组分区,您将能够以更加简洁的方式添加/删除数据,这将使使用Vacuums变得更加容易。即使在9.5中,您也可以利用表继承来构建分区,方法是先为传入数据添加分区,然后以各种间隔(可能是每月一次,因为要运行每月清理)创建分区,然后将数据移入这些分区。这可以通过一系列INSERT INTO partition SELECT * FROM table WHERE <timestamp>样式语句自动完成。

我怀疑您可能可以自己进行管理(您需要基本的sql以及编写简单的触发器/函数的功能...这是9.5 docs的链接),但是如果您需要帮助,可以参与与Postgres聊天社区之一联系,或者如果您想深入了解,请与支持公司联系。