amolkul Asked: 2009-08-03 23:13:02 +0800 CST2009-08-03 23:13:02 +0800 CST 2009-08-03 23:13:02 +0800 CST 如何安全地旋转 postgresql 表? 772 我有一个增长相当大的 pgsql 表。我想使用 cron 作业来轮换它 - 数据仅用于生成报告,一两周后,它不是必需的。 database 2 个回答 Voted James F 2009-08-04T00:29:41+08:002009-08-04T00:29:41+08:00 正确的方法是设置表分区。 http://www.postgresql.org/docs/8.2/static/ddl-partitioning.html 您在列上建立检查约束,然后使用由该检查驱动的规则将插入父表的行定向到几个子表之一。在您的情况下,我建议每周进行分区。如果您想让用户查询单个分区,您只需按逻辑命名分区 - 例如 2009_week_32 或 2009_august_week_1 并让他们针对正确的表发出查询。 如果您希望他们一起查询多个表,您可以设置一个跨多个表执行联合选择的视图,然后用户查询该视图。 当您想要删除不再需要的数据时,您只需更改表以更改规则并删除包含旧数据的表。 这比 disabledleopard 的回答要多一些工作,但该技术在其他数据库引擎中相当普遍。仅在时间戳列上使用“删除位置”的缺点是在大型表上可能需要很长时间,并且数据会写入日志。Truncate 旨在解决期刊写作问题,但您不能指定 where 子句。删除表非常快,因为您不处理单个行。 您需要进行某种维护来设置规则以涵盖未来的日期。有些人每月编写脚本(只需在月底前 5 天检查下个月的分区是否存在,如果不创建并执行 alter table 魔术以更改规则),而其他人只是设置几个月或几年的规则提前并酌情每季度/每年手动执行维护工作。 DisabledLeopard 2009-08-04T00:19:46+08:002009-08-04T00:19:46+08:00 我的想法是更改此表的架构以记录插入数据的时间戳。 ALTER TABLE blah ADD COLUMN entry_time timestamp DEFAULT current_timestamp; 这样,当前创建表的内容不需要更改。 那么你的 cron 可能只是这个命令(应该与 postgres 8.x 一起使用,但我没有运行服务器来确认抱歉) psql -c "DELETE FROM blah WHERE entry_time < (current_timestamp - interval '14 days') RETURNING *;" > deletelog.$( date "+%Y%m%d").log 编辑:我忘了提到“返回 *”位使 psql 返回所有已删除行的完整详细信息以及通常的“已删除 N 行”,因此该日志可以与一些 awk 魔术一起使用,以便在删除时重新插入数据过早地。此外,自动删除的审计日志总是一个好主意。
正确的方法是设置表分区。
http://www.postgresql.org/docs/8.2/static/ddl-partitioning.html
您在列上建立检查约束,然后使用由该检查驱动的规则将插入父表的行定向到几个子表之一。在您的情况下,我建议每周进行分区。如果您想让用户查询单个分区,您只需按逻辑命名分区 - 例如 2009_week_32 或 2009_august_week_1 并让他们针对正确的表发出查询。
如果您希望他们一起查询多个表,您可以设置一个跨多个表执行联合选择的视图,然后用户查询该视图。
当您想要删除不再需要的数据时,您只需更改表以更改规则并删除包含旧数据的表。
这比 disabledleopard 的回答要多一些工作,但该技术在其他数据库引擎中相当普遍。仅在时间戳列上使用“删除位置”的缺点是在大型表上可能需要很长时间,并且数据会写入日志。Truncate 旨在解决期刊写作问题,但您不能指定 where 子句。删除表非常快,因为您不处理单个行。
您需要进行某种维护来设置规则以涵盖未来的日期。有些人每月编写脚本(只需在月底前 5 天检查下个月的分区是否存在,如果不创建并执行 alter table 魔术以更改规则),而其他人只是设置几个月或几年的规则提前并酌情每季度/每年手动执行维护工作。
我的想法是更改此表的架构以记录插入数据的时间戳。
这样,当前创建表的内容不需要更改。
那么你的 cron 可能只是这个命令(应该与 postgres 8.x 一起使用,但我没有运行服务器来确认抱歉)
编辑:我忘了提到“返回 *”位使 psql 返回所有已删除行的完整详细信息以及通常的“已删除 N 行”,因此该日志可以与一些 awk 魔术一起使用,以便在删除时重新插入数据过早地。此外,自动删除的审计日志总是一个好主意。