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