上一篇
场景引入:
凌晨3点,你被报警短信惊醒——数据库磁盘爆了!📉 排查发现某张日志表堆积了2TB无用数据,而业务系统还在拼命写入…别慌!这篇「从删库到跑路」的安全操作手册🚀,教你用MySQL删除语句精准清理数据,甚至还能用分区表优雅"断舍离"!
-- 删除user表中未激活的用户(记得先SELECT验证条件!) DELETE FROM user WHERE status = 'inactive';
⚠️ 血泪教训:没加WHERE条件的DELETE会清空整张表!建议先用事务测试:
BEGIN; DELETE FROM user WHERE status = 'inactive' LIMIT 10; -- 先删10条试水 ROLLBACK; -- 确认无误后改为COMMIT;
当需要根据另一张表条件删除时:
-- 删除30天未登录的订单(结合login_log表判断) DELETE orders FROM orders LEFT JOIN login_log ON orders.user_id = login_log.user_id WHERE login_log.last_login < DATE_SUB(NOW(), INTERVAL 30 DAY);
🚀 大批量删除建议分批次执行(避免锁表太久):
DELETE FROM audit_log WHERE created_at < '2025-01-01' LIMIT 10000; -- 每次删1万条
💡 更高效的做法:用WHERE id > ? ORDER BY id LIMIT 10000
利用索引加速
SHOW CREATE TABLE sensor_data; -- 确认分区键 SELECT * FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 'sensor_data';
-- 删除2024年的数据(假设按RANGE分区) ALTER TABLE sensor_data DROP PARTITION p2024;
📌 注意:
-- 为时间分区表追加2025年Q3分区 ALTER TABLE sensor_data ADD PARTITION ( PARTITION p2025q3 VALUES LESS THAN ('2025-10-01') );
-- 步骤1:将旧数据迁移到归档表 INSERT INTO audit_log_archive SELECT * FROM audit_log WHERE created_at < '2025-01-01'; -- 步骤2:删除原表数据(可分批执行) DELETE FROM audit_log WHERE created_at < '2025-01-01';
-- 1. 创建新表(仅保留需要的数据) CREATE TABLE audit_log_new AS SELECT * FROM audit_log WHERE created_at >= '2025-01-01'; -- 2. 原子切换表(业务几乎无感知) RENAME TABLE audit_log TO audit_log_old, audit_log_new TO audit_log; -- 3. 后续慢慢清理旧表 DROP TABLE audit_log_old;
mysqldump
或SELECT INTO OUTFILE
SHOW PROCESSLIST
查看阻塞情况 OPTIMIZE TABLE
释放磁盘空间(注意锁表) DELETE
权限而非DROP
:
DELETE + LIMIT
📉 下次遇到磁盘报警,终于可以淡定地喝口咖啡说:"问题不大,看我精准删除!" ☕
(本文操作基于MySQL 8.0版本验证,2025-08最新实践)
本文由 邵新柔 于2025-08-01发表在【云服务器提供商】,文中图片由(邵新柔)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/503457.html
发表评论