在 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 字段本應唯一,但因歷史數據遷移、並發寫入或索引損壞導致出現重複值,致使主鍵/唯一索引約束失效。
service dspamd stopTRUNCATE TABLE dspam_token_data;ALTER TABLE dspam_token_data ADD PRIMARY KEY (token);service dspamd start適用於初次部署或可容忍重新學習垃圾郵件特徵的場景。
service dspamd stopSELECT * FROM dspam_token_data INTO OUTFILE '/tmp/tokens.txt' FIELDS TERMINATED BY ',';token 列為文本格式(防止科學計數法截斷)→ 數據 → 刪除重複值 → 導出 CSVTRUNCATE TABLE dspam_token_data; LOAD DATA INFILE '/tmp/tokens_clean.txt' INTO TABLE dspam_token_data FIELDS TERMINATED BY ',';ALTER TABLE dspam_token_data ADD PRIMARY KEY (token);OPTIMIZE TABLE 碎片整理,並監控表大小防止磁盘耗盡。