Browse Source

添加数据清理功能,包括清理脚本、执行命令和使用指南

master
Default User 1 week ago
parent
commit
6b1865f8b5
  1. 83
      CLEANUP_GUIDE.md
  2. 62
      cleanup.js
  3. 3
      package.json

83
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语句中的条件判断
- **保留策略**:修改历史记录的保留逻辑

62
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();

3
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": "",

Loading…
Cancel
Save