首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Dspam 運維避坑指南:Duplicate entry 錯誤與 Incorrect key file 修復實戰

     編輯:Java 綜合教學

Dspam 運維避坑指南:Duplicate entry 錯誤與 Incorrect key file 修復實戰

在 Extmail 郵件系統中使用 Dspam 反垃圾模塊時,常遇到主鍵衝突導致服務中斷。本文記錄兩種徹底修復方案,針對 dspam_token_data 表的 token 字段重複數據問題。

錯誤現象

Apr 10 07:03:19 mail dspam[1468]: query error: Duplicate entry '1-2288815384906775934' for key 'id_token_data_01'
Apr 10 07:03:19 mail dspam[1468]: bailing on error -2
Apr 10 07:03:19 mail dspam[1468]: received invalid result (!DSR_ISSPAM && !DSR_ISINNOCENT): -2
Apr 10 07:03:19 mail dspam[1468]: process_message returned error -5. delivering.

伴隨 MySQL 報錯:Incorrect key file for table。

根因分析

dspam_token_data 表的 token 字段本應唯一,但因歷史數據遷移、並發寫入或索引損壞導致出現重複值,致使主鍵/唯一索引約束失效。

方案一:清空重建(不保留歷史數據)

  1. 停止服務:service dspamd stop
  2. 清空表數據:TRUNCATE TABLE dspam_token_data;
  3. 添加主鍵:ALTER TABLE dspam_token_data ADD PRIMARY KEY (token);
  4. 重啟服務:service dspamd start

適用於初次部署或可容忍重新學習垃圾郵件特徵的場景。

方案二:去重保留(保留歷史訓練數據)

  1. 停止服務:service dspamd stop
  2. 導出 CSV:SELECT * FROM dspam_token_data INTO OUTFILE '/tmp/tokens.txt' FIELDS TERMINATED BY ',';
  3. Excel 去重:導入 CSV → 設置 token 列為文本格式(防止科學計數法截斷)→ 數據 → 刪除重複值 → 導出 CSV
  4. 清空表並導入:TRUNCATE TABLE dspam_token_data; LOAD DATA INFILE '/tmp/tokens_clean.txt' INTO TABLE dspam_token_data FIELDS TERMINATED BY ',';
  5. 添加主鍵:ALTER TABLE dspam_token_data ADD PRIMARY KEY (token);
  6. 重啟服務

關鍵避坑提示

  • 務必將 token 列定義為文本,否則長數字尾部會變成 0000 導致去重失效。
  • 生產環境建議定期 OPTIMIZE TABLE 碎片整理,並監控表大小防止磁盘耗盡。
  • 長期方案:升級 Dspam 版本或遷移至 Rspamd,獲得更穩健的存儲引擎支援。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved