服務器意外重啓後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裏的數據順利恢復,也能正常連接了。

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