服务器意外重启后redis启动失败或无法连接的问题解决办法

今天开发服务器因机房断电重启了,然后发现所有的PHP接口都报错:

session_write_close(): Failed to write session data using user defined save handler. (session.save_path...

但实际上我们一直是用redis来保存Session信息的,道理上不会用到这个save_path的配置项,在配置没改过的情况下报这个错,初步判断应该是redis服务器出了问题(redis服务器是在另一台机子上的),因为redis连不上所以框架自动切换到了使用文件系统存储Session的第二选项,所以根源还是在redis服务器上

用Redis的客户端工具(Redis Desktop Manager)尝试连接redis服务器,连接被拒绝了,看来确实是redis服务的问题,于是ssh连接上了redis服务器,用sytemctl status redis查看了状态,Active那里是绿色的,显示的是:Active: active(exited),貌似没问题(这里有坑,其实状态是不正常的,但因为之前没留意正常的状态是怎样的,以为绿色就是正常的,所以没及时发现这个问题,下面会具体说明情况),如下图所示:
运行结果
,但为什么连不上呢?

于是打算去看看redis的日志,如果你不知道日志保存的路径,可以去配置文件里面看,属性名是logfile,打开日志后确实看到了一个报错:Bad file format reading the append only file: make a backup of your AOF file, then use ./redis-check-aof --fix <filename>,看来是aof文件在意外断电时文件格式被损坏了,如果不知道redis-check-aof命令在哪里,可以通过whereis redis-check-aof查找,找到后复制下这个目录,然后进入到aof文件所在目录,执行命令将文件修复,如我执行的命令是这样的:/usr/local/bin/redis-check-aof --f appendonly.aof

接下来重启redis,本来以为能顺利连上了,但仍然连接失败,但有个变化是redis的日志里没有出现aof格式错误的记录了,于是用systemctl status redis看了一下redis的状态,显示的仍然是Active:active(exited),想了一下,这个exited可能是不正常的,于是找了另外一台装了redis的机子并正常运行的机子执行这个命令看了一下,原来active(running)才是正常的,如下图所示:
运行正常
在网上搜索了一下,这个问题将pid文件删掉,找到原来的进程杀死后再重新启动就行了,操作命令如下:

#删除pid文件

  cd /var/run

  rm redis_6379.pid 

#删除dump.rdb(内存快照)文件

  cd /var/lib/redis/6379

  mv dump.rdb dump.rdb_bak

#之后查看是否还有redis服务启动

  ps -ef |grep redis

  kill -9 进程id(如有)

  systemctl start redis

至此,原来redis里的数据顺利恢复,也能正常连接了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章