You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

62 lines
1.9 KiB

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