AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 49170
In Process
amolkul
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 2 个回答
  • 3937 Views

2 个回答

  • Voted
  1. 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 魔术以更改规则),而其他人只是设置几个月或几年的规则提前并酌情每季度/每年手动执行维护工作。

    • 5
  2. 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 魔术一起使用,以便在删除时重新插入数据过早地。此外,自动删除的审计日志总是一个好主意。

    • 1

相关问题

  • 为海量数据库和许多表优化 PHPMyAdmin 配置

  • 什么是多级数据库?

  • 用于 UNIX 域套接字的 mysqldump

  • 好的数据库初学者书籍?[关闭]

  • 将大型数据集快速批量导入 MySQL

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve