3 changed files with 147 additions and 1 deletions
@ -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语句中的条件判断 |
|||
- **保留策略**:修改历史记录的保留逻辑 |
|||
@ -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(); |
|||
Loading…
Reference in new issue