postgresql 表数据移动

Posted

技术标签:

【中文标题】postgresql 表数据移动【英文标题】:postgresql table data movement 【发布时间】:2017-06-12 07:07:47 【问题描述】:

在 PostgreSQL 中,我想创建一个脚本,该脚本可以从 A 表(包含许多行)中删除 1 个月之前的旧数据并将这些数据插入到一个新的别名表中。我想每个月都执行这个脚本。

为此,我将脚本创建为

insert into B select * from A where date >(now-'30 day'::interval);
delete from A where date <(now()-'30 days.

但是在某些月份有 30 天和一些 31 天。所以我如何在 cron 选项卡中设置它以删除确切的数据并在别名表中移动。

【问题讨论】:

不相关,但您可以通过使用可写 CTE 避免两次列出相同的条件:with deleted as (delete from a where ...) insert into b select * from deleted; 【参考方案1】:

虽然 Laurenz 的回答很有意义,而且似乎很好地猜测了 OP 真正想要什么(cron 每月可能意味着他想要刷新的不是“超过一个月”,而是“上个月”,所以 date_trunc 到一个月是一个案例)

但以另一种方式回答(据我了解原始帖子):

begin;
    insert into B select * from A where date >(now()-'1 month'::interval);
    delete from A where date <(now()-'1 month'::interval);
end;

不会删除上个月的所有数据,但会删除一个月前的相同时间戳,例如:

t=# select now()-'1 month'::interval;
           ?column?
-------------------------------
 2017-05-12 07:31:31.785402+00
(1 row)

根据这种逻辑,您可能希望每天而不是每月安排此数据清除 - 将上个月的数据保留在活动表中,而不是“最多两个”,直到 cron 触发......

【讨论】:

我想在每个月的 5 个日期在 crontab 中解决这个问题,所以它的查询正确吗? 什么是 1 个月,即 30 天或 31 天 r 需要 6 月 5 日到 7 月 5 日 是的。试试select now() - '4 month'::interval - 它给你 2 月 12 日,尽管我们在 2 月有 28 天 我还有一个疑问 有什么疑问?【参考方案2】:

在每个月的第一天运行它并这样写:

... WHERE date >= date_trunc('month', current_timestamp) - INTERVAL '1 month'
      AND date <  date_trunc('month', current_timestamp)

如果您的表包含大量数据,您可能需要研究分区。

【讨论】:

以上是关于postgresql 表数据移动的主要内容,如果未能解决你的问题,请参考以下文章

Postgresql concurrently index 为什么可以在线加索引

postgresql 表数据移动

Postgresq9.6主从部署

PostgreSQL 将数据库存储在哪里?

PostgreSQL 将数据库存储在哪里?

PostgreSQL备机checkpoint