rdb*_*oob 2 postgresql delete archive
目前,我们的数据库服务器中有一个大约有 20 列(其中一列是 timestamptz 数据类型)的表,该表有 8.34 亿行。就大小而言,这是一个很大的表(大约 250GB(包括索引等)。
我想找到最有效和最好的方法来删除超过 2 年的旧数据,但如果我们需要它用于报告目的,也可以定期保留这些数据,该表也有 FK 约束。
处理这个问题的最佳方法是什么?我们希望能够在需要时查看这些数据。可能位于也可能不在同一服务器上。
最好首先运行选择数据的 COPY
COPY (SELECT * FROM TABLENAME WHERE CAST((timecreated_on AT TIME ZONE 'GMT') AS date) > DATE '2020-01-01 00:00:01') TO '/path/to/a/dump/file';
Run Code Online (Sandbox Code Playgroud)
那么删除表中的数据呢?
DELETE FROM TABLENAME where CAST((timecreated_on AT TIME ZONE 'GMT') AS date) > DATE '2020-01-01 00:00:01'
Run Code Online (Sandbox Code Playgroud)
我只是在寻找一种方法,这是一个自动化的过程,我可以通过 Linux 服务器上的 cronjob 安排每年之后删除超过 1 年的数据。
知道这可能不是最好的方法,但需要查看如何管理 FK 键约束,我是否会删除它们并重新应用,这可能会导致数据完整性问题?
任何帮助深表感谢。
任何DELETE从数据库表中删除大量行的解决方案都是痛苦的。你最终总会做一些类似于 的事情WITH d AS (DELETE ... RETURNING ...) INSERT INTO ... SELECT * FROM d,这需要很长时间,需要长时间的 autovacuum 运行,并使表变得臃肿。
解决这个问题的王道就是使用分区。然后,您立即运行ALTER TABLE ... DETACH PARTITION ...以删除数据,但保留分区及其所有数据,这对于归档或您想要对删除的数据执行的任何操作很有用。
当然,分区要求您在手头有一张令人痛苦的大桌子之前提前计划并开始考虑问题......