extmail自己在用,发现错误:
Apr 10 07:03:19 mail dspam[1468]: query error: Duplicate entry '1-2288815384906775934' for key 'id_token_data_01': see sql.errors for more details
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” 错误!
度娘居然没有给我什么帮助,还是自己想的办法,其实很简单,就是mysql中dspam库的dspam_token_data表文件中token字段记录有重复数据,怎么折腾都白搭,正确的处理方法是:
第一种方法(原有数据不保留了):先stop掉dspamd服务,service dspamd stop,然后清空
dspam_token_data的所有数据(我用Navicat for mysql 图形界面做到的),然后在该表上做一个token字段的主键(主键就不会再重复了)。然后重启服务即可。
第二种方法(保留表里原有数据,想办法去掉重复的,然后见token设置成主键):先stop掉dspamd服务,将dspam_token_data导出成“,”分割的txt文件,然后导入到excel,注意将token字段定义成文本格式,否则那数据末尾全部变成0000了(这就是为什么要导出文本,而不导出成excel),可以用excel中“数据”-->“删除重复数据”来清楚重复内容,再将mysql中dspam_token_data表清空,导入这些处理完的数据,恢复dspamd服务,错误没了!
第三种方法,野蛮法,进入mysql命令行:
use dspam;
delete dspam_token_data from dspam_token_data,(select token from dspam_token_data group by token having count(token) > 1) as t2 where dspam_token_data.token=t2.token;
直接删除重复数据。
还是需要最后搞一下:
/usr/bin/myisamchk -r /var/lib/mysql/dspam/dspam_token_data.MYI
有时候有人搞3下:
/usr/bin/myisamchk -of /var/lib/mysql/dspam/dspam_token_data.MYI
/usr/bin/myisamchk -r /var/lib/mysql/dspam/dspam_token_data.MYI
/usr/bin/myisamchk -safe -recover /var/lib/mysql/dspam/dspam_token_data.MYI
好像只有这样好使:在linux终端中,进入mysql>命令行,执行
repair table dspam_token_data;
搞定。
zoux> mysql -u root -p
mysql> use dspam;
mysql>repair table dspam_token_data;
亡羊补牢呀,根本问题解决不了,几分钟马上就出来Duplicate key记录了,只好写到crontab里了:
1. 编辑文件:vi /root/mysql_repair.sql
use dspam;
repair table dspam_token_data;
2. crontab -e 加入:5分钟搞一次!
*/3 * * * * /usr/bin/mysql -u dspam -p'dspam' dspam < /root/mysql_repair.sql
也不知道这和/usr/bin/myisamchk -r /var/lib/mysql/dspam/dspam_token_data.MYI是不是一回事!
-------------------------
基本稳定了,我已经关掉
/usr/bin/myisamchk -r /var/lib/mysql/dspam/dspam_token_data.MYI,这没用,
真正有效的是*/3 * * * * /usr/bin/mysql -u dspam -p'dspam' dspam < /root/mysql_repair.sql,确实解决问题。
不过,我这么做只是投机取巧,真正解决问题应该是dspam内部如何在写入dspam_token_data库时,检查是否重复。
这个问题暂时这么样了!
阅读(2336) | 评论(3) | 转发(0) |