# mysql-batch-delete **Repository Path**: developerhonor/mysql-batch-delete ## Basic Information - **Project Name**: mysql-batch-delete - **Description**: Batch delete data from MySQL database securely - **Primary Language**: Shell - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-17 - **Last Updated**: 2026-07-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MySQL BatchDelete (批量删除脚本) 项目用于安全、可配置地在 MySQL 中批量删除数据,适用于需要按规则清理历史数据或敏感数据的运维场景。 **主要脚本与目录** - `security_delete_data.sh`: 项目主入口,负责解析参数并调用删除逻辑。 - `config/`: 存放配置文件(数据库连接、删除条件等)。 - `lib/`: 脚本库,包含 `args_parser.sh`、`config_parser.sh`、`deleter.sh`、`helpers.sh`、`logger.sh`、`mysql_connector.sh`、`progress.sh`、`validator.sh` 等模块化脚本。 - `README.md`: 本文件,包含使用说明与安全注意事项。 **功能** - 可配置的删除条件 - 日志与进度反馈,方便审计与排查。 - 模块化的设计,便于扩展与复用。 **先决条件** - 已安装 MySQL 客户端(`mysql`),并能通过命令行连接目标数据库 **配置说明** 1. 编辑 `config` 配置文件,填写目标数据库连接信息、要删除的表/条件等。 **运行示例** 在做好配置并做好备份后,默认): ```bash # 查看帮助/用法 ./security_delete_data.sh --help # 默认执行 `dryrun`模式,即不实际删除 ./security_delete_data.sh --password=xxxxxx # 执行删除 ./security_delete_data.sh --password=xxxxxx --run ``` **删除示例** ``` # 配置文件配置删除对象及范围和每批次删除数量 # 删除区间配置 [range] # ID 模式 # 在 condition_type 为id模式下,起始的 id 请根据实际要删除的范围起点填写 start_id = 1 # 结束的 id 请根据实际要删除的范围终点填写 end_id = 300000 # 批次控制配置 [batch] # 每次删除的数量,如果是ID,则表示每次删除的ID数量;如果是TIME,则表示每次删除的时间跨度(单位:秒),3600秒为1小时,即按照每小时为一个批次删除 # 1小时=3600秒,7200秒=2小时,3小时=10800秒,4小时=14400秒,5小时=18000秒,6小时=21600秒,7小时=25200秒,8小时=28800秒 # 9小时=32400秒,10小时=36000秒,11小时=39600秒,12小时=43200秒,13小时=46800秒,14小时=50400秒,15小时=54000秒,16小时=57600秒 # 17小时=61200秒,18小时=64800秒,19小时=68400秒,20小时=72000秒,21小时=75600秒,22小时=79200秒,23小时=82800秒,24小时=86400秒 size = 20000 # 执行dryrun ./security_delete_data.sh --password=xxxxxx [INFO] 2026-07-17 10:50:03 ----------------------------------------------------------------------- [INFO] 2026-07-17 10:50:03 批量安全删除脚本启动 [INFO] 2026-07-17 10:50:03 脚本目录: /opt/BatchSecureDelete [INFO] 2026-07-17 10:50:03 配置文件: /opt/BatchSecureDelete/config [INFO] 2026-07-17 10:50:03 日志文件: /tmp/delete_20260717.log [INFO] 2026-07-17 10:50:03 运行模式: dryrun [INFO] 2026-07-17 10:50:03 ----------------------------------------------------------------------- [INFO] 2026-07-17 10:50:03 加载配置文件: /opt/BatchSecureDelete/config [INFO] 2026-07-17 10:50:03 数据库连接成功: 172.30.31.118:3306/db_test [INFO] 2026-07-17 10:50:03 配置验证通过 [INFO] 2026-07-17 10:50:03 未检测到进度文件,从初始位置 [1] 开始 [INFO] 2026-07-17 10:50:03 运行模式: dryrun [INFO] 2026-07-17 10:50:03 数据库: 172.30.31.118:3306/db_test [INFO] 2026-07-17 10:50:03 目标表: tab_test [INFO] 2026-07-17 10:50:03 条件字段: id [INFO] 2026-07-17 10:50:03 条件类型: id [INFO] 2026-07-17 10:50:03 批次大小: 20000 [INFO] 2026-07-17 10:50:03 批次间隔: 0.2s [INFO] 2026-07-17 10:50:03 进度文件: /tmp/delete_progress_tab_test.txt [INFO] 2026-07-17 10:50:03 当前进度: 1 [INFO] 2026-07-17 10:50:03 [DryRun] SQL: DELETE FROM tab_test WHERE id >= 1 AND id < 20001; [INFO] 2026-07-17 10:50:03 [DryRun] SQL: DELETE FROM tab_test WHERE id >= 20001 AND id < 40001; [INFO] 2026-07-17 10:50:03 [DryRun] SQL: DELETE FROM tab_test WHERE id >= 40001 AND id < 60001; [INFO] 2026-07-17 10:50:04 [DryRun] SQL: DELETE FROM tab_test WHERE id >= 60001 AND id < 80001; [INFO] 2026-07-17 10:50:04 [DryRun] SQL: DELETE FROM tab_test WHERE id >= 80001 AND id < 100001; [INFO] 2026-07-17 10:50:04 [DryRun] SQL: DELETE FROM tab_test WHERE id >= 100001 AND id < 120001; [INFO] 2026-07-17 10:50:04 [DryRun] SQL: DELETE FROM tab_test WHERE id >= 120001 AND id < 140001; [INFO] 2026-07-17 10:50:04 [DryRun] SQL: DELETE FROM tab_test WHERE id >= 140001 AND id < 160001; [INFO] 2026-07-17 10:50:05 [DryRun] SQL: DELETE FROM tab_test WHERE id >= 160001 AND id < 180001; [INFO] 2026-07-17 10:50:05 [DryRun] SQL: DELETE FROM tab_test WHERE id >= 180001 AND id < 200001; [INFO] 2026-07-17 10:50:05 [DryRun] SQL: DELETE FROM tab_test WHERE id >= 200001 AND id < 220001; [INFO] 2026-07-17 10:50:05 [DryRun] SQL: DELETE FROM tab_test WHERE id >= 220001 AND id < 240001; [INFO] 2026-07-17 10:50:05 [DryRun] SQL: DELETE FROM tab_test WHERE id >= 240001 AND id < 260001; [INFO] 2026-07-17 10:50:06 [DryRun] SQL: DELETE FROM tab_test WHERE id >= 260001 AND id < 280001; [INFO] 2026-07-17 10:50:06 [DryRun] SQL: DELETE FROM tab_test WHERE id >= 280001 AND id < 300000; [INFO] 2026-07-17 10:50:06 ID 已达到终点 (300000),删除完成 [INFO] 2026-07-17 10:50:06 任务结束。总删除行数: 0 [INFO] 2026-07-17 10:50:06 ----------------------------------------------------------------------- [INFO] 2026-07-17 10:50:06 删除完成,执行以下 SQL 以优化表性能和释放空间 [INFO] 2026-07-17 10:50:06 ANALYZE TABLE db_test.tab_test; [INFO] 2026-07-17 10:50:06 OPTIMIZE TABLE db_test.tab_test; [INFO] 2026-07-17 10:50:06 ----------------------------------------------------------------------- # 正式删除,删除前请手动清理一下日志文件 log目录/delete_*,然后执行删除 ./security_delete_data.sh --password=xxxxxx --run [INFO] 2026-07-17 10:51:07 ----------------------------------------------------------------------- [INFO] 2026-07-17 10:51:07 批量安全删除脚本启动 [INFO] 2026-07-17 10:51:07 脚本目录: /opt/BatchSecureDelete [INFO] 2026-07-17 10:51:07 配置文件: /opt/BatchSecureDelete/config [INFO] 2026-07-17 10:51:07 日志文件: /tmp/delete_20260717.log [INFO] 2026-07-17 10:51:07 运行模式: run [INFO] 2026-07-17 10:51:07 ----------------------------------------------------------------------- [INFO] 2026-07-17 10:51:07 加载配置文件: /opt/BatchSecureDelete/config [INFO] 2026-07-17 10:51:07 数据库连接成功: 172.30.31.118:3306/db_test [INFO] 2026-07-17 10:51:07 配置验证通过 [INFO] 2026-07-17 10:51:07 未检测到进度文件,从初始位置 [1] 开始 [INFO] 2026-07-17 10:51:07 运行模式: run [INFO] 2026-07-17 10:51:07 数据库: 172.30.31.118:3306/db_test [INFO] 2026-07-17 10:51:07 目标表: tab_test [INFO] 2026-07-17 10:51:07 条件字段: id [INFO] 2026-07-17 10:51:07 条件类型: id [INFO] 2026-07-17 10:51:07 批次大小: 20000 [INFO] 2026-07-17 10:51:07 批次间隔: 0.2s [INFO] 2026-07-17 10:51:07 进度文件: /tmp/delete_progress_tab_test.txt [INFO] 2026-07-17 10:51:07 当前进度: 1 [INFO] 2026-07-17 10:51:07 [1, 20001): 本批 20000 行 | 累计 20000 行 [INFO] 2026-07-17 10:51:07 [20001, 40001): 本批 20000 行 | 累计 40000 行 [INFO] 2026-07-17 10:51:07 [40001, 60001): 本批 20000 行 | 累计 60000 行 [INFO] 2026-07-17 10:51:08 [60001, 80001): 本批 20000 行 | 累计 80000 行 [INFO] 2026-07-17 10:51:08 [80001, 100001): 本批 20000 行 | 累计 100000 行 [INFO] 2026-07-17 10:51:08 [100001, 120001): 本批 20000 行 | 累计 120000 行 [INFO] 2026-07-17 10:51:08 [120001, 140001): 本批 20000 行 | 累计 140000 行 [INFO] 2026-07-17 10:51:09 [140001, 160001): 本批 20000 行 | 累计 160000 行 [INFO] 2026-07-17 10:51:09 [160001, 180001): 本批 20000 行 | 累计 180000 行 [INFO] 2026-07-17 10:51:09 [180001, 200001): 本批 20000 行 | 累计 200000 行 [INFO] 2026-07-17 10:51:09 [200001, 220001): 本批 20000 行 | 累计 220000 行 [INFO] 2026-07-17 10:51:10 [220001, 240001): 本批 20000 行 | 累计 240000 行 [INFO] 2026-07-17 10:51:10 [240001, 260001): 本批 20000 行 | 累计 260000 行 [INFO] 2026-07-17 10:51:10 [260001, 280001): 本批 20000 行 | 累计 280000 行 [INFO] 2026-07-17 10:51:10 [280001, 300000): 本批 19999 行 | 累计 299999 行 [INFO] 2026-07-17 10:51:11 ID 已达到终点 (300000),删除完成 [INFO] 2026-07-17 10:51:11 进度文件已清理 [INFO] 2026-07-17 10:51:11 任务结束。总删除行数: 299999 [INFO] 2026-07-17 10:51:11 ----------------------------------------------------------------------- [INFO] 2026-07-17 10:51:11 删除完成,执行以下 SQL 以优化表性能和释放空间 [INFO] 2026-07-17 10:51:11 ANALYZE TABLE db_test.tab_test; [INFO] 2026-07-17 10:51:11 OPTIMIZE TABLE db_test.tab_test; [INFO] 2026-07-17 10:51:11 ------------------------------------------------ # 执行表优化 mysql> ANALYZE TABLE db_test.tab_test; +------------------+---------+----------+----------+ | Table | Op | Msg_type | Msg_text | +------------------+---------+----------+----------+ | db_test.tab_test | analyze | status | OK | +------------------+---------+----------+----------+ 1 row in set (0.03 sec) # 执行表重组 mysql> OPTIMIZE TABLE db_test.tab_test; +------------------+----------+----------+-------------------------------------------------------------------+ | Table | Op | Msg_type | Msg_text | +------------------+----------+----------+-------------------------------------------------------------------+ | db_test.tab_test | optimize | note | Table does not support optimize, doing recreate + analyze instead | | db_test.tab_test | optimize | status | OK | +------------------+----------+----------+-------------------------------------------------------------------+ 2 rows in set (2.88 sec) ``` **安全与注意事项** - 建议在执行删除前做好数据库备份。 - 先在测试或预发布环境验证删除规则,确认无误后再在生产执行。 - 可用`dryrun`模式验证输出的`DELETE`范围是否符合删除条件