在 PostgreSQL 里如何实现数据的自动清理和过期处理?

news2024/9/23 9:29:16

文章目录

  • 一、使用 `TIMESTAMP` 列和定期任务
  • 二、使用事件触发器(Event Triggers)
  • 三、使用分区表(Partitioned Tables)
  • 四、结合存储过程和定时任务
    • 示例场景
    • 实现步骤
    • 测试与验证

美丽的分割线

PostgreSQL


在 PostgreSQL 中,可以通过多种方式实现数据的自动清理和过期处理,以确保数据库不会因为存储过多过时或不再需要的数据而导致性能下降和存储空间浪费。以下是一些常见的方法及详细示例:

美丽的分割线

一、使用 TIMESTAMP 列和定期任务

  1. 创建表时添加 TIMESTAMP 列用于记录数据的创建时间或最后更新时间

假设我们有一个名为 orders 的表,用于存储订单信息,其中包含一个 created_at 列来记录订单创建的时间:

CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    order_amount DECIMAL(10, 2),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
  1. 创建定期任务(例如使用 cron 或操作系统的定时任务)来执行删除过期数据的 SQL 语句

假设我们希望删除创建时间超过 30 天的订单数据,可以编写如下的 SQL 语句:

DELETE FROM orders WHERE created_at < CURRENT_TIMESTAMP - INTERVAL '30 days';

然后,可以使用操作系统的定时任务工具(如 cron 在 Linux 系统中)来定期执行上述 SQL 语句。假设每天凌晨 2 点执行清理任务,cron 表达式可能如下:

0 2 * * * psql -U your_username -d your_database -c "DELETE FROM orders WHERE created_at < CURRENT_TIMESTAMP - INTERVAL '30 days';"

上述方法的优点是简单直接,易于理解和实现。缺点是需要依赖操作系统的定时任务机制,并且可能存在一定的时间延迟,即在到达指定的清理时间点和实际执行清理操作之间可能存在时间差。

美丽的分割线

二、使用事件触发器(Event Triggers)

PostgreSQL 提供了事件触发器的功能,可以在特定的数据库事件(如 INSERTUPDATEDELETE 等)发生时执行自定义的函数。

  1. 首先,创建一个函数来处理数据的过期清理逻辑
CREATE OR REPLACE FUNCTION expire_orders() RETURNS TRIGGER AS
$$
BEGIN
    DELETE FROM orders WHERE created_at < CURRENT_TIMESTAMP - INTERVAL '30 days';
    RETURN NULL;
END;
$$ LANGUAGE plpgsql;
  1. 然后,创建事件触发器
CREATE TRIGGER trigger_expire_orders
AFTER INSERT OR UPDATE ON orders
EXECUTE FUNCTION expire_orders();

这样,每当对 orders 表进行插入或更新操作时,都会触发 expire_orders 函数进行过期数据的清理。

这种方法的优点是实时性较好,数据过期处理能够在相关操作发生时立即进行。缺点是可能会对正常的插入或更新操作带来一定的性能开销,尤其是在数据量较大的情况下。

美丽的分割线

三、使用分区表(Partitioned Tables)

分区表是将一个大表按照某种规则分成多个较小的子表,从而可以更有效地管理和操作数据。

  1. 创建分区表

假设按照月份对订单表进行分区:

CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    order_amount DECIMAL(10, 2),
    created_at TIMESTAMP
) PARTITION BY RANGE (created_at);

CREATE TABLE orders_2023_01 PARTITION OF orders
    FOR VALUES FROM ('2023-01-01 00:00:00') TO ('2023-01-31 23:59:59');

CREATE TABLE orders_2023_02 PARTITION OF orders
    FOR VALUES FROM ('2023-02-01 00:00:00') TO ('2023-02-28 23:59:59');

-- 以此类推创建其他月份的分区表
  1. 定期删除过期的分区

可以通过 DROP TABLE 语句来删除过期的分区,例如每月月初删除上个月的分区:

DROP TABLE orders_2023_01;

分区表的优点是在处理大量数据时性能较好,并且删除过期分区的操作相对简单高效。缺点是创建和管理分区表的过程相对复杂,需要提前规划好分区策略。

美丽的分割线

四、结合存储过程和定时任务

  1. 创建存储过程
CREATE OR REPLACE PROCEDURE clean_expired_data()
LANGUAGE plpgsql
AS $$
BEGIN
    DELETE FROM orders WHERE created_at < CURRENT_TIMESTAMP - INTERVAL '30 days';
END;
$$;
  1. 使用定时任务调用存储过程

与前面提到的使用定时任务执行 SQL 语句类似,只是这里改为调用存储过程:

0 2 * * * psql -U your_username -d your_database -c "CALL clean_expired_data();"

这种方法结合了存储过程的封装性和定时任务的灵活性,便于维护和管理复杂的清理逻辑。

下面通过一个综合示例来展示如何在实际应用中使用以上方法的组合:

示例场景

假设我们有一个用户活动日志表 user_activity_log,用于记录用户在系统中的各种操作,包括操作时间 activity_time 和操作详情 activity_details。我们希望定期清理超过 90 天的活动日志。

实现步骤

  1. 创建表
CREATE TABLE user_activity_log (
    log_id SERIAL PRIMARY KEY,
    user_id INT,
    activity_details TEXT,
    activity_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
  1. 创建清理数据的存储过程
CREATE OR REPLACE PROCEDURE clean_expired_activity_logs()
LANGUAGE plpgsql
AS $$
BEGIN
    DELETE FROM user_activity_log WHERE activity_time < CURRENT_TIMESTAMP - INTERVAL '90 days';
END;
$$;
  1. 设置操作系统定时任务
    假设使用 Linux 的 cron 服务,每天凌晨 1 点执行清理任务:
0 1 * * * psql -U your_username -d your_database -c "CALL clean_expired_activity_logs();"

测试与验证

在实际运行一段时间后,可以通过查询表中的数据来验证清理操作是否按照预期进行:

SELECT * FROM user_activity_log;

检查是否只有最近 90 天内的活动日志存在。


美丽的分割线

🎉相关推荐

  • 🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!
  • 📚领书:PostgreSQL 入门到精通.pdf
  • 📙PostgreSQL 中文手册
  • 📘PostgreSQL 技术专栏

PostgreSQL

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1906569.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信商城自定义小程序源码系统,PHP+MySQL组合开发 带完整的源代码包以及搭建教程

系统概述 传统电商模式面临着诸多挑战&#xff0c;如用户体验不够个性化、运营成本较高等。而微信商城小程序凭借其轻量级、便捷性和与微信生态系统的紧密结合&#xff0c;为企业提供了新的发展机遇。小编给大家分享一款功能强大、易于定制和扩展的源码系统&#xff0c;帮助企…

MPC学习资料汇总

模型预测控制MPC学习资料汇总 需要的私信我~ 需要的私信我~ 需要的私信我~ 【01】课件内容 包含本号所有MPC课程的课件&#xff0c;以及相关MATLAB文档。 【02】课件源代码 本号所有MPC课程的源代码。 【03】MPC仿真案例 三个MPC大型仿真案例&#xff1a; 1&#xff09;…

网口--内部有/没有变压器

内部有变压器 可以用万用万用表量出短路&#xff0c;75ohm&#xff0c; 150ohm电阻 网口&#xff1a;双网口&#xff0c; 汉仁 HR916103 内部没有变压器

EDI安全:如何在2024年保护您的数据免受安全和隐私威胁

电子数据交换&#xff08;EDI&#xff09;支持使用标准化格式在组织之间自动交换业务文档。这种数字化转型彻底改变了业务通信&#xff0c;消除了对纸质交易的需求并加速了交易。然而&#xff0c;随着越来越依赖 EDI 来传输发票、采购订单和发货通知等敏感数据&#xff0c;EDI …

谷粒商城学习笔记-18-快速开发-配置测试微服务基本CRUD功能

文章目录 一&#xff0c;product模块整合mybatis-plus1&#xff0c;引入依赖2&#xff0c;product启动类指定mapper所在包3&#xff0c;在配置文件配置数据库连接信息4&#xff0c;在配置文件中配置mapper.xml映射文件信息 二&#xff0c;单元测试1&#xff0c;编写测试代码&am…

举例说明深拷贝和浅拷贝

概述 简单描述一下对象的实例化过程。 创建对象的时候&#xff0c;或者说在实例化对象的时候 Person 类有年龄和学生类 int age 18; Student stu1 new Student(); 比如此时创建一个 age 对象&#xff0c;一个Student 对象&#xff0c;在虚拟机中&#xff0c;会在堆中开一…

AI大模型财务行业落地,金蝶徐少春:未来“人人都是财务人员”

财务管理价值模型从陀螺型向沙漏型转变。 AI使财务人员在计划与控制领域从只靠经验预测转变为精准预测&#xff0c;让财务管理信息从数据专享转变到信息普惠、专家服务从个人精英转变到AI天团、外部报告的重点从财务指标转变到发展能力评价&#xff0c;企业也从传统的‘财务信息…

STM32-旋转编码器和对射式红外传感器

本内容基于江协科技STM32视频内容&#xff0c;整理而得。 文章目录 1. 旋转编码器和对射式红外传感器1.1 旋转编码器1.1.1 旋转编码器简介1.1.2 旋转编码器硬件电路 1.2 对射式红外传感器 2. 库函数及代码2.1 EXTI库函数和NVIC库函数2.2 5-1对射式红外传感器计次2.2.1 硬件电路…

DDP:微软提出动态detection head选择,适配计算资源有限场景 | CVPR 2022

DPP能够对目标检测proposal进行非统一处理&#xff0c;根据proposal选择不同复杂度的算子&#xff0c;加速整体推理过程。从实验结果来看&#xff0c;效果非常不错 来源&#xff1a;晓飞的算法工程笔记 公众号 论文: Should All Proposals be Treated Equally in Object Detect…

HAProxy安装配置详解

HAProxy是一个使用C语言编写的自由及开放源代码软件&#xff0c;其提供高可用性、负载均衡&#xff0c;以及基于TCP和HTTP的应用程序代理。   HAProxy特别适用于那些负载特大的web站点&#xff0c;这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上&#xf…

algorithm算法库学习之——修改序列的操作

algorithm此头文件是算法库的一部分。本篇介绍修改序列的操作函数。 修改序列的操作 copycopy_if (C11) 将某一范围的元素复制到一个新的位置 (函数模板) copy_n (C11) 将一定数目的元素复制到一个新的位置 (函数模板) copy_backward 按从后往前的顺序复制一个范围内的元素 (函…

Java异常详解及自定义异常

认识异常&#xff0c;掌握异常处理主要的5个关键字&#xff1a;throw、try、catch、final、throws并掌握自定义异常 目录 1、异常概念与体系结构 1、1异常的概念 1、2异常体系结构 1、3异常的分类 编译时异常&#xff1a; 运行时异常 &#xff1a; 2、异常处理 2、1防御式…

优思学院|SPC控制图异常点占比可否用来评估过程的稳定程度?

使用SPC控制图异常点占比确实可以评估过程的稳定程度。通常来说&#xff0c;SPC&#xff08;统计过程控制&#xff09;控制图是用于监控和控制生产或业务过程&#xff0c;以确保这些过程在可接受的范围内运行。通过识别和分析控制图中的异常点&#xff0c;可以判断过程是否存在…

服务器本地部署文件服务器minio

minio类似于阿里云的OSS&#xff0c;为不方便把图、文、日志等形式的文件保存在公有云上的&#xff0c;可以在自己的服务器上部署文件服务器 看过本人前几个文章的&#xff0c;使用docker就会很快上手部署&#xff0c;直接上所有代码 #添加镜像 docker search minio docker p…

DAY1: 实习前期准备

文章目录 VS Code安装的插件C/CCMakeGitHub CopilotRemote-SSH 收获 VS Code 下载链接&#xff1a;https://code.visualstudio.com 安装的插件 C/C 是什么&#xff1a;C/C IntelliSense, debugging, and code browsing. 为什么&#xff1a;初步了解如何在VS Code里使用C输出…

使用C Caller 模块集成C代码到Simulink模型

可以使用 C Caller 模块将新的或现有的 C 代码集成到 Simulink 模型中。要在 Simulink 模型中创建自定义模块&#xff0c;C Caller 模块允许您调用在外部源代码和库中指定的外部 C 函数。C Caller 模块具有以下优势&#xff1a; 简单 C 函数的自动集成&#xff0c;包括命名空间…

同声传译的app有哪些?分享5个旅行者的多语言翻译伙伴

许多人可能并不了解什么是同声传译。其实&#xff0c;同声传译是一种高效的语言服务&#xff0c;它使得不同语言的人们能够在会议、谈判、演讲等场合中实现即时交流。 今天&#xff0c;本文将向您介绍几款能够实现同声传译的实用工具&#xff0c;帮助您更深入地了解同声传译的…

做外贸干一行爱一行,还是干一行厌一行?

记得年轻的时候&#xff0c;每每和同龄人不同行业聊天的时候&#xff0c;大家普遍的感觉就是&#xff1a;自己这一行太苦了&#xff0c;以后有孩子了干什么都不能让他做自己这一行。 和在银行上班的同学聊天&#xff0c;他们最大的苦恼是需要每天开发客户&#xff0c; 让客户在…

如何利用股指期货代替买股票?

当我们深入探讨中金所上市的三个股指期货——IF&#xff08;沪深300股指期货&#xff09;、IC&#xff08;中证500股指期货&#xff09;和IH&#xff08;中证50股指期货&#xff09;时&#xff0c;我们可以从多个角度来分析它们的特点和优势。 市场特点分析 IH&#xff08;上…

科研绘图系列:R语言径向柱状图(Radial Bar Chart)

介绍 径向柱状图(Radial Bar Chart),又称为雷达图或蜘蛛网图(Spider Chart),是一种在极坐标系中绘制的柱状图。这种图表的特点是将数据点沿着一个或多个从中心向外延伸的轴来展示,这些轴通常围绕着一个中心点均匀分布。 特点: 极坐标系统:数据点不是在直角坐标系中展…