如何高效删除 MySQL 日志表中的历史数据?实战指南

        在处理高并发的物联网平台或者其他日志密集型应用时,数据库中的日志表往往会迅速增长,数据量庞大到数百GB甚至更高,严重影响数据库性能。如何有效管理这些庞大的日志数据,特别是在不影响在线业务的情况下,成为了一项技术难题。本文将分享如何高效删除MySQL日志表中的历史数据,并且按月分区管理日志,以提升数据库的读写性能。

一 问题背景:300GB 日志表如何清理?

        国庆假期节前检查数据库,发现正在维护一张名为 ali_iot_log 的设备日志表,数据量已经膨胀到380GB,表中的历史数据占据了大量存储,并且严重拖慢了查询和插入的速度。为了优化性能,目标是删除只保留最近3个月的数据。

设备日记表占用385G,如下图:

在MySQL 5.7中,如果这张表没有分区,直接使用delete条件删除历史数据会耗时很较长,并且可能会锁表,影响在线系统的使用。也不能直接清空表,业务系统要求保留最近几个月的数据。那么,如何快速高效地清理数据,并为后续的日志管理奠定基础呢?

二 常用的方案有哪些?

方案一:表分区(推荐)

步骤:

  1. 确认表的结构和时间字段: 确保日记表中有一个用于时间的字段(例如created_atdate),这是进行分区的基础。

  2. 备份数据: 在进行任何结构性更改之前,务必备份当前表以防止数据丢失。

    mysqldump -u username -p your_database diary_table > diary_table_backup.sql
  3. 添加分区: 使用按月分区的方法。假设时间字段为created_at,可以使用以下SQL语句为表添加分区:

    ALTER TABLE diary_table PARTITION BY RANGE (TO_DAYS(created_at)) ( PARTITION p0 VALUES LESS THAN (TO_DAYS('2024-01-01')), PARTITION p1 VALUES LESS THAN (TO_DAYS('2024-02-01')), PARTITION p2 VALUES LESS THAN (TO_DAYS('2024-03-01')), ... PARTITION pN VALUES LESS THAN MAXVALUE );

    注意:为每个月创建一个分区。可以根据具体需要调整分区策略。

  4. 删除旧分区: 一旦表被分区,可以通过丢弃早期的分区来快速删除大量数据,而无需逐行删除。

    ALTER TABLE diary_table DROP PARTITION p0, p1, p2, ..., pM;

    其中,p0pM代表要删除的旧月份分区。

优点:

  • 高效:分区操作是元数据级别的,速度非常快。
  • 维护简单:通过分区可以更方便地管理和查询数据。

缺点:

  • 预先规划:如果表未分区,初次分区可能需要时间和资源。
  • 复杂性增加:需要持续关注,在数据持续增长时,要为以后的时间节点手工增加分区。

方案二:创建新表并交换(适用已存有大量数据)

如果表当前未分区,且无法立即进行分区,可以考虑以下步骤:

步骤:

  1. 创建新表: 创建一个新的日记表,结构与原表相同,建议在创建时添加适当的索引以提高插入效率。

    CREATE TABLE diary_table_new LIKE diary_table;
  2. 插入需要保留的数据: 将最近一个月的数据插入新表。可以使用INSERT INTO ... SELECT语句。

    INSERT INTO diary_table_new SELECT * FROM diary_table WHERE created_at >= DATE_SUB(NOW(), INTERVAL 1 MONTH);

    注意:此步骤可能需要一些时间,具体取决于数据量和服务器性能。

  3. 重命名表: 为确保操作的原子性,使用RENAME TABLE进行表交换。

    RENAME TABLE diary_table TO diary_table_old, diary_table_new TO diary_table;
  4. 删除旧表: 确认新表数据无误后,删除旧表以释放空间。

    DROP TABLE diary_table_old;

优点:

  • 较快:相比逐行删除,创建新表并插入所需数据更快。
  • 简单:操作步骤相对简单,易于执行。

缺点:

  • 需要双倍存储空间:需要额外的存储空间来容纳新表。
  • 短时间内锁定:在重命名表期间,可能会有短暂的表锁定,影响应用程序。

方案三:分批删除数据(定时任务实现)

如果上述方法不可行,可以考虑分批删除数据,以减少对数据库性能的影响。

步骤:

  1. 确定删除的时间范围: 例如,删除超过一个月的数据。

  2. 分批执行删除操作: 使用DELETE语句配合LIMIT,逐步删除数据。

    DELETE FROM diary_table WHERE created_at < DATE_SUB(NOW(), INTERVAL 1 MONTH) LIMIT 100000;

    重复执行上述语句,直到满足删除条件。

  3. 优化删除过程:

    • 禁用二级索引(如果适用):在删除前暂时禁用非必要的索引可以提高删除速度,删除后再重建索引。
    • 监控事务日志大小:确保删除过程不会导致事务日志过大。

优点:

  • 控制删除速度:避免一次性大量删除导致的性能问题。
  • 灵活性:可以根据服务器负载调整删除批次大小和频率。

缺点:

  • 耗时较长:相比直接删除,分批删除可能需要更长的时间完成全部删除操作。
  • 复杂性增加:需要编写脚本或程序来自动化批量删除过程。

三 在线实战操作

        当前状态不可能影在线业务,由于日志表主要是开发与运维查询问题时查看,只要保证数据不丢失即可,所以这里使用创建新表分区表比较合适。这个方案可以做到清理旧数据并保持系统稳定。

操作步骤:

1 创建分区表并迁移数据

        如果你的原始日志表还没有分区,可以通过创建新表的方式实现按月分区。创建新表时,我们可以设计好分区结构,然后将旧表中的数据迁移到新表中。

-- 创建与原来结构一样的新表
CREATE TABLE ali_iot_log_n LIKE ali_iot_log;

 创建表 如下图:


-- 为新表分区(按月份)ALTER TABLE ali_iot_log_n
PARTITION BY RANGE (TO_DAYS(ctime)) (PARTITION p0 VALUES LESS THAN (TO_DAYS('2024-01-01')),PARTITION p1 VALUES LESS THAN (TO_DAYS('2024-02-01')),PARTITION p2 VALUES LESS THAN (TO_DAYS('2024-03-01')),PARTITION p3 VALUES LESS THAN (TO_DAYS('2024-04-01')),PARTITION p4 VALUES LESS THAN (TO_DAYS('2024-05-01')),PARTITION p5 VALUES LESS THAN (TO_DAYS('2024-06-01')),PARTITION p6 VALUES LESS THAN (TO_DAYS('2024-07-01')),PARTITION p7 VALUES LESS THAN (TO_DAYS('2024-08-01')),PARTITION p8 VALUES LESS THAN (TO_DAYS('2024-09-01')),PARTITION p9 VALUES LESS THAN (TO_DAYS('2024-10-01')),PARTITION p10 VALUES LESS THAN (TO_DAYS('2024-11-01')),PARTITION p11 VALUES LESS THAN (TO_DAYS('2024-12-01')),PARTITION pp0 VALUES LESS THAN (TO_DAYS('2025-01-01')),PARTITION pp1 VALUES LESS THAN (TO_DAYS('2025-02-01')),PARTITION pp2 VALUES LESS THAN (TO_DAYS('2025-03-01')),PARTITION pp3 VALUES LESS THAN (TO_DAYS('2025-04-01')),PARTITION pp4 VALUES LESS THAN (TO_DAYS('2025-05-01')),PARTITION pp5 VALUES LESS THAN (TO_DAYS('2025-06-01')),PARTITION pp6 VALUES LESS THAN (TO_DAYS('2025-07-01')),PARTITION pp7 VALUES LESS THAN (TO_DAYS('2025-08-01')),PARTITION pp8 VALUES LESS THAN (TO_DAYS('2025-09-01')),PARTITION pp9 VALUES LESS THAN (TO_DAYS('2025-10-01')),PARTITION pp10 VALUES LESS THAN (TO_DAYS('2025-11-01')),PARTITION pp11 VALUES LESS THAN (TO_DAYS('2025-12-01')),PARTITION pN VALUES LESS THAN MAXVALUE
);

为表创建分区如下图:

2 旧表数据插入新表(重要

   然后将旧表中的需要保留的数据插入新表,这里一定要注意性能,查询条件尽量小批量进行,:

INSERT INTO ali_iot_log_n SELECT * FROM ali_iot_log WHERE ctime BETWEEN '2024-09-01 00:00:00' AND '2024-09-10 23:59:59';

我这边线上环境保存到数据库是使用队列,负责消费的处理保存的可以停下,数据都放在队列先,后面启动会继续使用,所以下面以条件10天数据量大概1亿条数据转存数据到新表,如下图:

每次迁移1亿条数据,分三次即可以1个月数据了,如果线上不间断运行保存就要考虑把最后某个时间点的数据不迁移先(可以改完表后再迁移) 。

3 重命名表,快速切换到新表

 确认数据迁移完成,可以通过以下SQL实现旧表与新表的快速切换:

RENAME TABLE ali_iot_log TO ali_iot_log_old, ali_iot_log_n TO ali_iot_log;

 该操作是原子性的,几乎不会影响业务的连续性,因为RENAME TABLE 是元数据操作,时间消耗极少,但是数据多的情况下还是需要几分钟时间,这里涉及30亿条数据量,如下图:

如果之前还有未迁完数据,迁完旧表即可。

迁移完后检查数据,确认没问题直接清空旧表即可

TRUNCATE TABLE ali_iot_log_old

4 定期删除旧分区数据

通过分区表管理日志后,删除旧数据变得非常简单。可以按月删除不再需要的分区,以释放存储空间。

比如删除1个月的数据,指定数据所在的分区即可:

ALTER TABLE ali_iot_log DROP PARTITION p0;

这比直接删除数据要高效得多,因为它只需要在元数据层面进行操作,避免了全表扫描和锁定。

操作建议

  1. 分批迁移数据
    对于大型表的数据迁移操作,建议分批进行。可以通过LIMIT关键字对数据进行分块插入,避免对数据库造成过大的压力。

  2. 选择低峰时段进行操作
    大规模数据操作对性能有一定影响,建议在业务低峰时段进行操作,以最小化对用户的影响。

  3. 备份重要数据
    在执行重大操作之前,建议对数据库进行备份。即便是删除旧数据或重命名表这样看似简单的操作,也应当做好应急恢复的准备。

四 总结

通过分区表的管理,可以极大提升MySQL在处理大规模日志表时的性能,特别是按时间维度划分分区后,数据的清理和查询将更加高效。结合重命名表和按月分区的方式,我们可以轻松应对日志表膨胀的问题,而不会对在线业务造成严重影响。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Windows远程桌面连接Linux

要在Kali Linux上使用Windows远程桌面连接&#xff08;MSTSC.exe&#xff09;&#xff0c;你可以通过配置xrdp服务来实现。以下是在Kali Linux上设置xrdp以便Windows远程桌面连接的具体步骤&#xff1a; 一、安装xrdp和Xfce桌面环境 更新软件包列表&#xff1a; 打开终端&…

Python和C++混淆矩阵地理学医学物理学视觉语言模型和算法模型评估工具

&#x1f3af;要点 优化损失函数评估指标海岸线检测算法评估遥感视觉表征和文本增强乳腺癌预测模型算法液体中闪烁光和切伦科夫光分离多标签分类任务性能评估有向无环图、多路径标记和非强制叶节点预测二元分类评估特征归因可信性评估马修斯相关系数对比其他准确度 Python桑…

基于C++和Python的进程线程CPU使用率监控工具

文章目录 0. 概述1. 数据可视化示例2. 设计思路2.1 系统架构2.2 设计优势 3. 流程图3.1 C录制程序3.2 Python解析脚本 4. 数据结构说明4.1 CpuUsageData 结构体 5. C录制代码解析5.1 主要模块5.2 关键函数5.2.1 CpuUsageMonitor::Run()5.2.2 CpuUsageMonitor::ComputeCpuUsage(…

大数据技术:Hadoop、Spark与Flink的框架演进

大数据技术&#xff0c;特别是Hadoop、Spark与Flink的框架演进&#xff0c;是过去二十年中信息技术领域最引人注目的发展之一。这些技术不仅改变了数据处理的方式&#xff0c;而且还推动了对数据驱动决策和智能化的需求。在大数据处理领域&#xff0c;选择合适的大数据平台是确…

有些硬盘录像机接入视频汇聚平台EasyCVR后通道不显示/显示不全,该如何处理?

EasyCVR视频监控汇聚管理平台是一款针对大中型项目设计的跨区域网络化视频监控集中管理平台。该平台不仅具备视频资源管理、设备管理、用户管理、运维管理和安全管理等功能&#xff0c;还支持多种主流标准协议&#xff0c;如GB28181、RTSP/Onvif、RTMP、部标JT808、GA/T 1400协…

排序算法剖析

文章目录 排序算法浅谈参考资料评价指标可视化工具概览 插入排序折半插入排序希尔排序冒泡排序快速排序简单选择排序堆排序归并排序基数排序 排序算法浅谈 参考资料 数据结构与算法 评价指标 稳定性&#xff1a;两个相同的关键字排序过后相对位置不发生变化时间复杂度空间复…

数据挖掘-padans初步使用

目录标题 Jupyter Notebook安装启动 Pandas快速入门查看数据验证数据建立索引数据选取⚠️注意&#xff1a;排序分组聚合数据转换增加列绘图line 或 **&#xff08;默认&#xff09;&#xff1a;绘制折线图。bar&#xff1a;绘制条形图。barh&#xff1a;绘制水平条形图。hist&…

QT将QBytearray的data()指针赋值给结构体指针变量后数据不正确的问题

1、问题代码 #include <QCoreApplication>#pragma pack(push, 1) typedef struct {int a; // 4字节float b; // 4字节char c; // 1字节int *d; // 8字节 }testStruct; #pragma pack(pop)#include <QByteArray> #include <QDebug>int main() {testStruct …

leetcode练习 路径总和II

给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum 22 输出&a…

告别传统互动:AI数字人正全面进入人类社会

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 今天我们来聊聊AI数字人&#xff01; 当我…

全网最详细kubernetes中的资源

1、资源管理介绍 在kubernetes中&#xff0c;所有的内容都抽象为资源&#xff0c;用户需要通过操作资源来管理kubernetes。 kubernetes的本质上就是一个集群系统&#xff0c;用户可以在集群中部署各种服务。 所谓的部署服务&#xff0c;其实就是在kubernetes集群中运行一个个的…

C语言基础(7)之操作符(1)(详解)

目录 1. 各种操作符介绍 1.1 操作符汇总表 2. 移位操作符 2.1 移位操作符知识拓展 —— 原码、反码、补码 2.2 移位操作符讲解 2.2.1 右移操作符 ( >> ) 2.2.2 左移操作符 ( << ) 3. 位操作符 3.1 & (按位与) 3.2 | (按位或) 3.3 ^ (按位异或) 3.4…

gm/ID设计方法学习笔记(一)

前言&#xff1a;为什么需要gm/id &#xff08;一&#xff09;主流设计方法往往侧重于强反型区&#xff08;过驱>0.2V&#xff09;&#xff0c;低功耗设计则侧重于弱反型区&#xff08;<0&#xff09;&#xff0c;但现在缺乏对中反型区的简单和准确的手算模型。 1.对于…

10月2日笔记(内网资源探测篇)

内网资源探测 在内网渗透中&#xff0c;测试人员往往需要通过各种内网扫描技术来探测内网资源的情况&#xff0c;为后续的横向渗透做准备&#xff0c;通常需要发现内网存活的主机&#xff0c;并探测主机的操作系统、主机开放了哪些端口、端口上运行了哪些服务、服务的当前版本…

SQL SERVER 从嫌弃存储到爱上存储过程我给存储过程开发了版本控制工具和远程调试功能...

优缺点 SQL SERVER 爱上存储过程我给存储过程开发了版本控制工具和远程调试功能 先说说 存储过程的优缺点吧存储过程的优点 提高执行效率&#xff1a;存储过程是预编译的&#xff0c;执行速度较快&#xff0c;减少了网络传输量。 减少开发工作量&#xff1a;存储过程可以将复杂…

数据结构——对顺序线性表的操作

大家好啊&#xff0c;今天给大家分享一下对于顺序线性表的相关操作&#xff0c;跟随我的步伐来开始这一篇的学习吧&#xff01; 如果有知识性错误&#xff0c;欢迎各位指正&#xff01;&#xff01;一起加油&#xff01;&#xff01; 创作不易&#xff0c;希望大家多多支持哦…

中级软件设计师:一文搞懂下午第一题——数据流图技术

中级软件设计师&#xff1a;一文搞懂下午第一题——数据流图技术 0. 答题技巧-【11-12分】分必拿方法0. 本章的考点1. 数据流图的基本元素1.1 数据流1.2 加工1.3 数据存储(文件)1.4 外部实体1.5 分层数据流图&#xff08;DFD&#xff09;1.6 自顶至下&#xff0c;逐步精化1.6.1…

8645 归并排序(非递归算法)

### 思路 非递归归并排序通过逐步合并相邻的子数组来实现排序。每次合并后输出当前排序结果。 ### 伪代码 1. 读取输入的待排序关键字个数n。 2. 读取n个待排序关键字并存储在数组中。 3. 对数组进行非递归归并排序&#xff1a; - 初始化子数组的大小curr_size为1。 - 逐…

GO网络编程(二):客户端与服务端通信【重要】

本节是新知识&#xff0c;偏应用&#xff0c;需要反复练习才能掌握。 目录 1.C/S通信示意图2.服务端通信3.客户端通信4.通信测试5.进阶练习&#xff1a;客户端之间通信 1.C/S通信示意图 客户端与服务端通信的模式也称作C/S模式&#xff0c;流程图如下 其中P是协程调度器。可…

使用VBA快速生成Excel工作表非连续列图片快照

Excel中示例数据如下图所示。 现在需要拷贝A2:A15,D2:D15,J2:J15,L2:L15,R2:R15为图片&#xff0c;然后粘贴到A18单元格&#xff0c;如下图所示。 大家都知道VBA中Range对象有CopyPicture方法可以拷贝为图片&#xff0c;但是如果Range对象为非连续区域&#xff0c;那么将产生10…