Sphinx某些时候会找不到搜索结果,使用seach命令进行搜索时发现有如下错误:
index 'xxx': search error: failed to open path/data/html/index/xxx.sph: No such file or directory
到该目录下发现出现很多名为xxx.new.sph, xxx.new.spa, xxx.new.spm等文件,而sphinx配置文件中写的索引路径为path/var/data/xxx。
可以确定是search寻找的是xxx.sph文件,而indexer或searchd将索引文件命名为xxx.new.sph造成无法检索。
这个问题出现的原因和indexer rotate工作方式有关,原因如下:
indexer(建立索引)向searchd(服务进程)发送SIGHUP信号(SIGHUP和控制台有关,一般情况下退出进程),然后searchd做以下动作后才退出:
1)等待所有子进程都退出
2)重命名当前的索引文件为.old
3)重命名.new索引文件为当前的文件
4)尝试加载当前的索引文件
5)如果失败,searchd就会从.old回滚到当前文件,新文件回滚到.new
所以,一般在这种情况下,我们会发现索引文件和索引文件.new并存的情况出现。引起这种问题也有可能是内存问题,目前我还没有找到证明是内存问题的证据,以后跟踪。
解决办法:从
这里看到
1)searchd --stop # 先停掉searchd,注意如果采用kill的方式,要保证searchd.pid文件的一致性
2)index --all # 重建所有索引,可以看到xxx.sph文件又回来了
3)searchd # 启动searchd服务
4)index --all --rotate # 试试用rotate命令重建索引
大多数时候,重新建立索引,或者重启sphinx是可以解决掉new文件的,可是我无论怎么重建索引,重启sphinx都不能去掉new文件,下面的办法可以解决这个“老顽固”,比如我们假设名字为a的sphinx文件不正常,
1)删除老new文件,即:
rm -f a.new.*
2)重新建立sphinx索引,也即:
path/bin/inder -c path/etc/sphinx.conf --rotate
这时候会产生新的new sphinx文件
3)重命名老文件(以防万一)
mv a.spa a.spa.bak
mv a.spd a.spd.bak
mv a.sph a.sph.bak
mv a.spi a.spi.bak
mv a.spl a.spl.bak
mv a.spm a.spm.bak
mv a.spp a.spp.bak
4)重命名新文件
mv a.new.spa a.spa
mv a.new.spd a.spd
mv a.new.sph a.sph
mv a.new.spi a.spi
mv a.new.spm a.spm
mv a.new.spp a.spp
5)重启sphinx
searchd --stop #关闭
searchd -c sphinx.conf #启动
阅读(3090) | 评论(0) | 转发(0) |