Mysql历史数据删除

文章讲述了运维中遇到的问题,即如何通过truncate、drop和delete三种方式清理MySQL中的大表数据。truncate虽能快速删除但需配合optimize释放空间,而drop速度快但会删除表结构;delete执行慢,可选择性删除数据。同时提到truncate会重置自增列值。

一、数据清理(truncate方式)

收到运维同事提示,有台机器磁盘使用率过高
在这里插入图片描述
查看之后发现是数据库文件过大,磁盘本身500g,数据库单表文件占用300多g
在这里插入图片描述

表中存了一些历史数据,历史数据可以删除了,于是执行
truncate table XXX 删除表数据。
表数据删除后,本以为完事了,查询了一下磁盘使用率,发现使用率并没有降下来。
看了一下,表对应的ibd文件并没有变化。
于是再次执行
optimize table XXX
才将表空间释放。
在这里插入图片描述

二、MySQL数据清理方式

MySQL数据清理有三种方式
drop:DDL 语句,执行速度最快,全量删除表数据;除此之外,还会删除表结构以及表的索引、约束和触发器(如果表还在使用不要使用该命令)。
truncate:DDL 语句,执行速度较快,全量删除表数据,表结构以及表的索引、约束和触发器保留;需要配合optimize 命令来进一步优化磁盘空间(有一定执行时间,需考虑对业务影响)
delete: DML 语句,执行速度最慢,但是可以选择性删除部分数据,表结构以及表的索引、约束和触发器保留。
truncate与delete区别:
truncate 表数据全部清空,会重置自增列为 1,而 delete 就算全部清空数据,也不会重置自增列。

清理 MySQL 数据库中的历史数据通常涉及几个关键步骤,具体取决于数据库的结构、表的设计以及数据保留策略。以下是一些常见的方法和建议: ### 1. 删除特定时间段之前的数据 如果历史数据具有时间戳字段(如 `created_at` 或 `updated_at`),可以通过 SQL 语句删除指定时间点之前的数据。例如,删除 `logs` 表中一年前的数据: ```sql DELETE FROM logs WHERE created_at < DATE_SUB(NOW(), INTERVAL 1 YEAR); ``` 执行此类操作时,应确保不会对生产环境造成影响,最好在低峰期进行。 ### 2. 使用分区表 对于大型表,使用 **MySQL 分区功能** 可以显著提高性能并简化数据管理。将表按时间范围分区后,可以直接删除整个分区来快速清除历史数据: ```sql ALTER TABLE logs DROP PARTITION p2023; ``` 这种方式比逐行删除更高效,并且可以减少锁表时间[^1]。 ### 3. 清理二进制日志文件 MySQL 的二进制日志文件(`mysql-bin.*`)用于主从复制和恢复操作。如果不考虑恢复历史数据,可以使用以下命令清空这些文件: ```sql RESET MASTER; ``` 此操作会删除所有现有的二进制日志文件,并重置日志索引文件。不建议直接使用 `rm` 命令删除这些文件,因为这可能导致数据库状态不一致。 ### 4. 使用事件调度器自动清理 MySQL 提供了 **事件调度器(Event Scheduler)**,可以设置定时任务定期清理历史数据。例如,创建一个每天凌晨执行的事件: ```sql CREATE EVENT IF NOT EXISTS purge_old_logs ON SCHEDULE EVERY 1 DAY STARTS TIMESTAMP(CURRENT_DATE, '02:00:00') DO DELETE FROM logs WHERE created_at < DATE_SUB(NOW(), INTERVAL 1 YEAR); ``` 此方法可实现自动化维护,减少人工干预。 ### 5. 外键约束与级联删除 如果历史数据分布在多个相关表中,应确保外键约束正确配置,并考虑使用 `ON DELETE CASCADE` 来自动删除关联记录。这样可以在删除主表记录时,自动清理子表中的相关数据。 ### 6. 备份与磁盘空间管理 在执行大规模删除操作之前,务必确保有足够的磁盘空间进行备份。如果出现磁盘空间不足的情况(如 `mysqldump: Got errno 28 on write`),应先清理目标目录或扩展存储容量,再进行导出操作[^2]。 ### 7. 使用归档引擎 对于需要长期保留但不再频繁访问的历史数据,可以考虑使用 **ARCHIVE 存储引擎** 或将其迁移到单独的归档数据库中,以减少主数据库的负担。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值