From 6b1865f8b55e748afd119d76bed8c968ee7f35a9 Mon Sep 17 00:00:00 2001 From: Default User Date: Tue, 24 Feb 2026 15:34:19 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=95=B0=E6=8D=AE=E6=B8=85?= =?UTF-8?q?=E7=90=86=E5=8A=9F=E8=83=BD=EF=BC=8C=E5=8C=85=E6=8B=AC=E6=B8=85?= =?UTF-8?q?=E7=90=86=E8=84=9A=E6=9C=AC=E3=80=81=E6=89=A7=E8=A1=8C=E5=91=BD?= =?UTF-8?q?=E4=BB=A4=E5=92=8C=E4=BD=BF=E7=94=A8=E6=8C=87=E5=8D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CLEANUP_GUIDE.md | 83 ++++++++++++++++++++++++++++++++++++++++++++++++ cleanup.js | 62 ++++++++++++++++++++++++++++++++++++ package.json | 3 +- 3 files changed, 147 insertions(+), 1 deletion(-) create mode 100644 CLEANUP_GUIDE.md create mode 100644 cleanup.js diff --git a/CLEANUP_GUIDE.md b/CLEANUP_GUIDE.md new file mode 100644 index 0000000..971769e --- /dev/null +++ b/CLEANUP_GUIDE.md @@ -0,0 +1,83 @@ +# 数据清理指南 + +本指南说明如何使用数据清理脚本,定期删除过期的临时数据。 + +## 清理功能 + +1. **自动清理15天前的未完成记录**:删除超过15天且没有签名的临时记录 +2. **优化历史记录**:对于每个sessionId,只保留最新的记录,删除更早的历史记录 + +## 使用方法 + +### 手动执行清理 + +在项目根目录下执行: + +```bash +# 使用npm命令执行 +npm run cleanup + +# 或直接使用node命令执行 +node cleanup.js +``` + +### 设置定时任务 + +#### Windows系统 + +1. 打开**任务计划程序** +2. 点击**创建基本任务** +3. 设置任务名称(如"清理合格证过期数据") +4. 设置触发器为**每天**或**每周** +5. 设置操作为**启动程序** +6. 程序/脚本:`node.exe` +7. 添加参数:`cleanup.js` +8. 起始于:项目根目录(如`D:\xt\hgzxx`) +9. 完成向导并启用任务 + +#### Linux系统 + +使用cron定时任务: + +```bash +# 编辑crontab +crontab -e + +# 添加每天凌晨执行的任务 +0 0 * * * cd /path/to/hgzxx && node cleanup.js >> cleanup.log 2>&1 +``` + +#### macOS系统 + +使用launchd或cron: + +```bash +# 使用cron +crontab -e + +# 添加每天凌晨执行的任务 +0 0 * * * cd /path/to/hgzxx && node cleanup.js >> cleanup.log 2>&1 +``` + +## 清理效果 + +执行清理后,系统会: +- 删除15天前的未完成记录(无签名) +- 保留每个sessionId的最新记录,删除历史记录 +- 保持数据库的健康状态 +- 提高查询性能 + +## 注意事项 + +1. **数据安全**:清理操作是不可逆的,请确保理解清理逻辑后再执行 +2. **执行时机**:建议在系统低峰期执行清理操作 +3. **日志记录**:执行结果会输出到控制台,建议配置日志文件以便查看 +4. **备份**:定期对数据库进行备份,以防止意外情况 + +## 定制清理策略 + +如需调整清理策略,可修改`cleanup.js`文件中的以下参数: + +- **清理天数**:修改`INTERVAL 15 DAY`中的数字 +- **清理条件**:调整SQL语句中的条件判断 +- **保留策略**:修改历史记录的保留逻辑 diff --git a/cleanup.js b/cleanup.js new file mode 100644 index 0000000..f473374 --- /dev/null +++ b/cleanup.js @@ -0,0 +1,62 @@ +const mysql = require('mysql2/promise'); + +// 数据库配置 +const dbConfig = { + host: process.env.DB_HOST || '1.95.162.61', + user: process.env.DB_USER || 'root', + password: process.env.DB_PASSWORD || 'schl@2025', + database: process.env.DB_NAME || 'wechat_app', + waitForConnections: true, + connectionLimit: 10, + queueLimit: 0 +}; + +// 创建数据库连接池 +const pool = mysql.createPool(dbConfig); + +// 清理过期数据的函数 +async function cleanupExpiredData() { + try { + console.log('开始清理过期数据...'); + + // 连接到数据库 + const connection = await pool.getConnection(); + + try { + // 1. 删除15天前的未完成记录(无签名) + const [result1] = await connection.execute( + 'DELETE FROM certificate WHERE issueDate < DATE_SUB(NOW(), INTERVAL 15 DAY) AND signature IS NULL' + ); + + console.log(`清理了 ${result1.affectedRows} 条15天前的未完成记录`); + + // 2. 对于每个sessionId,只保留最新的记录,删除更早的记录 + // 注意:这个操作会删除每个sessionId的历史记录,只保留最新的一条 + const cleanupHistorySql = ` + DELETE c1 FROM certificate c1 + JOIN ( + SELECT sessionId, MAX(id) as max_id + FROM certificate + GROUP BY sessionId + HAVING COUNT(*) > 1 + ) c2 ON c1.sessionId = c2.sessionId AND c1.id < c2.max_id + `; + + const [result2] = await connection.execute(cleanupHistorySql); + console.log(`清理了 ${result2.affectedRows} 条历史记录,每个sessionId只保留最新记录`); + + console.log('数据清理完成!'); + } finally { + // 释放连接 + connection.release(); + } + } catch (error) { + console.error('清理数据时出错:', error.message); + } finally { + // 关闭连接池 + await pool.end(); + } +} + +// 执行清理操作 +cleanupExpiredData(); diff --git a/package.json b/package.json index f4845c7..a6a660f 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,8 @@ "description": "", "main": "index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "echo \"Error: no test specified\" && exit 1", + "cleanup": "node cleanup.js" }, "keywords": [], "author": "",